1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/* packet-scsi.h
* Author: Dinesh G Dutt (ddutt@cisco.com)
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 2002 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __PACKET_SCSI_H_
#define __PACKET_SCSI_H_
/* list of commands for each commandset */
typedef void (*scsi_dissector_t)(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree, guint offset,
gboolean isreq, gboolean iscdb,
guint32 payload_len, scsi_task_data_t *cdata);
typedef struct _scsi_cdb_table_t {
scsi_dissector_t func;
} scsi_cdb_table_t;
/* SPC and SPC-2 Commands */
#define SCSI_SPC_CHANGE_DEFINITION 0x40
#define SCSI_SPC_COMPARE 0x39
#define SCSI_SPC_COPY 0x18
#define SCSI_SPC_COPY_AND_VERIFY 0x3A
#define SCSI_SPC2_INQUIRY 0x12
#define SCSI_SPC2_EXTCOPY 0x83
#define SCSI_SPC2_LOGSELECT 0x4C
#define SCSI_SPC2_LOGSENSE 0x4D
#define SCSI_SPC2_MODESELECT6 0x15
#define SCSI_SPC2_MODESELECT10 0x55
#define SCSI_SPC2_MODESENSE6 0x1A
#define SCSI_SPC2_MODESENSE10 0x5A
#define SCSI_SPC2_PERSRESVIN 0x5E
#define SCSI_SPC2_PERSRESVOUT 0x5F
#define SCSI_SPC2_PREVMEDREMOVAL 0x1E
#define SCSI_SPC2_READBUFFER 0x3C
#define SCSI_SPC2_RCVCOPYRESULTS 0x84
#define SCSI_SPC2_RCVDIAGRESULTS 0x1C
#define SCSI_SPC2_RELEASE6 0x17
#define SCSI_SPC2_RELEASE10 0x57
#define SCSI_SPC2_REPORTDEVICEID 0xA3
#define SCSI_SPC2_REPORTLUNS 0xA0
#define SCSI_SPC2_REQSENSE 0x03
#define SCSI_SPC2_RESERVE6 0x16
#define SCSI_SPC2_RESERVE10 0x56
#define SCSI_SPC2_SENDDIAG 0x1D
#define SCSI_SPC2_SETDEVICEID 0xA4
#define SCSI_SPC2_TESTUNITRDY 0x00
#define SCSI_SPC2_WRITEBUFFER 0x3B
#define SCSI_SPC2_VARLENCDB 0x7F
void dissect_spc3_inquiry(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset, gboolean isreq, gboolean iscdb, guint32 payload_len, scsi_task_data_t *cdata);
void dissect_spc3_logselect(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint offset, gboolean isreq, gboolean iscdb, guint payload_len _U_, scsi_task_data_t *cdata _U_);
void dissect_spc3_logsense(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint offset, gboolean isreq, gboolean iscdb, guint payload_len _U_, scsi_task_data_t *cdata _U_);
void dissect_spc3_modeselect10(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset, gboolean isreq, gboolean iscdb, guint payload_len, scsi_task_data_t *cdata);
void dissect_spc3_modesense10(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset, gboolean isreq, gboolean iscdb, guint payload_len, scsi_task_data_t *cdata);
void dissect_spc3_persistentreservein(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint offset, gboolean isreq, gboolean iscdb, guint payload_len, scsi_task_data_t *cdata);
void dissect_spc3_persistentreserveout(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint offset, gboolean isreq, gboolean iscdb, guint payload_len _U_, scsi_task_data_t *cdata _U_);
void dissect_spc3_reportluns(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint offset, gboolean isreq, gboolean iscdb, guint payload_len _U_, scsi_task_data_t *cdata _U_);
extern const value_string scsi_status_val[];
/*
* SCSI Device Types.
*
* These can be supplied to the dissection routines if the caller happens
* to know the device type (e.g., NDMP assumes that a "jukebox" is a
* media changer, SCSI_DEV_SMC, and a "tape" is a sequential access device,
* SCSI_DEV_SSC).
*
* If the caller doesn't know the device type, it supplies SCSI_DEV_UNKNOWN.
*/
#define SCSI_DEV_UNKNOWN -1
#define SCSI_DEV_SBC 0x0
#define SCSI_DEV_SSC 0x1
#define SCSI_DEV_PRNT 0x2
#define SCSI_DEV_PROC 0x3
#define SCSI_DEV_WORM 0x4
#define SCSI_DEV_CDROM 0x5
#define SCSI_DEV_SCAN 0x6
#define SCSI_DEV_OPTMEM 0x7
#define SCSI_DEV_SMC 0x8
#define SCSI_DEV_COMM 0x9
#define SCSI_DEV_RAID 0xC
#define SCSI_DEV_SES 0xD
#define SCSI_DEV_RBC 0xE
#define SCSI_DEV_OCRW 0xF
#define SCSI_DEV_OSD 0x11
#define SCSI_DEV_ADC 0x12
#define SCSI_DEV_NOLUN 0x1F
#define SCSI_DEV_BITS 0x1F /* the lower 5 bits indicate device type */
#define SCSI_MS_PCODE_BITS 0x3F /* Page code bits in Mode Sense */
/* Function Decls; functions invoked by SAM-2 transport protocols such as
* FCP/iSCSI
*/
void dissect_scsi_cdb (tvbuff_t *, packet_info *, proto_tree *,
gint, itlq_nexus_t *, itl_nexus_t *);
void dissect_scsi_rsp (tvbuff_t *, packet_info *, proto_tree *, itlq_nexus_t *, itl_nexus_t *, guint8);
void dissect_scsi_payload (tvbuff_t *, packet_info *, proto_tree *,
gboolean, itlq_nexus_t *, itl_nexus_t *);
void dissect_scsi_snsinfo (tvbuff_t *, packet_info *, proto_tree *, guint, guint, itlq_nexus_t *, itl_nexus_t *);
WS_VAR_IMPORT const value_string scsi_sbc2_vals[];
WS_VAR_IMPORT const value_string scsi_mmc_vals[];
WS_VAR_IMPORT const value_string scsi_ssc2_vals[];
#endif
|