Coverage Report

Created: 2025-02-15 06:25

/src/wireshark/epan/dissectors/packet-scsi-smc.c
Line
Count
Source (jump to first uncovered line)
1
/* based on the SMC 3 standard */
2
/* packet-scsi-smc.c
3
 * Dissector for the SCSI SMC commandset
4
 * Extracted from packet-scsi.c
5
 *
6
 * Dinesh G Dutt (ddutt@cisco.com)
7
 * Ronnie sahlberg 2006
8
 *
9
 * Wireshark - Network traffic analyzer
10
 * By Gerald Combs <gerald@wireshark.org>
11
 * Copyright 2002 Gerald Combs
12
 *
13
 * SPDX-License-Identifier: GPL-2.0-or-later
14
 */
15
16
#include "config.h"
17
18
#include <epan/packet.h>
19
#include <epan/conversation.h>
20
#include "packet-scsi.h"
21
#include "packet-scsi-smc.h"
22
23
void proto_register_scsi_smc(void);
24
25
static int proto_scsi_smc;
26
int hf_scsi_smc_opcode;
27
static int hf_scsi_smc_mta;
28
static int hf_scsi_smc_sa;
29
static int hf_scsi_smc_da;
30
static int hf_scsi_smc_fda;
31
static int hf_scsi_smc_sda;
32
static int hf_scsi_smc_medium_flags;
33
static int hf_scsi_smc_inv1;
34
static int hf_scsi_smc_inv2;
35
static int hf_scsi_smc_range_flags;
36
static int hf_scsi_smc_fast;
37
static int hf_scsi_smc_range;
38
/* static int hf_scsi_smc_sea; */
39
static int hf_scsi_smc_num_elements;
40
static int hf_scsi_smc_invert;
41
static int hf_scsi_smc_ea;
42
static int hf_scsi_smc_action_code;
43
/* Generated from convert_proto_tree_add_text.pl */
44
static int hf_scsi_smc_allocation_length;
45
static int hf_scsi_smc_first_element_address_reported;
46
static int hf_scsi_smc_voltag;
47
static int hf_scsi_smc_element_descriptor_length;
48
static int hf_scsi_smc_byte_count_of_descriptor_data_available;
49
static int hf_scsi_smc_pvoltag;
50
static int hf_scsi_smc_code_set;
51
static int hf_scsi_smc_starting_element_address;
52
static int hf_scsi_smc_curdata;
53
static int hf_scsi_smc_element_type_code;
54
static int hf_scsi_smc_element_type_code_0F;
55
static int hf_scsi_smc_identifier;
56
static int hf_scsi_smc_vendor_specific_data;
57
static int hf_scsi_smc_source_storage_element_address;
58
static int hf_scsi_smc_number_of_elements_available;
59
static int hf_scsi_smc_identifier_type;
60
static int hf_scsi_smc_number_of_elements;
61
static int hf_scsi_smc_identifier_length;
62
static int hf_scsi_smc_scsi_bus_address;
63
static int hf_scsi_smc_byte_count_of_report_available;
64
static int hf_scsi_smc_cmc;
65
static int hf_scsi_smc_svalid;
66
static int hf_scsi_smc_avoltag;
67
static int hf_scsi_smc_access;
68
static int hf_scsi_smc_additional_sense_code_qualifier;
69
static int hf_scsi_smc_lu_valid;
70
static int hf_scsi_smc_dvcid;
71
static int hf_scsi_smc_except;
72
static int hf_scsi_smc_id_valid;
73
static int hf_scsi_smc_not_bus;
74
static int hf_scsi_smc_exenab;
75
static int hf_scsi_smc_lun;
76
static int hf_scsi_smc_inenab;
77
static int hf_scsi_smc_full;
78
static int hf_scsi_smc_impexp;
79
static int hf_scsi_smc_primary_vol_tag_id;
80
static int hf_scsi_smc_primary_vol_seq_num;
81
static int hf_scsi_smc_alternate_vol_tag_id;
82
static int hf_scsi_smc_alternate_vol_seq_num;
83
84
static int ett_scsi_exchange_medium;
85
static int ett_scsi_range;
86
static int ett_scsi_move;
87
88
static void
89
dissect_smc_exchangemedium (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
90
                    unsigned offset, bool isreq, bool iscdb,
91
                    unsigned payload_len _U_, scsi_task_data_t *cdata _U_)
92
0
{
93
0
    static int * const exchg_fields[] = {
94
0
        &hf_scsi_smc_inv1,
95
0
        &hf_scsi_smc_inv2,
96
0
        NULL
97
0
    };
98
99
0
    if (!tree)
100
0
        return;
101
102
0
    if (isreq && iscdb) {
103
0
        proto_tree_add_item (tree, hf_scsi_smc_mta, tvb, offset+1, 2, ENC_BIG_ENDIAN);
104
0
        proto_tree_add_item (tree, hf_scsi_smc_sa,  tvb, offset+3, 2, ENC_BIG_ENDIAN);
105
0
        proto_tree_add_item (tree, hf_scsi_smc_fda, tvb, offset+5, 2, ENC_BIG_ENDIAN);
106
0
        proto_tree_add_item (tree, hf_scsi_smc_sda, tvb, offset+7, 2, ENC_BIG_ENDIAN);
107
0
        proto_tree_add_bitmask(tree, tvb, offset+9, hf_scsi_smc_medium_flags,
108
0
            ett_scsi_exchange_medium, exchg_fields, ENC_BIG_ENDIAN);
109
0
        proto_tree_add_bitmask(tree, tvb, offset+10, hf_scsi_control,
110
0
            ett_scsi_control, cdb_control_fields, ENC_BIG_ENDIAN);
111
0
    }
112
0
}
113
114
static void
115
dissect_smc_position_to_element (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
116
                    unsigned offset, bool isreq, bool iscdb,
117
                    unsigned payload_len _U_, scsi_task_data_t *cdata _U_)
118
0
{
119
0
    static int * const pte_fields[] = {
120
0
        &hf_scsi_smc_invert,
121
0
        NULL
122
0
    };
123
124
0
    if (!tree)
125
0
        return;
126
127
0
    if (isreq && iscdb) {
128
0
        proto_tree_add_item (tree, hf_scsi_smc_mta, tvb, offset+1, 2, ENC_BIG_ENDIAN);
129
0
        proto_tree_add_item (tree, hf_scsi_smc_da,  tvb, offset+3, 2, ENC_BIG_ENDIAN);
130
0
        proto_tree_add_bitmask(tree, tvb, offset+7, hf_scsi_smc_medium_flags,
131
0
            ett_scsi_exchange_medium, pte_fields, ENC_BIG_ENDIAN);
132
0
        proto_tree_add_bitmask(tree, tvb, offset+8, hf_scsi_control,
133
0
            ett_scsi_control, cdb_control_fields, ENC_BIG_ENDIAN);
134
0
    }
135
0
}
136
137
static void
138
dissect_smc_initialize_element_status (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
139
                    unsigned offset, bool isreq, bool iscdb,
140
                    unsigned payload_len _U_, scsi_task_data_t *cdata _U_)
141
0
{
142
0
    if (!tree)
143
0
        return;
144
145
0
    if (isreq && iscdb) {
146
0
        proto_tree_add_bitmask(tree, tvb, offset+4, hf_scsi_control,
147
0
            ett_scsi_control, cdb_control_fields, ENC_BIG_ENDIAN);
148
0
    }
149
0
}
150
151
static void
152
dissect_smc_initialize_element_status_with_range (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
153
                    unsigned offset, bool isreq, bool iscdb,
154
                    unsigned payload_len _U_, scsi_task_data_t *cdata _U_)
