1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.jscsi.initiator.connection.state;
20
21
22 import org.jscsi.exception.InternetSCSIException;
23 import org.jscsi.exception.OperationalTextKeyException;
24 import org.jscsi.initiator.connection.Connection;
25 import org.jscsi.parser.ProtocolDataUnit;
26 import org.jscsi.parser.datasegment.IDataSegmentIterator;
27 import org.jscsi.parser.datasegment.OperationalTextKey;
28 import org.jscsi.parser.r2t.Ready2TransferParser;
29 import org.jscsi.parser.scsi.SCSIResponseParser;
30 import org.jscsi.parser.scsi.SCSIStatus;
31
32
33
34
35
36
37
38
39
40 public final class WriteSecondResponseState extends AbstractState {
41
42
43
44
45
46 private final IDataSegmentIterator iterator;
47
48
49 private final int dataSequenceNumber;
50
51
52 private final int bufferOffset;
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public WriteSecondResponseState (final Connection initConnection, final IDataSegmentIterator initIterator, final int initDataSequenceNumber, final int initBufferOffset) {
67
68 super(initConnection);
69 iterator = initIterator;
70 dataSequenceNumber = initDataSequenceNumber;
71 bufferOffset = initBufferOffset;
72 }
73
74
75
76
77
78 public final void execute () throws InternetSCSIException {
79
80 final ProtocolDataUnit protocolDataUnit = connection.receive();
81 LOGGER.trace("1" + protocolDataUnit);
82 if (protocolDataUnit.getBasicHeaderSegment().getParser() instanceof Ready2TransferParser) {
83 LOGGER.trace("2");
84 final Ready2TransferParser parser = (Ready2TransferParser) protocolDataUnit.getBasicHeaderSegment().getParser();
85
86 final int targetTransferTag = parser.getTargetTransferTag();
87 if (LOGGER.isDebugEnabled()) {
88 LOGGER.debug("R2T has TTT set to " + targetTransferTag);
89 }
90
91 final int desiredDataTransferLength = parser.getDesiredDataTransferLength();
92 if (desiredDataTransferLength > connection.getSettingAsInt(OperationalTextKey.MAX_BURST_LENGTH)) {
93 if (LOGGER.isErrorEnabled()) {
94 LOGGER.error("MaxBurstLength limit is exceed.");
95 }
96 throw new InternetSCSIException("MaxBurstLength limit is exceed.");
97 }
98
99 connection.nextState(new WriteSecondBurstState(connection, iterator, targetTransferTag, desiredDataTransferLength, dataSequenceNumber, bufferOffset));
100 super.stateFollowing = true;
101
102 return;
103 } else if (protocolDataUnit.getBasicHeaderSegment().getParser() instanceof SCSIResponseParser) {
104 final SCSIResponseParser parser = (SCSIResponseParser) protocolDataUnit.getBasicHeaderSegment().getParser();
105
106 if (!iterator.hasNext() && parser.getStatus() == SCSIStatus.GOOD) {
107 connection.getSession().incrementInitiatorTaskTag();
108
109 super.stateFollowing = false;
110 return;
111 }
112 }
113
114 throw new RuntimeException(protocolDataUnit.getBasicHeaderSegment().getParser().toString());
115 }
116
117
118
119
120
121 @Override
122 public final Exception isCorrect (final ProtocolDataUnit protocolDataUnit) {
123
124
125 try {
126 if (!connection.getSettingAsBoolean(OperationalTextKey.DATA_PDU_IN_ORDER) && !connection.getSettingAsBoolean(OperationalTextKey.DATA_SEQUENCE_IN_ORDER)) {
127 return new UnsupportedOperationException(new StringBuilder(OperationalTextKey.DATA_PDU_IN_ORDER.toString()).append(" is yet not supported.").toString());
128 } else {
129 return null;
130 }
131 } catch (OperationalTextKeyException e) {
132 return e;
133 }
134
135 }
136
137
138
139
140
141
142 }