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 java.util.LinkedList;
23 import java.util.Queue;
24
25 import org.jscsi.exception.InternetSCSIException;
26 import org.jscsi.initiator.connection.Connection;
27 import org.jscsi.parser.OperationCode;
28 import org.jscsi.parser.ProtocolDataUnit;
29 import org.jscsi.parser.datasegment.DataSegmentFactory;
30 import org.jscsi.parser.datasegment.DataSegmentFactory.DataSegmentFormat;
31 import org.jscsi.parser.datasegment.IDataSegment;
32 import org.jscsi.parser.datasegment.IDataSegmentIterator;
33 import org.jscsi.parser.datasegment.IDataSegmentIterator.IDataSegmentChunk;
34 import org.jscsi.parser.datasegment.OperationalTextKey;
35 import org.jscsi.parser.datasegment.SettingsMap;
36 import org.jscsi.parser.login.ISID;
37 import org.jscsi.parser.login.LoginRequestParser;
38 import org.jscsi.parser.login.LoginStage;
39
40
41
42
43
44
45
46
47
48 public final class LoginRequestState extends AbstractState {
49
50
51
52
53
54
55
56 private static final byte MAXIMUM_VERSION = 0x00;
57
58
59
60
61 private static final byte MINIMUM_VERSION = 0x00;
62
63
64
65
66
67 private final LoginStage nextStage;
68
69
70
71
72
73
74
75
76
77
78
79 public LoginRequestState (final Connection initConnection, final LoginStage initNextStage) {
80
81 super(initConnection);
82 nextStage = initNextStage;
83 }
84
85
86
87
88
89 public final void execute () throws InternetSCSIException {
90
91 final SettingsMap loginParameters = connection.getSettings();
92 LOGGER.info("Sending these login parameters:\n" + loginParameters);
93
94 final int maxRecvDataSegmentLength = connection.getSettingAsInt(OperationalTextKey.MAX_RECV_DATA_SEGMENT_LENGTH);
95 final ISID isid = ISID.createRandom(System.currentTimeMillis());
96
97 LoginRequestParser loginRequest;
98 boolean continueFlag;
99
100 boolean finalFlag;
101 final IDataSegment dataSegment = DataSegmentFactory.create(loginParameters.asByteBuffer(), DataSegmentFormat.TEXT, maxRecvDataSegmentLength);
102 final IDataSegmentIterator iterator = dataSegment.iterator();
103 final Queue<ProtocolDataUnit> protocolDataUnits = new LinkedList<ProtocolDataUnit>();
104
105 IDataSegmentChunk dataSegmentChunk;
106 ProtocolDataUnit protocolDataUnit;
107 int bytes2Transfer = dataSegment.getLength();
108
109 while (bytes2Transfer > 0 && iterator.hasNext()) {
110
111 if (bytes2Transfer <= maxRecvDataSegmentLength) {
112
113 dataSegmentChunk = iterator.next(bytes2Transfer);
114 continueFlag = false;
115 } else {
116 dataSegmentChunk = iterator.next(maxRecvDataSegmentLength);
117 continueFlag = true;
118 }
119
120 finalFlag = !continueFlag;
121 protocolDataUnit = protocolDataUnitFactory.create(true, finalFlag, OperationCode.LOGIN_REQUEST, "None", "None");
122 loginRequest = (LoginRequestParser) protocolDataUnit.getBasicHeaderSegment().getParser();
123
124 loginRequest.setContinueFlag(continueFlag);
125 loginRequest.setCurrentStageNumber(connection.getSession().getPhase());
126 LOGGER.debug("Phase:\n" + loginRequest.getCurrentStageNumber());
127 if (finalFlag) {
128 loginRequest.setNextStageNumber(nextStage);
129 }
130 loginRequest.setMaxVersion(MAXIMUM_VERSION);
131 loginRequest.setMinVersion(MINIMUM_VERSION);
132
133 loginRequest.setInitiatorSessionID(isid);
134 loginRequest.setTargetSessionIdentifyingHandle(connection.getSession().getTargetSessionIdentifyingHandle());
135
136 protocolDataUnit.setDataSegment(dataSegmentChunk);
137
138 protocolDataUnits.offer(protocolDataUnit);
139 bytes2Transfer -= maxRecvDataSegmentLength;
140 }
141
142 connection.send(protocolDataUnits);
143 connection.nextState(new LoginResponseState(connection, nextStage));
144 super.stateFollowing = true;
145
146 }
147
148
149
150
151
152 }