155
0
{
156
0
    static int * const range_fields[] = {
157
0
        &hf_scsi_smc_fast,
158
0
        &hf_scsi_smc_range,
159
0
        NULL
160
0
    };
161
162
0
    if (!tree)
163
0
        return;
164
165
0
    if (isreq && iscdb) {
166
0
        proto_tree_add_bitmask(tree, tvb, offset, hf_scsi_smc_range_flags,
167
0
            ett_scsi_range, range_fields, ENC_BIG_ENDIAN);
168
0
        proto_tree_add_item (tree, hf_scsi_smc_sa,  tvb, offset+1, 2, ENC_BIG_ENDIAN);
169
0
        proto_tree_add_item (tree, hf_scsi_smc_num_elements,  tvb, offset+5, 2, ENC_BIG_ENDIAN);
170
0
        proto_tree_add_bitmask(tree, tvb, offset+8, hf_scsi_control,
171
0
            ett_scsi_control, cdb_control_fields, ENC_BIG_ENDIAN);
172
0
    }
173
0
}
174
175
static void
176
dissect_smc_openclose_importexport_element (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
177
                    unsigned offset, bool isreq, bool iscdb,
178
                    unsigned payload_len _U_, scsi_task_data_t *cdata _U_)
179
0
{
180
0
    if (!tree)
181
0
        return;
182
183
0
    if (isreq && iscdb) {
184
0
        proto_tree_add_item (tree, hf_scsi_smc_ea,  tvb, offset+1, 2, ENC_BIG_ENDIAN);
185
0
        proto_tree_add_item (tree, hf_scsi_smc_action_code,  tvb, offset+3, 1, ENC_BIG_ENDIAN);
186
0
        proto_tree_add_bitmask(tree, tvb, offset+4, hf_scsi_control,
187
0
            ett_scsi_control, cdb_control_fields, ENC_BIG_ENDIAN);
188
0
    }
189
0
}
190
void
191
dissect_smc_movemedium (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
192
                    unsigned offset, bool isreq, bool iscdb,
193
                    unsigned payload_len _U_, scsi_task_data_t *cdata _U_)
194
0
{
195
0
    static int * const move_fields[] = {
196
0
        &hf_scsi_smc_invert,
197
0
        NULL
198
0
    };
199
200
0
    if (!tree)
201
0
        return;
202
203
0
    if (isreq && iscdb) {
204
0
        proto_tree_add_item (tree, hf_scsi_smc_mta, tvb, offset+1, 2, ENC_BIG_ENDIAN);
205
0
        proto_tree_add_item (tree, hf_scsi_smc_sa,  tvb, offset+3, 2, ENC_BIG_ENDIAN);
206
0
        proto_tree_add_item (tree, hf_scsi_smc_da,  tvb, offset+5, 2, ENC_BIG_ENDIAN);
207
0
        proto_tree_add_bitmask(tree, tvb, offset+9, hf_scsi_smc_range_flags,
208
0
            ett_scsi_move, move_fields, ENC_BIG_ENDIAN);
209
0
        proto_tree_add_bitmask(tree, tvb, offset+10, hf_scsi_control,
210
0
            ett_scsi_control, cdb_control_fields, ENC_BIG_ENDIAN);
211
0
    }
212
0
}
213
214
0
#define MT_ELEM  0x1
215
0
#define ST_ELEM  0x2
216
0
#define I_E_ELEM 0x3
217
0
#define DT_ELEM  0x4
218
219
static const value_string element_type_code_vals[] = {
220
    {0x0,      "All element types"},
221
    {MT_ELEM,  "Medium transport element"},
222
    {ST_ELEM,  "Storage element"},
223
    {I_E_ELEM, "Import/export element"},
224
    {DT_ELEM,  "Data transfer element"},
225
    {0, NULL}
226
};
227
228
static const value_string action_code_vals[] = {
229
    {0, "OPEN Import/Export Element"},
230
    {1, "CLOSE Import/Export Element"},
231
    {0, NULL}
232
};
233
234
14
#define PVOLTAG 0x80
235
14
#define AVOLTAG 0x40
236
237
14
#define EXCEPT 0x04
238
239
14
#define ID_VALID 0x20
240
14
#define LU_VALID 0x10
241
242
14
#define SVALID 0x80
243
244
static void
245
dissect_scsi_smc_volume_tag (tvbuff_t *tvb, packet_info *pinfo,
246
                              proto_tree *tree, unsigned offset, int hf_vol_id, int hf_vol_seq_num)
247
0
{
248
0
    uint8_t *volid;
249
0
    int length;
250
0
    for (length = 32; length > 0; length--) {
251
0
        if (tvb_get_uint8(tvb, offset + length - 1) != ' ')
252
0
            break;
253
0
    }
254
255
0
    volid = tvb_get_string_enc(pinfo->pool, tvb, offset, length, ENC_ASCII);
256
0
    proto_tree_add_string(tree, hf_vol_id, tvb, offset, 32, volid);
257
0
    proto_tree_add_item(tree, hf_vol_seq_num, tvb, offset+34, 2, ENC_BIG_ENDIAN);
258
0
}
259
260
261
static void
262
dissect_scsi_smc_element (tvbuff_t *tvb, packet_info *pinfo _U_,
263
                         proto_tree *tree, unsigned offset,
264
                         unsigned elem_bytecnt, uint8_t elem_type,
265
                         uint8_t voltag_flags)
