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.SendDiagnosticCdb;
17 import org.jscsi.target.scsi.sense.senseDataDescriptor.senseKeySpecific.FieldPointerSenseKeySpecificData;
18 import org.jscsi.target.settings.SettingsException;
19
20
21
22
23
24
25
26
27
28
29 public class SendDiagnosticStage extends TargetFullFeatureStage {
30
31 public SendDiagnosticStage (TargetFullFeaturePhase targetFullFeaturePhase) {
32 super(targetFullFeaturePhase);
33 }
34
35 @Override
36 public void execute (ProtocolDataUnit pdu) throws IOException , InterruptedException , InternetSCSIException , DigestException , SettingsException {
37
38 final BasicHeaderSegment bhs = pdu.getBasicHeaderSegment();
39 final SCSICommandParser parser = (SCSICommandParser) bhs.getParser();
40
41 ProtocolDataUnit responsePdu = null;
42
43
44 final SendDiagnosticCdb cdb = new SendDiagnosticCdb(parser.getCDB());
45 final FieldPointerSenseKeySpecificData[] illegalFieldPointers = cdb.getIllegalFieldPointers();
46
47 if (illegalFieldPointers != null) {
48
49
50 responsePdu = createFixedFormatErrorPdu(illegalFieldPointers,
51 bhs.getInitiatorTaskTag(),
52 parser.getExpectedDataTransferLength());
53
54 } else {
55
56
57
58
59
60
61
62
63
64
65 responsePdu = TargetPduFactory.createSCSIResponsePdu(false,
66 false,
67 false,
68 false,
69 SCSIResponseParser.ServiceResponse.COMMAND_COMPLETED_AT_TARGET,
70 SCSIStatus.GOOD,
71 bhs.getInitiatorTaskTag(),
72 0,
73 0,
74 0,
75 0,
76 ScsiResponseDataSegment.EMPTY_DATA_SEGMENT);
77
78 }
79
80
81 connection.sendPdu(responsePdu);
82 }
83
84 }