1 package org.jscsi.target.connection.stage.fullfeature;
2
3
4 import java.io.IOException;
5 import java.security.DigestException;
6
7 import org.jscsi.exception.InternetSCSIException;
8 import org.jscsi.parser.BasicHeaderSegment;
9 import org.jscsi.parser.ProtocolDataUnit;
10 import org.jscsi.parser.scsi.SCSICommandParser;
11 import org.jscsi.parser.scsi.SCSIResponseParser;
12 import org.jscsi.parser.scsi.SCSIStatus;
13 import org.jscsi.target.connection.TargetPduFactory;
14 import org.jscsi.target.connection.phase.TargetFullFeaturePhase;
15 import org.jscsi.target.scsi.ScsiResponseDataSegment;
16 import org.jscsi.target.scsi.cdb.RequestSenseCdb;
17 import org.jscsi.target.scsi.sense.AdditionalSenseBytes;
18 import org.jscsi.target.scsi.sense.AdditionalSenseCodeAndQualifier;
19 import org.jscsi.target.scsi.sense.DescriptorFormatSenseData;
20 import org.jscsi.target.scsi.sense.ErrorType;
21 import org.jscsi.target.scsi.sense.FixedFormatSenseData;
22 import org.jscsi.target.scsi.sense.SenseData;
23 import org.jscsi.target.scsi.sense.SenseKey;
24 import org.jscsi.target.scsi.sense.information.FourByteInformation;
25 import org.jscsi.target.scsi.sense.senseDataDescriptor.SenseDataDescriptor;
26 import org.jscsi.target.scsi.sense.senseDataDescriptor.senseKeySpecific.FieldPointerSenseKeySpecificData;
27 import org.jscsi.target.settings.SettingsException;
28
29
30
31
32
33
34
35
36
37
38 public class RequestSenseStage extends TargetFullFeatureStage {
39
40 public RequestSenseStage (TargetFullFeaturePhase targetFullFeaturePhase) {
41 super(targetFullFeaturePhase);
42 }
43
44 @Override
45 public void execute (ProtocolDataUnit pdu) throws IOException , InterruptedException , InternetSCSIException , DigestException , SettingsException {
46
47 final BasicHeaderSegment bhs = pdu.getBasicHeaderSegment();
48 final SCSICommandParser parser = (SCSICommandParser) bhs.getParser();
49
50 ProtocolDataUnit responsePDU = null;
51
52
53 final RequestSenseCdb cdb = new RequestSenseCdb(parser.getCDB());
54 final FieldPointerSenseKeySpecificData[] illegalFieldPointers = cdb.getIllegalFieldPointers();
55
56 if (illegalFieldPointers != null) {
57
58
59 SenseData senseData;
60
61 if (cdb.getDescriptorFormat()) {
62
63
64 senseData = new DescriptorFormatSenseData(ErrorType.CURRENT,
65 SenseKey.ILLEGAL_REQUEST,
66 AdditionalSenseCodeAndQualifier.INVALID_FIELD_IN_CDB,
67
68
69
70
71 new SenseDataDescriptor[0]);
72
73 } else {
74
75
76 senseData = new FixedFormatSenseData(false,
77 ErrorType.CURRENT,
78 false,
79 false,
80 false,
81 SenseKey.ILLEGAL_REQUEST,
82 new FourByteInformation(),
83 new FourByteInformation(),
84
85 AdditionalSenseCodeAndQualifier.INVALID_FIELD_IN_CDB,
86
87
88
89
90 (byte) 0,
91 illegalFieldPointers[0],
92
93 new AdditionalSenseBytes());
94 }
95
96 responsePDU = TargetPduFactory.createSCSIResponsePdu(false,
97 false,
98 false,
99 false,
100 SCSIResponseParser.ServiceResponse.TARGET_FAILURE,
101 SCSIStatus.CHECK_CONDITION,
102 bhs.getInitiatorTaskTag(),
103 0,
104 0,
105 0,
106 0,
107 new ScsiResponseDataSegment(senseData, parser.getExpectedDataTransferLength()));
108
109
110 } else {
111
112
113
114
115
116
117
118 SenseData senseData;
119
120 final SenseKey senseKey = SenseKey.NO_SENSE;
121 final AdditionalSenseCodeAndQualifier additionalSense = AdditionalSenseCodeAndQualifier.NO_ADDITIONAL_SENSE_INFORMATION;
122
123 if (cdb.getDescriptorFormat()) {
124
125
126 senseData = new DescriptorFormatSenseData(ErrorType.CURRENT,
127 senseKey,
128 additionalSense,
129 new SenseDataDescriptor[0]);
130
131 } else {
132
133
134 senseData = new FixedFormatSenseData(false,
135 ErrorType.CURRENT,
136 false,
137 false,
138 false,
139 senseKey,
140 new FourByteInformation(),
141 new FourByteInformation(),
142
143 additionalSense,
144 (byte) 0,
145 null,
146
147 null);
148 }
149
150 responsePDU = TargetPduFactory.createSCSIResponsePdu(false,
151 false,
152 false,
153 false,
154 SCSIResponseParser.ServiceResponse.COMMAND_COMPLETED_AT_TARGET,
155 SCSIStatus.GOOD,
156 bhs.getInitiatorTaskTag(),
157 0,
158 0,
159 0,
160 0,
161 new ScsiResponseDataSegment(senseData, parser.getExpectedDataTransferLength()));
162
163 }
164
165
166 connection.sendPdu(responsePDU);
167 }
168
169 }