266
0
{
267
0
    uint8_t flags;
268
0
    uint8_t ident_len;
269
270
0
    proto_tree_add_item(tree, hf_scsi_smc_ea, tvb, offset, 2, ENC_BIG_ENDIAN);
271
0
    offset += 2;
272
0
    elem_bytecnt -= 2;
273
274
0
    if (elem_bytecnt < 1)
275
0
        return;
276
0
    flags = tvb_get_uint8 (tvb, offset);
277
0
    switch (elem_type) {
278
279
0
    case MT_ELEM:
280
0
        proto_tree_add_item(tree, hf_scsi_smc_except, tvb, offset, 1, ENC_NA);
281
0
        proto_tree_add_item(tree, hf_scsi_smc_full, tvb, offset, 1, ENC_NA);
282
0
        break;
283
284
0
    case ST_ELEM:
285
0
    case DT_ELEM:
286
0
        proto_tree_add_item(tree, hf_scsi_smc_access, tvb, offset, 1, ENC_NA);
287
0
        proto_tree_add_item(tree, hf_scsi_smc_except, tvb, offset, 1, ENC_NA);
288
0
        proto_tree_add_item(tree, hf_scsi_smc_full, tvb, offset, 1, ENC_NA);
289
0
        break;
290
291
0
    case I_E_ELEM:
292
0
        proto_tree_add_item(tree, hf_scsi_smc_cmc, tvb, offset, 1, ENC_NA);
293
0
        proto_tree_add_item(tree, hf_scsi_smc_inenab, tvb, offset, 1, ENC_NA);
294
0
        proto_tree_add_item(tree, hf_scsi_smc_exenab, tvb, offset, 1, ENC_NA);
295
0
        proto_tree_add_item(tree, hf_scsi_smc_impexp, tvb, offset, 1, ENC_NA);
296
0
        proto_tree_add_item(tree, hf_scsi_smc_access, tvb, offset, 1, ENC_NA);
297
0
        proto_tree_add_item(tree, hf_scsi_smc_except, tvb, offset, 1, ENC_NA);
298
0
        proto_tree_add_item(tree, hf_scsi_smc_full, tvb, offset, 1, ENC_NA);
299
0
        break;
300
0
    }
301
0
    offset += 1;
302
0
    elem_bytecnt -= 1;
303
304
0
    if (elem_bytecnt < 1)
305
0
        return;
306
0
    offset += 1; /* reserved */
307
0
    elem_bytecnt -= 1;
308
309
0
    if (elem_bytecnt < 2)
310
0
        return;
311
0
    if (flags & EXCEPT) {
312
0
        proto_tree_add_item(tree, hf_scsi_smc_additional_sense_code_qualifier, tvb, offset, 2, ENC_BIG_ENDIAN);
313
0
    }
314
0
    offset += 2;
315
0
    elem_bytecnt -= 2;
316
317
0
    if (elem_bytecnt < 3)
318
0
        return;
319
0
    switch (elem_type) {
320
321
0
    case DT_ELEM:
322
0
        flags = tvb_get_uint8 (tvb, offset);
323
0
        if (flags & LU_VALID) {
324
0
            proto_tree_add_item(tree, hf_scsi_smc_lun, tvb, offset, 1, ENC_BIG_ENDIAN);
325
0
        }
326
0
        proto_tree_add_item(tree, hf_scsi_smc_not_bus, tvb, offset, 1, ENC_NA);
327
0
        proto_tree_add_item(tree, hf_scsi_smc_id_valid, tvb, offset, 1, ENC_NA);
328
0
        proto_tree_add_item(tree, hf_scsi_smc_lu_valid, tvb, offset, 1, ENC_NA);
329
330
0
        offset += 1;
331
0
        if (flags & ID_VALID) {
332
0
            proto_tree_add_item(tree, hf_scsi_smc_scsi_bus_address, tvb, offset, 1, ENC_BIG_ENDIAN);
333
0
        }
334
0
        offset += 1;
335
0
        offset += 1; /* reserved */
336
0
        break;
337
338
0
    default:
339
0
        offset += 3; /* reserved */
340
0
        break;
341
0
    }
342
0
    elem_bytecnt -= 3;
343
344
0
    if (elem_bytecnt < 3)
345
0
        return;
346
0
    flags = tvb_get_uint8 (tvb, offset);
347
0
    proto_tree_add_item(tree, hf_scsi_smc_svalid, tvb, offset, 1, ENC_NA);
348
0
    if (flags & SVALID) {
349
0
        proto_tree_add_item(tree, hf_scsi_smc_invert, tvb, offset, 1, ENC_NA);
350
0
        offset += 1;
351
0
        proto_tree_add_item(tree, hf_scsi_smc_source_storage_element_address, tvb, offset, 2, ENC_BIG_ENDIAN);
352
0
        offset += 2;
353
0
    } else {
354
0
        offset += 3;
355
0
    }
356
0
    elem_bytecnt -= 3;
357
358
0
    if (voltag_flags & PVOLTAG) {
359
0
        if (elem_bytecnt < 36)
360
0
            return;
361
0
        dissect_scsi_smc_volume_tag (tvb, pinfo, tree, offset, hf_scsi_smc_primary_vol_tag_id,
362
0
                                      hf_scsi_smc_primary_vol_seq_num);
363
0
        offset += 36;
364
0
        elem_bytecnt -= 36;
365
0
    }
366
367
0
    if (voltag_flags & AVOLTAG) {
368
0
        if (elem_bytecnt < 36)
369
0
            return;
370
0
        dissect_scsi_smc_volume_tag (tvb, pinfo, tree, offset, hf_scsi_smc_alternate_vol_tag_id,
371
0
                                      hf_scsi_smc_alternate_vol_seq_num);
372
0
        offset += 36;
373
0
        elem_bytecnt -= 36;
374
0
    }
375
376
0
    if (elem_bytecnt < 1)
377
0
        return;
378
0
    proto_tree_add_item(tree, hf_scsi_smc_code_set, tvb, offset, 1, ENC_BIG_ENDIAN);
379
0
    offset += 1;
380
0
    elem_bytecnt -= 1;
381
382
0
    if (elem_bytecnt < 1)
383
0
        return;
384
0
    proto_tree_add_item(tree, hf_scsi_smc_identifier_type, tvb, offset, 1, ENC_BIG_ENDIAN);
385
0
    offset += 1;
386
0
    elem_bytecnt -= 1;
387
388
0
    if (elem_bytecnt < 1)
389
0
        return;
390
0
    offset += 1; /* reserved */
391
0
    elem_bytecnt -= 1;
392
393
0
    if (elem_bytecnt < 1)
394
0
        return;
395
0
    ident_len = tvb_get_uint8 (tvb, offset);
396
0
    proto_tree_add_item(tree, hf_scsi_smc_identifier_length, tvb, offset, 1, ENC_BIG_ENDIAN);
397
0
    offset += 1;
398
0
    elem_bytecnt -= 1;
399
400
0
    if (ident_len != 0) {
401
0
        if (elem_bytecnt < ident_len)
402
0
            return;
403
0
        proto_tree_add_item(tree, hf_scsi_smc_identifier, tvb, offset, ident_len, ENC_NA);
404
0
        offset += ident_len;
405
0
        elem_bytecnt -= ident_len;
406
0
    }
407
0
    if (elem_bytecnt != 0) {
408
0
        proto_tree_add_item(tree, hf_scsi_smc_vendor_specific_data, tvb, offset, elem_bytecnt, ENC_NA);
409
0
    }
410
0
}
411
412
413
static void
414
dissect_scsi_smc_elements (tvbuff_t *tvb, packet_info *pinfo,
415
                            proto_tree *tree, unsigned offset,
416
                            unsigned desc_bytecnt, uint8_t elem_type,
417
                            uint8_t voltag_flags, uint16_t elem_desc_len)
418
0
{
419
0
    unsigned elem_bytecnt;
420
421
0
    while (desc_bytecnt != 0) {
422
0
        elem_bytecnt = elem_desc_len;
423
424
0
        if (elem_bytecnt > desc_bytecnt)
425
0
            elem_bytecnt = desc_bytecnt;
426
427
0
        if (elem_bytecnt < 2)
428
0
            break;
429
430
0
        dissect_scsi_smc_element (tvb, pinfo, tree, offset, elem_bytecnt,
431
0
                                   elem_type, voltag_flags);
432
0
        offset += elem_bytecnt;
433
0
        desc_bytecnt -= elem_bytecnt;
434
0
    }
435
0
}
436
437
438
void
439
dissect_smc_readelementstatus (tvbuff_t *tvb, packet_info *pinfo,
440
                         proto_tree *tree, unsigned offset, bool isreq,
441
                         bool iscdb,
442
                         unsigned payload_len _U_, scsi_task_data_t *cdata _U_)
