Skip to content

Commit 54083d8

Browse files
committed
- CS104: fixed timeout T2 problem (S message was sent before timeout elapsed)
1 parent a563f36 commit 54083d8

File tree

4 files changed

+24
-15
lines changed

4 files changed

+24
-15
lines changed

examples/cs104-server3/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ public static void Main (string[] args)
236236

237237
server.EnqueueASDU (newAsdu);
238238

239-
waitTime = 1000;
239+
waitTime = 5000;
240240
}
241241
}
242242

lib60870/CS104/ClientConnection.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,15 @@ private void DebugLog(string msg)
6666
private int receiveCount = 0;
6767

6868
private int unconfirmedReceivedIMessages = 0; /* number of unconfirmed messages received */
69-
private Int64 lastConfirmationTime = System.Int64.MaxValue; /* timestamp when the last confirmation message was sent */
7069

7170
/* T3 parameter handling */
7271
private UInt64 nextT3Timeout;
7372
private int outStandingTestFRConMessages = 0;
7473

74+
/* T2 parameter handling */
75+
private bool timeoutT2Triggered = false;
76+
private Int64 lastConfirmationTime = System.Int64.MaxValue; /* timestamp when the last confirmation message was sent */
77+
7578
private TlsSecurityInformation tlsSecInfo = null;
7679

7780
private APCIParameters apciParameters;
@@ -85,8 +88,6 @@ private void DebugLog(string msg)
8588

8689
private Queue<BufferFrame> waitingASDUsHighPrio = null;
8790

88-
private bool firstIMessageReceived = false;
89-
9091
/* data structure for k-size sent ASDU buffer */
9192
private struct SentASDU
9293
{
@@ -317,6 +318,7 @@ private int SendIMessage(BufferFrame asdu)
317318
DebugLog("SEND I (size = " + msgSize + ") : " + BitConverter.ToString(buffer, 0, msgSize));
318319
sendCount = (sendCount + 1) % 32768;
319320
unconfirmedReceivedIMessages = 0;
321+
timeoutT2Triggered = false;
320322
}
321323
}
322324
catch (System.IO.IOException) {
@@ -768,8 +770,8 @@ private bool HandleMessage(byte[] buffer, int msgSize)
768770
return false;
769771
}
770772

771-
if (firstIMessageReceived == false) {
772-
firstIMessageReceived = true;
773+
if (timeoutT2Triggered == false) {
774+
timeoutT2Triggered = true;
773775
lastConfirmationTime = currentTime; /* start timeout T2 */
774776
}
775777

@@ -904,6 +906,7 @@ private bool handleTimeouts() {
904906

905907
lastConfirmationTime = (long) currentTime;
906908
unconfirmedReceivedIMessages = 0;
909+
timeoutT2Triggered = false;
907910
SendSMessage ();
908911
}
909912
}
@@ -1056,8 +1059,8 @@ private void HandleConnection()
10561059

10571060
if (unconfirmedReceivedIMessages >= apciParameters.W) {
10581061
lastConfirmationTime = SystemUtils.currentTimeMillis();
1059-
10601062
unconfirmedReceivedIMessages = 0;
1063+
timeoutT2Triggered = false;
10611064
SendSMessage ();
10621065
}
10631066
}

lib60870/CS104/Connection.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,10 @@ private struct SentASDU
209209
private Thread workerThread = null;
210210

211211
private int unconfirmedReceivedIMessages; /* number of unconfirmed messages received */
212+
213+
/* T2 timeout handling */
212214
private long lastConfirmationTime; /* timestamp when the last confirmation message was sent */
215+
private bool timeoutT2Triggered = false;
213216

214217
private Socket socket = null;
215218
private Stream netStream = null;
@@ -225,7 +228,6 @@ private struct SentASDU
225228
private bool running = false;
226229
private bool connecting = false;
227230
private bool socketError;
228-
private bool firstIMessageReceived = false;
229231
private SocketException lastException;
230232

231233
private static int connectionCounter = 0;
@@ -334,7 +336,7 @@ private void ResetConnection()
334336
receiveSequenceNumber = 0;
335337
unconfirmedReceivedIMessages = 0;
336338
lastConfirmationTime = System.Int64.MaxValue;
337-
firstIMessageReceived = false;
339+
timeoutT2Triggered = false;
338340
outStandingTestFRConMessages = 0;
339341

340342
uMessageTimeout = 0;
@@ -519,13 +521,13 @@ private int SendIMessage(ASDU asdu)
519521

520522
if (running)
521523
{
522-
//socket.Send (buffer, msgSize, SocketFlags.None);
523-
524524
netStream.Write(buffer, 0, msgSize);
525525

526526
sendSequenceNumber = (sendSequenceNumber + 1) % 32768;
527527
statistics.SentMsgCounter++;
528+
528529
unconfirmedReceivedIMessages = 0;
530+
timeoutT2Triggered = false;
529531

530532
if (sentMessageHandler != null)
531533
{
@@ -1157,9 +1159,9 @@ private bool checkMessage(byte[] buffer, int msgSize)
11571159
if ((buffer[2] & 1) == 0)
11581160
{ /* I format frame */
11591161

1160-
if (firstIMessageReceived == false)
1162+
if (timeoutT2Triggered == false)
11611163
{
1162-
firstIMessageReceived = true;
1164+
timeoutT2Triggered = true;
11631165
lastConfirmationTime = currentTime; /* start timeout T2 */
11641166
}
11651167

@@ -1393,10 +1395,11 @@ private bool handleTimeouts()
13931395
if (unconfirmedReceivedIMessages > 0)
13941396
{
13951397
if (checkConfirmTimeout((long)currentTime))
1396-
{
1397-
1398+
{
13981399
lastConfirmationTime = (long)currentTime;
1400+
13991401
unconfirmedReceivedIMessages = 0;
1402+
timeoutT2Triggered = false;
14001403

14011404
SendSMessage(); /* send confirmation message */
14021405
}
@@ -1635,6 +1638,8 @@ private void HandleConnection()
16351638
lastConfirmationTime = SystemUtils.currentTimeMillis();
16361639

16371640
unconfirmedReceivedIMessages = 0;
1641+
timeoutT2Triggered = false;
1642+
16381643
SendSMessage();
16391644
}
16401645

lib60870/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
[assembly: NeutralResourcesLanguage("")]
2020
[assembly: InternalsVisibleTo("lib60870-tests")]
2121
[assembly: InternalsVisibleTo("lib60870.NET")]
22+
[assembly: InternalsVisibleTo("lib60870.NET.CS103")]
2223
// The following attributes are used to specify the signing key for the assembly,
2324
// if desired. See the Mono documentation for more information about signing.
2425
//[assembly: AssemblyDelaySign(false)]

0 commit comments

Comments
 (0)