443
0
{
444
0
    unsigned   bytecnt, desc_bytecnt;
445
0
    uint8_t elem_type;
446
0
    uint8_t voltag_flags;
447
0
    uint16_t elem_desc_len;
448
449
0
    if (!tree)
450
0
        return;
451
452
0
    if (isreq && iscdb) {
453
0
        proto_tree_add_item(tree, hf_scsi_smc_voltag, tvb, offset, 1, ENC_NA);
454
0
        proto_tree_add_item(tree, hf_scsi_smc_element_type_code_0F, tvb, offset, 1, ENC_BIG_ENDIAN);
455
0
        proto_tree_add_item(tree, hf_scsi_smc_starting_element_address, tvb, offset+1, 2, ENC_BIG_ENDIAN);
456
0
        proto_tree_add_item(tree, hf_scsi_smc_number_of_elements, tvb, offset+3, 2, ENC_BIG_ENDIAN);
457
0
        proto_tree_add_item(tree, hf_scsi_smc_curdata, tvb, offset+4, 1, ENC_NA);
458
0
        proto_tree_add_item(tree, hf_scsi_smc_dvcid, tvb, offset+4, 1, ENC_NA);
459
0
        proto_tree_add_item(tree, hf_scsi_smc_allocation_length, tvb, offset+6, 3, ENC_BIG_ENDIAN);
460
0
        proto_tree_add_bitmask(tree, tvb, offset+10, hf_scsi_control,
461
0
            ett_scsi_control, cdb_control_fields, ENC_BIG_ENDIAN);
462
0
    }
463
0
    else if (!isreq) {
464
0
        proto_tree_add_item(tree, hf_scsi_smc_first_element_address_reported, tvb, offset, 2, ENC_BIG_ENDIAN);
465
0
        offset += 2;
466
0
        proto_tree_add_item(tree, hf_scsi_smc_number_of_elements_available, tvb, offset, 2, ENC_BIG_ENDIAN);
467
0
        offset += 2;
468
0
        offset += 1; /* reserved */
469
0
        bytecnt = tvb_get_ntoh24 (tvb, offset);
470
0
        proto_tree_add_item(tree, hf_scsi_smc_byte_count_of_report_available, tvb, offset, 3, ENC_BIG_ENDIAN);
471
0
        offset += 3;
472
0
        while (bytecnt != 0) {
473
0
            elem_type = tvb_get_uint8 (tvb, offset);
474
0
            proto_tree_add_item(tree, hf_scsi_smc_element_type_code, tvb, offset, 1, ENC_BIG_ENDIAN);
475
0
            offset += 1;
476
0
            bytecnt -= 1;
477
478
0
            if (bytecnt < 1)
479
0
                break;
480
0
            voltag_flags = tvb_get_uint8 (tvb, offset);
481
0
            proto_tree_add_item(tree, hf_scsi_smc_pvoltag, tvb, offset, 1, ENC_NA);
482
0
            proto_tree_add_item(tree, hf_scsi_smc_avoltag, tvb, offset, 1, ENC_NA);
483
0
            offset += 1;
484
0
            bytecnt -= 1;
485
486
0
            if (bytecnt < 2)
487
0
                break;
488
0
            elem_desc_len = tvb_get_ntohs (tvb, offset);
489
0
            proto_tree_add_item(tree, hf_scsi_smc_element_descriptor_length, tvb, offset, 2, ENC_BIG_ENDIAN);
490
0
            offset += 2;
491
0
            bytecnt -= 2;
492
493
0
            if (bytecnt < 1)
494
0
                break;
495
0
            offset += 1; /* reserved */
496
0
            bytecnt -= 1;
497
498
0
            if (bytecnt < 3)
499
0
                break;
500
0
            desc_bytecnt = tvb_get_ntoh24 (tvb, offset);
501
0
            proto_tree_add_item(tree, hf_scsi_smc_byte_count_of_descriptor_data_available, tvb, offset, 3, ENC_BIG_ENDIAN);
502
0
            offset += 3;
503
0
            bytecnt -= 3;
504
505
0
            if (desc_bytecnt > bytecnt)
506
0
                desc_bytecnt = bytecnt;
507
0
            dissect_scsi_smc_elements (tvb, pinfo, tree, offset,
508
0
                                        desc_bytecnt, elem_type,
509
0
                                        voltag_flags, elem_desc_len);
510
0
            offset += desc_bytecnt;
511
0
            bytecnt -= desc_bytecnt;
512
0
        }
513
0
    }
514
0
}
515
516
517
518
/* SMC Commands */
519
static const value_string scsi_smc_vals[] = {
520
    /* 0x00 */    {SCSI_SPC_TESTUNITRDY                     , "Test Unit Ready"},
521
    /* 0x03 */    {SCSI_SPC_REQSENSE                        , "Request Sense"},
522
    /* 0x07 */    {SCSI_SMC_INITIALIZE_ELEMENT_STATUS       , "Initialize Element Status"},
523
    /* 0x12 */    {SCSI_SPC_INQUIRY                         , "Inquiry"},
524
    /* 0x15 */    {SCSI_SPC_MODESELECT6                     , "Mode Select(6)"},
525
    /* 0x16 */    {SCSI_SPC_RESERVE6                        , "Reserve(6)"},
526
    /* 0x17 */    {SCSI_SPC_RELEASE6                        , "Release(6)"},
527
    /* 0x1A */    {SCSI_SPC_MODESENSE6                      , "Mode Sense(6)"},
528
    /* 0x1B */    {SCSI_SMC_OPENCLOSE_ELEMENT               , "Open/Close Import/Export Element"},
529
    /* 0x1C */    {SCSI_SPC_RCVDIAGRESULTS                  , "Receive Diagnostics Results"},
530
    /* 0x1D */    {SCSI_SPC_SENDDIAG                        , "Send Diagnostic"},
531
    /* 0x1E */    {SCSI_SPC_PREVMEDREMOVAL                  , "Prevent/Allow Medium Removal"},
532
    /* 0x2B */    {SCSI_SMC_POSITION_TO_ELEMENT             , "Position To Element"},
533
    /* 0x37 */    {SCSI_SMC_INITIALIZE_ELEMENT_STATUS_RANGE , "Initialize Element Status With Range"},
534
    /* 0x3B */    {SCSI_SPC_WRITEBUFFER                     , "Write Buffer"},
535
    /* 0x3C */    {SCSI_SPC_READBUFFER                      , "Read Buffer"},
536
    /* 0x40 */    {SCSI_SMC_EXCHANGE_MEDIUM                 , "Exchange Medium"},
537
    /* 0x44 */    {SCSI_SMC_REPORT_VOLUME_TYPES_SUPPORTED   , "Report Volume Types Supported"},
538
    /* 0x4C */    {SCSI_SPC_LOGSELECT                       , "Log Select"},
539
    /* 0x4D */    {SCSI_SPC_LOGSENSE                        , "Log Sense"},
540
    /* 0x55 */    {SCSI_SPC_MODESELECT10                    , "Mode Select(10)"},
541
    /* 0x56 */    {SCSI_SPC_RESERVE10                       , "Reserve(10)"},
542
    /* 0x57 */    {SCSI_SPC_RELEASE10                       , "Release(10)"},
543
    /* 0x5A */    {SCSI_SPC_MODESENSE10                     , "Mode Sense(10)"},
544
    /* 0x5E */    {SCSI_SPC_PERSRESVIN                      , "Persistent Reserve In"},
545
    /* 0x5F */    {SCSI_SPC_PERSRESVOUT                     , "Persistent Reserve Out"},
546
    /* 0x86 */    {SCSI_SPC_ACCESS_CONTROL_IN               , "Access Control In"},
547
    /* 0x87 */    {SCSI_SPC_ACCESS_CONTROL_OUT              , "Access Control Out"},
548
    /* 0x8C */    {SCSI_SMC_READ_ATTRIBUTE                  , "Read Attribute"},
549
    /* 0x8D */    {SCSI_SMC_WRITE_ATTRIBUTE                 , "Write Attribute"},
550
    /* 0xA0 */    {SCSI_SPC_REPORTLUNS                      , "Report LUNs"},
551
    /* 0xA3 */    {SCSI_SPC_MGMT_PROTOCOL_IN                , "Mgmt Protocol In"},
552
    /* 0xA5 */    {SCSI_SMC_MOVE_MEDIUM                     , "Move Medium"},
553
    /* 0xA7 */    {SCSI_SMC_MOVE_MEDIUM_ATTACHED            , "Move Medium Attached"},
554
    /* 0xB4 */    {SCSI_SMC_READ_ELEMENT_STATUS_ATTACHED    , "Read Element Status Attached"},
555
    /* 0xB5 */    {SCSI_SMC_REQUEST_VOLUME_ELEMENT_ADDRESS  , "Request Volume Element Address"},
556
    /* 0xB6 */    {SCSI_SMC_SEND_VOLUME_TAG                 , "Send Volume Tag"},
557
    /* 0xB8 */    {SCSI_SMC_READ_ELEMENT_STATUS             , "Read Element Status"},
558
    {0, NULL},
559
};
560
value_string_ext scsi_smc_vals_ext = VALUE_STRING_EXT_INIT(scsi_smc_vals);
561
562
const scsi_cdb_table_t scsi_smc_table[256] = {
563
/*SPC 0x00*/{dissect_spc_testunitready},
564
/*SMC 0x01*/{NULL},
565
/*SMC 0x02*/{NULL},
566
/*SPC 0x03*/{dissect_spc_requestsense},
567
/*SMC 0x04*/{NULL},
568
/*SMC 0x05*/{NULL},
569
/*SMC 0x06*/{NULL},
570
/*SMC 0x07*/{dissect_smc_initialize_element_status},
571
/*SMC 0x08*/{NULL},
572
/*SMC 0x09*/{NULL},
573
/*SMC 0x0a*/{NULL},
574
/*SMC 0x0b*/{NULL},
575
/*SMC 0x0c*/{NULL},
576
/*SMC 0x0d*/{NULL},
577
/*SMC 0x0e*/{NULL},
578
/*SMC 0x0f*/{NULL},
579
/*SMC 0x10*/{NULL},
580
/*SMC 0x11*/{NULL},
581
/*SPC 0x12*/{dissect_spc_inquiry},
582
/*SMC 0x13*/{NULL},
583
/*SMC 0x14*/{NULL},
584
/*SPC 0x15*/{dissect_spc_modeselect6},
585
/*SPC 0x16*/{dissect_spc_reserve6},
586
/*SPC 0x17*/{dissect_spc_release6},
587
/*SMC 0x18*/{NULL},
588
/*SMC 0x19*/{NULL},
589
/*SPC 0x1a*/{dissect_spc_modesense6},
590
/*SMC 0x1b*/{dissect_smc_openclose_importexport_element},
591
/*SMC 0x1c*/{NULL},
592
/*SPC 0x1d*/{dissect_spc_senddiagnostic},
593
/*SMC 0x1e*/{dissect_spc_preventallowmediaremoval},
594
/*SMC 0x1f*/{NULL},
595
/*SMC 0x20*/{NULL},
596
/*SMC 0x21*/{NULL},
597
/*SMC 0x22*/{NULL},
598
/*SMC 0x23*/{NULL},
599
/*SMC 0x24*/{NULL},
600
/*SMC 0x25*/{NULL},
601
/*SMC 0x26*/{NULL},
602
/*SMC 0x27*/{NULL},
603
/*SMC 0x28*/{NULL},
604
/*SMC 0x29*/{NULL},
605
/*SMC 0x2a*/{NULL},
606
/*SMC 0x2b*/{dissect_smc_position_to_element},
607
/*SMC 0x2c*/{NULL},
608
/*SMC 0x2d*/{NULL},
609
/*SMC 0x2e*/{NULL},
610
/*SMC 0x2f*/{NULL},
611
/*SMC 0x30*/{NULL},
612
/*SMC 0x31*/{NULL},
613
/*SMC 0x32*/{NULL},
614
/*SMC 0x33*/{NULL},
615
/*SMC 0x34*/{NULL},
616
/*SMC 0x35*/{NULL},
617
/*SMC 0x36*/{NULL},
618
/*SMC 0x37*/{dissect_smc_initialize_element_status_with_range},
619
/*SMC 0x38*/{NULL},
620
/*SMC 0x39*/{NULL},
621
/*SMC 0x3a*/{NULL},
622
/*SPC 0x3b*/{dissect_spc_writebuffer},
623
/*SMC 0x3c*/{NULL},
624
/*SMC 0x3d*/{NULL},
625
/*SMC 0x3e*/{NULL},
626
/*SMC 0x3f*/{NULL},
627
/*SMC 0x40*/{NULL},
628
/*SMC 0x41*/{NULL},
629
/*SMC 0x42*/{NULL},
630
/*SMC 0x43*/{NULL},
631
/*SMC 0x44*/{NULL},
632
/*SMC 0x45*/{NULL},
633
/*SMC 0x46*/{NULL},
634
/*SMC 0x47*/{NULL},
635
/*SMC 0x48*/{NULL},
636
/*SMC 0x49*/{NULL},
637
/*SMC 0x4a*/{NULL},
638
/*SMC 0x4b*/{NULL},
639
/*SPC 0x4c*/{dissect_spc_logselect},
640
/*SPC 0x4d*/{dissect_spc_logsense},
641
/*SMC 0x4e*/{NULL},
642
/*SMC 0x4f*/{NULL},
643
/*SMC 0x50*/{NULL},
644
/*SMC 0x51*/{NULL},
645
/*SMC 0x52*/{NULL},
646
/*SMC 0x53*/{NULL},
647
/*SMC 0x54*/{NULL},
648
/*SPC 0x55*/{dissect_spc_modeselect10},
649
/*SPC 0x56*/{dissect_spc_reserve10},
650
/*SPC 0x57*/{dissect_spc_release10},
651
/*SMC 0x58*/{NULL},
652
/*SMC 0x59*/{NULL},
653
/*SPC 0x5a*/{dissect_spc_modesense10},
654
/*SMC 0x5b*/{NULL},
655
/*SMC 0x5c*/{NULL},
656
/*SMC 0x5d*/{NULL},
657
/*SPC 0x5e*/{dissect_spc_persistentreservein},
658
/*SPC 0x5f*/{dissect_spc_persistentreserveout},
659
/*SMC 0x60*/{NULL},
660
/*SMC 0x61*/{NULL},
661
/*SMC 0x62*/{NULL},
662
/*SMC 0x63*/{NULL},
663
/*SMC 0x64*/{NULL},
664
/*SMC 0x65*/{NULL},
665
/*SMC 0x66*/{NULL},
666
/*SMC 0x67*/{NULL},
667
/*SMC 0x68*/{NULL},
668
/*SMC 0x69*/{NULL},
669
/*SMC 0x6a*/{NULL},
670
/*SMC 0x6b*/{NULL},
671
/*SMC 0x6c*/{NULL},
672
/*SMC 0x6d*/{NULL},
673
/*SMC 0x6e*/{NULL},
674
/*SMC 0x6f*/{NULL},
675
/*SMC 0x70*/{NULL},
676
/*SMC 0x71*/{NULL},
677
/*SMC 0x72*/{NULL},
678
/*SMC 0x73*/{NULL},
679
/*SMC 0x74*/{NULL},
680
/*SMC 0x75*/{NULL},
681
/*SMC 0x76*/{NULL},
682
/*SMC 0x77*/{NULL},
683
/*SMC 0x78*/{NULL},
684
/*SMC 0x79*/{NULL},
685
/*SMC 0x7a*/{NULL},
686
/*SMC 0x7b*/{NULL},
687
/*SMC 0x7c*/{NULL},
688
/*SMC 0x7d*/{NULL},
689
/*SMC 0x7e*/{NULL},
690
/*SMC 0x7f*/{NULL},
691
/*SMC 0x80*/{NULL},
692
/*SMC 0x81*/{NULL},
693
/*SMC 0x82*/{NULL},
694
/*SMC 0x83*/{NULL},
695
/*SMC 0x84*/{NULL},
696
/*SMC 0x85*/{NULL},
697
/*SMC 0x86*/{NULL},
698
/*SMC 0x87*/{NULL},
699
/*SMC 0x88*/{NULL},
700
/*SMC 0x89*/{NULL},
701
/*SMC 0x8a*/{NULL},
702
/*SMC 0x8b*/{NULL},
703
/*SMC 0x8c*/{NULL},
704
/*SMC 0x8d*/{NULL},
705
/*SMC 0x8e*/{NULL},
706
/*SMC 0x8f*/{NULL},
707
/*SMC 0x90*/{NULL},
708
/*SMC 0x91*/{NULL},
709
/*SMC 0x92*/{NULL},
710
/*SMC 0x93*/{NULL},
711
/*SMC 0x94*/{NULL},
712
/*SMC 0x95*/{NULL},
713
/*SMC 0x96*/{NULL},
714
/*SMC 0x97*/{NULL},
715
/*SMC 0x98*/{NULL},
716
/*SMC 0x99*/{NULL},
717
/*SMC 0x9a*/{NULL},
718
/*SMC 0x9b*/{NULL},
719
/*SMC 0x9c*/{NULL},
720
/*SMC 0x9d*/{NULL},
721
/*SMC 0x9e*/{NULL},
722
/*SMC 0x9f*/{NULL},
723
/*SPC 0xa0*/{dissect_spc_reportluns},
724
/*SMC 0xa1*/{NULL},
725
/*SMC 0xa2*/{NULL},
726
/*SPC 0xa3*/{dissect_spc_mgmt_protocol_in},
727
/*SMC 0xa4*/{NULL},
728
/*SMC 0xa5*/{dissect_smc_movemedium},
729
/*SMC 0xa6*/{dissect_smc_exchangemedium},
730
/*SMC 0xa7*/{dissect_smc_movemedium},
731
/*SMC 0xa8*/{NULL},
732
/*SMC 0xa9*/{NULL},
733
/*SMC 0xaa*/{NULL},
734
/*SMC 0xab*/{NULL},
735
/*SMC 0xac*/{NULL},
736
/*SMC 0xad*/{NULL},
737
/*SMC 0xae*/{NULL},
738
/*SMC 0xaf*/{NULL},
739
/*SMC 0xb0*/{NULL},
740
/*SMC 0xb1*/{NULL},
741
/*SMC 0xb2*/{NULL},
742
/*SMC 0xb3*/{NULL},
743
/*SMC 0xb4*/{dissect_smc_readelementstatus},
744
/*SMC 0xb5*/{NULL},
745
/*SMC 0xb6*/{NULL},
746
/*SMC 0xb7*/{NULL},
747
/*SMC 0xb8*/{dissect_smc_readelementstatus},
748
/*SMC 0xb9*/{NULL},
749
/*SMC 0xba*/{NULL},
750
/*SMC 0xbb*/{NULL},
751
/*SMC 0xbc*/{NULL},
752
/*SMC 0xbd*/{NULL},
753
/*SMC 0xbe*/{NULL},
754
/*SMC 0xbf*/{NULL},
755
/*SMC 0xc0*/{NULL},
756
/*SMC 0xc1*/{NULL},
757
/*SMC 0xc2*/{NULL},
758
/*SMC 0xc3*/{NULL},
759
/*SMC 0xc4*/{NULL},
760
/*SMC 0xc5*/{NULL},
761
/*SMC 0xc6*/{NULL},
762
/*SMC 0xc7*/{NULL},
763
/*SMC 0xc8*/{NULL},
764
/*SMC 0xc9*/{NULL},
765
/*SMC 0xca*/{NULL},
766
/*SMC 0xcb*/{NULL},
767
/*SMC 0xcc*/{NULL},
768
/*SMC 0xcd*/{NULL},
769
/*SMC 0xce*/{NULL},
770
/*SMC 0xcf*/{NULL},
771
/*SMC 0xd0*/{NULL},
772
/*SMC 0xd1*/{NULL},
773
/*SMC 0xd2*/{NULL},
774
/*SMC 0xd3*/{NULL},
775
/*SMC 0xd4*/{NULL},
776
/*SMC 0xd5*/{NULL},
777
/*SMC 0xd6*/{NULL},
778
/*SMC 0xd7*/{NULL},
779
/*SMC 0xd8*/{NULL},
780
/*SMC 0xd9*/{NULL},
781
/*SMC 0xda*/{NULL},
782
/*SMC 0xdb*/{NULL},
783
/*SMC 0xdc*/{NULL},
784
/*SMC 0xdd*/{NULL},
785
/*SMC 0xde*/{NULL},
786
/*SMC 0xdf*/{NULL},
787
/*SMC 0xe0*/{NULL},
788
/*SMC 0xe1*/{NULL},
789
/*SMC 0xe2*/{NULL},
790
/*SMC 0xe3*/{NULL},
791
/*SMC 0xe4*/{NULL},
792
/*SMC 0xe5*/{NULL},
793
/*SMC 0xe6*/{NULL},
794
/*SMC 0xe7*/{NULL},
795
/*SMC 0xe8*/{NULL},
796
/*SMC 0xe9*/{NULL},
797
/*SMC 0xea*/{NULL},
798
/*SMC 0xeb*/{NULL},
799
/*SMC 0xec*/{NULL},
800
/*SMC 0xed*/{NULL},
801
/*SMC 0xee*/{NULL},
802
/*SMC 0xef*/{NULL},
803
/*SMC 0xf0*/{NULL},
804
/*SMC 0xf1*/{NULL},
805
/*SMC 0xf2*/{NULL},
806
/*SMC 0xf3*/{NULL},
807
/*SMC 0xf4*/{NULL},
808
/*SMC 0xf5*/{NULL},
809
/*SMC 0xf6*/{NULL},
810
/*SMC 0xf7*/{NULL},
811
/*SMC 0xf8*/{NULL},
812
/*SMC 0xf9*/{NULL},
813
/*SMC 0xfa*/{NULL},
814
/*SMC 0xfb*/{NULL},
815
/*SMC 0xfc*/{NULL},
816
/*SMC 0xfd*/{NULL},
817
/*SMC 0xfe*/{NULL},
818
/*SMC 0xff*/{NULL}
819
};
820
821
822
void
823
proto_register_scsi_smc(void)
824
14
{
825
14
    static hf_register_info hf[] = {
826
14
        { &hf_scsi_smc_opcode,
827
14
          {"SMC Opcode", "scsi_smc.opcode",
828
14
           FT_UINT8, BASE_HEX | BASE_EXT_STRING, &scsi_smc_vals_ext, 0x0,
829
14
           NULL, HFILL}
830
14
        },
831
14
        { &hf_scsi_smc_mta,
832
14
          {"Medium Transport Address", "scsi_smc.mta",
833
14
           FT_UINT16, BASE_DEC, NULL, 0x0,
834
14
           NULL, HFILL}
835
14
        },
836
14
        { &hf_scsi_smc_sa,
837
14
          {"Source Address", "scsi_smc.sa",
838
14
           FT_UINT16, BASE_DEC, NULL, 0x0,
839
14
           NULL, HFILL}
840
14
        },
841
14
        { &hf_scsi_smc_da,
842
14
          {"Destination Address", "scsi_smc.da",
843
14
           FT_UINT16, BASE_DEC, NULL, 0x0,
844
14
           NULL, HFILL}
845
14
        },
846
14
        { &hf_scsi_smc_fda,
847
14
          {"First Destination Address", "scsi_smc.fda",
848
14
           FT_UINT16, BASE_DEC, NULL, 0x0,
849
14
           NULL, HFILL}
850
14
        },
851
14
        { &hf_scsi_smc_sda,
852
14
          {"Second Destination Address", "scsi_smc.sda",
853
14
           FT_UINT16, BASE_DEC, NULL, 0x0,
854
14
           NULL, HFILL}
855
14
        },
856
14
        { &hf_scsi_smc_medium_flags,
857
14
          {"Flags", "scsi_smc.medium_flags",
858
14
           FT_UINT8, BASE_HEX, NULL, 0x0,
859
14
           NULL, HFILL}
860
14
        },
861
14
        { &hf_scsi_smc_inv1,
862
14
          {"INV1", "scsi_smc.inv1",
863
14
           FT_BOOLEAN, 8, NULL, 0x02,
864
14
           NULL, HFILL}
865
14
        },
866
14
        { &hf_scsi_smc_inv2,
867
14
          {"INV2", "scsi_smc.inv2",
868
14
           FT_BOOLEAN, 8, NULL, 0x01,
869
14
           NULL, HFILL}
870
14
        },
871
14
        { &hf_scsi_smc_range_flags,
872
14
          {"Flags", "scsi_smc.range_flags",
873
14
           FT_UINT8, BASE_HEX, NULL, 0x0,
874
14
           NULL, HFILL}
875
14
        },
876
14
        { &hf_scsi_smc_fast,
877
14
          {"FAST", "scsi_smc.fast",
878
14
           FT_BOOLEAN, 8, NULL, 0x02,
879
14
           NULL, HFILL}
880
14
        },
881
14
        { &hf_scsi_smc_range,
882
14
          {"RANGE", "scsi_smc.range",
883
14
           FT_BOOLEAN, 8, NULL, 0x01,
884
14
           NULL, HFILL}
885
14
        },
886
#if 0
887
        { &hf_scsi_smc_sea,
888
          {"Starting Element Address", "scsi_smc.sea",
889
           FT_UINT16, BASE_DEC, NULL, 0x0,
890
           NULL, HFILL}
891
        },
892
#endif
893
14
        { &hf_scsi_smc_num_elements,
894
14
          {"Number of Elements", "scsi_smc.num_elements",
895
14
           FT_UINT16, BASE_DEC, NULL, 0x0,
896
14
           NULL, HFILL}
897
14
        },
898
14
        { &hf_scsi_smc_invert,
899
14
          {"INVERT", "scsi_smc.invert",
900
14
           FT_BOOLEAN, 8, NULL, 0x01,
901
14
           NULL, HFILL}
902
14
        },
903
14
        { &hf_scsi_smc_ea,
904
14
          {"Element Address", "scsi_smc.ea",
905
14
           FT_UINT16, BASE_DEC, NULL, 0x0,
906
14
           NULL, HFILL}
907
14
        },
908
14
        { &hf_scsi_smc_action_code,
909
14
          {"Action Code", "scsi_smc.action_code",
910
14
           FT_UINT8, BASE_HEX, VALS(action_code_vals), 0x1f,
911
14
           NULL, HFILL}
912
14
        },
913
914
        /* Generated from convert_proto_tree_add_text.pl */
915
14
        { &hf_scsi_smc_scsi_bus_address,
916
14
          { "SCSI Bus Address", "scsi_smc.scsi_bus_address",
917
14
            FT_UINT8, BASE_DEC, NULL, 0x0,
918
14
            NULL, HFILL }
919
14
        },
920
14
        { &hf_scsi_smc_source_storage_element_address,
921
14
          { "Source Storage Element Address", "scsi_smc.source_storage_element_address",
922
14
            FT_UINT16, BASE_DEC, NULL, 0x0,
923
14
            NULL, HFILL }
924
14
        },
925
14
        { &hf_scsi_smc_code_set,
926
14
          { "Code Set", "scsi_smc.code_set",
927
14
            FT_UINT8, BASE_DEC, VALS(scsi_devid_codeset_val), 0x0F,
928
14
            NULL, HFILL }
929
14
        },
930
14
        { &hf_scsi_smc_identifier_type,
931
14
          { "Identifier Type", "scsi_smc.identifier_type",
932
14
            FT_UINT8, BASE_DEC, VALS(scsi_devid_idtype_val), 0x0F,
933
14
            NULL, HFILL }
934
14
        },
935
14
        { &hf_scsi_smc_identifier_length,
936
14
          { "Identifier Length", "scsi_smc.identifier_length",
937
14
            FT_UINT8, BASE_DEC, NULL, 0x0,
938
14
            NULL, HFILL }
939
14
        },
940
14
        { &hf_scsi_smc_identifier,
941
14
          { "Identifier", "scsi_smc.identifier",
942
14
            FT_BYTES, BASE_NONE, NULL, 0x0,
943
14
            NULL, HFILL }
944
14
        },
945
14
        { &hf_scsi_smc_vendor_specific_data,
946
14
          { "Vendor-specific Data", "scsi_smc.vendor_specific_data",
947
14
            FT_BYTES, BASE_NONE, NULL, 0x0,
948
14
            NULL, HFILL }
949
14
        },
950
14
        { &hf_scsi_smc_voltag,
951
14
          { "VOLTAG", "scsi_smc.voltag",
952
14
            FT_BOOLEAN, 8, NULL, 0x10,
953
14
            NULL, HFILL }
954
14
        },
955
14
        { &hf_scsi_smc_starting_element_address,
956
14
          { "Starting Element Address", "scsi_smc.starting_element_address",
957
14
            FT_UINT16, BASE_DEC, NULL, 0x0,
958
14
            NULL, HFILL }
959
14
        },
960
14
        { &hf_scsi_smc_number_of_elements,
961
14
          { "Number of Elements", "scsi_smc.number_of_elements",
962
14
            FT_UINT16, BASE_DEC, NULL, 0x0,
963
14
            NULL, HFILL }
964
14
        },
965
14
        { &hf_scsi_smc_curdata,
966
14
          { "CURDATA", "scsi_smc.curdata",
967
14
            FT_BOOLEAN, 8, NULL, 0x02,
968
14
            NULL, HFILL }
969
14
        },
970
14
        { &hf_scsi_smc_allocation_length,
971
14
          { "Allocation Length", "scsi_smc.allocation_length",
972
14
            FT_UINT24, BASE_DEC, NULL, 0x0,
973
14
            NULL, HFILL }
974
14
        },
975
14
        { &hf_scsi_smc_first_element_address_reported,
976
14
          { "First Element Address Reported", "scsi_smc.first_element_address_reported",
977
14
            FT_UINT16, BASE_DEC, NULL, 0x0,
978
14
            NULL, HFILL }
979
14
        },
980
14
        { &hf_scsi_smc_number_of_elements_available,
981
14
          { "Number of Elements Available", "scsi_smc.number_of_elements_available",
982
14
            FT_UINT16, BASE_DEC, NULL, 0x0,
983
14
            NULL, HFILL }
984
14
        },
985
14
        { &hf_scsi_smc_byte_count_of_report_available,
986
14
          { "Byte Count of Report Available", "scsi_smc.byte_count_of_report_available",
987
14
            FT_UINT24, BASE_DEC, NULL, 0x0,
988
14
            NULL, HFILL }
989
14
        },
990
14
        { &hf_scsi_smc_element_type_code,
991
14
          { "Element Type Code", "scsi_smc.element_type_code",
992
14
            FT_UINT8, BASE_DEC, VALS(element_type_code_vals), 0x0,
993
14
            NULL, HFILL }
994
14
        },
995
14
        { &hf_scsi_smc_element_type_code_0F,
996
14
          { "Element Type Code", "scsi_smc.element_type_code",
997
14
            FT_UINT8, BASE_DEC, VALS(element_type_code_vals), 0x0F,
998
14
            NULL, HFILL }
999
14
        },
1000
14
        { &hf_scsi_smc_pvoltag,
1001
14
          { "PVOLTAG", "scsi_smc.pvoltag",
1002
14
            FT_BOOLEAN, 8, NULL, PVOLTAG,
1003
14
            NULL, HFILL }
1004
14
        },
1005
14
        { &hf_scsi_smc_element_descriptor_length,
1006
14
          { "Element Descriptor Length", "scsi_smc.element_descriptor_length",
1007
14
            FT_UINT16, BASE_DEC, NULL, 0x0,
1008
14
            NULL, HFILL }
1009
14
        },
1010
14
        { &hf_scsi_smc_byte_count_of_descriptor_data_available,
1011
14
          { "Byte Count Of Descriptor Data Available", "scsi_smc.byte_count_of_descriptor_data_available",
1012
14
            FT_UINT24, BASE_DEC, NULL, 0x0,
1013
14
            NULL, HFILL }
1014
14
        },
1015
14
        { &hf_scsi_smc_except,
1016
14
          { "EXCEPT", "scsi_smc.except",
1017
14
            FT_BOOLEAN, 8, NULL, EXCEPT,
1018
14
            NULL, HFILL }
1019
14
        },
1020
14
        { &hf_scsi_smc_access,
1021
14
          { "ACCESS", "scsi_smc.access",
1022
14
            FT_BOOLEAN, 8, NULL, 0x08,
1023
14
            NULL, HFILL }
1024
14
        },
1025
14
        { &hf_scsi_smc_cmc,
1026
14
          { "cmc", "scsi_smc.cmc",
1027
14
            FT_BOOLEAN, 8, NULL, 0x40,
1028
14
            NULL, HFILL }
1029
14
        },
1030
14
        { &hf_scsi_smc_additional_sense_code_qualifier,
1031
14
          { "Additional Sense Code+Qualifier", "scsi_smc.additional_sense_code_qualifier",
1032
14
            FT_UINT16, BASE_HEX|BASE_EXT_STRING, &scsi_asc_val_ext, 0x0,
1033
14
            NULL, HFILL }
1034
14
        },
1035
14
        { &hf_scsi_smc_not_bus,
1036
14
          { "NOT BUS", "scsi_smc.not_bus",
1037
14
            FT_BOOLEAN, 8, NULL, 0x80,
1038
14
            NULL, HFILL }
1039
14
        },
1040
14
        { &hf_scsi_smc_id_valid,
1041
14
          { "ID VALID", "scsi_smc.id_valid",
1042
14
            FT_BOOLEAN, 8, NULL, ID_VALID,
1043
14
            NULL, HFILL }
1044
14
        },
1045
14
        { &hf_scsi_smc_lu_valid,
1046
14
          { "LU VALID", "scsi_smc.lu_valid",
1047
14
            FT_BOOLEAN, 8, NULL, LU_VALID,
1048
14
            NULL, HFILL }
1049
14
        },
1050
14
        { &hf_scsi_smc_svalid,
1051
14
          { "SVALID", "scsi_smc.svalid",
1052
14
            FT_BOOLEAN, 8, NULL, SVALID,
1053
14
            NULL, HFILL }
1054
14
        },
1055
14
        { &hf_scsi_smc_dvcid,
1056
14
          { "DVCID", "scsi_smc.dvcid",
1057
14
            FT_BOOLEAN, 8, NULL, 0x01,
1058
14
            NULL, HFILL }
1059
14
        },
1060
14
        { &hf_scsi_smc_avoltag,
1061
14
          { "AVOLTAG", "scsi_smc.pvoltag",
1062
14
            FT_BOOLEAN, 8, NULL, AVOLTAG,
1063
14
            NULL, HFILL }
1064
14
        },
1065
14
        { &hf_scsi_smc_full,
1066
14
          { "FULL", "scsi_smc.full",
1067
14
            FT_BOOLEAN, 8, NULL, 0x01,
1068
14
            NULL, HFILL }
1069
14
        },
1070
14
        { &hf_scsi_smc_exenab,
1071
14
          { "EXENAB", "scsi_smc.exenab",
1072
14
            FT_BOOLEAN, 8, NULL, 0x10,
1073
14
            NULL, HFILL }
1074
14
        },
1075
14
        { &hf_scsi_smc_inenab,
1076
14
          { "INENAB", "scsi_smc.inenab",
1077
14
            FT_BOOLEAN, 8, NULL, 0x20,
1078
14
            NULL, HFILL }
1079
14
        },
1080
14
        { &hf_scsi_smc_impexp,
1081
14
          { "IMPEXP", "scsi_smc.impexp",
1082
14
            FT_BOOLEAN, 8, NULL, 0x02,
1083
14
            NULL, HFILL }
1084
14
        },
1085
14
        { &hf_scsi_smc_lun,
1086
14
          { "LUN", "scsi_smc.lun",
1087
14
            FT_UINT8, BASE_DEC, NULL, 0x07,
1088
14
            NULL, HFILL }
1089
14
        },
1090
14
        { &hf_scsi_smc_primary_vol_tag_id,
1091
14
          { "Primary Volume Identification", "scsi_smc.primary_vol_tag_id",
1092
14
            FT_STRING, BASE_NONE, NULL, 0x0,
1093
14
            NULL, HFILL }
1094
14
        },
1095
14
        { &hf_scsi_smc_alternate_vol_tag_id,
1096
14
          { "Alternate Volume Identification", "scsi_smc.alternate_vol_tag_id",
1097
14
            FT_STRING, BASE_NONE, NULL, 0x0,
1098
14
            NULL, HFILL }
1099
14
        },
1100
14
        { &hf_scsi_smc_primary_vol_seq_num,
1101
14
          { "Primary Volume Sequence Number", "scsi_smc.primary_vol_seq_num",
1102
14
            FT_UINT16, BASE_DEC, NULL, 0x0,
1103
14
            NULL, HFILL }
1104
14
        },
1105
14
        { &hf_scsi_smc_alternate_vol_seq_num,
1106
14
          { "Alternate Volume Sequence Number", "scsi_smc.alternate_vol_seq_num",
1107
14
            FT_UINT16, BASE_DEC, NULL, 0x0,
1108
14
            NULL, HFILL }
1109
14
        },
1110
14
    };
1111
1112
1113
    /* Setup protocol subtree array */
1114
14
    static int *ett[] = {
1115
14
        &ett_scsi_exchange_medium,
1116
14
        &ett_scsi_range,
1117
14
        &ett_scsi_move
1118
14
    };
1119
1120
    /* Register the protocol name and description */
1121
14
    proto_scsi_smc = proto_register_protocol("SCSI_SMC", "SCSI_SMC", "scsi_smc");
1122
1123
    /* Required function calls to register the header fields and subtrees used */
1124
14
    proto_register_field_array(proto_scsi_smc, hf, array_length(hf));
1125
1126
14
    proto_register_subtree_array(ett, array_length(ett));
1127
14
}
1128
1129
/*
1130
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
1131
 *
1132
 * Local variables:
1133
 * c-basic-offset: 4
1134
 * tab-width: 8
1135
 * indent-tabs-mode: nil
1136
 * End:
1137
 *
1138
 * vi: set shiftwidth=4 tabstop=8 expandtab:
1139
 * :indentSize=4:tabSize=8:noTabs=true:
1140
 */