From 815e9e47bee0fcc4b6fa38f0bd2a23fc81a8abed Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 18 Dec 2025 14:34:56 +0000 Subject: [PATCH] - changed timeouts on client side from real time to monotonic time (LIB61850-535) --- src/mms/iso_client/iso_client_connection.c | 18 +++++++++--------- src/mms/iso_mms/client/mms_client_connection.c | 14 +++++++------- src/mms/iso_mms/client/mms_client_files.c | 9 +++------ 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/mms/iso_client/iso_client_connection.c b/src/mms/iso_client/iso_client_connection.c index b6786f13..66d96285 100644 --- a/src/mms/iso_client/iso_client_connection.c +++ b/src/mms/iso_client/iso_client_connection.c @@ -353,7 +353,7 @@ IsoClientConnection_handleConnection(IsoClientConnection self) { if (sendConnectionRequestMessage(self)) { - self->nextReadTimeout = Hal_getTimeInMs() + self->readTimeoutInMs; + self->nextReadTimeout = Hal_getMonotonicTimeInMs() + self->readTimeoutInMs; nextState = INT_STATE_WAIT_FOR_COTP_CONNECT_RESP; } else @@ -373,7 +373,7 @@ IsoClientConnection_handleConnection(IsoClientConnection self) { /* check connect timeout */ - uint64_t currentTime = Hal_getTimeInMs(); + uint64_t currentTime = Hal_getMonotonicTimeInMs(); if (currentTime > self->nextReadTimeout) { @@ -392,7 +392,7 @@ IsoClientConnection_handleConnection(IsoClientConnection self) case INT_STATE_WAIT_FOR_COTP_CONNECT_RESP: { - uint64_t currentTime = Hal_getTimeInMs(); + uint64_t currentTime = Hal_getMonotonicTimeInMs(); if (currentTime > self->nextReadTimeout) { @@ -428,7 +428,7 @@ IsoClientConnection_handleConnection(IsoClientConnection self) { sendAcseInitiateRequest(self); - self->nextReadTimeout = Hal_getTimeInMs() + self->readTimeoutInMs; + self->nextReadTimeout = Hal_getMonotonicTimeInMs() + self->readTimeoutInMs; nextState = INT_STATE_WAIT_FOR_ACSE_RESP; } @@ -453,7 +453,7 @@ IsoClientConnection_handleConnection(IsoClientConnection self) case INT_STATE_WAIT_FOR_ACSE_RESP: { - uint64_t currentTime = Hal_getTimeInMs(); + uint64_t currentTime = Hal_getMonotonicTimeInMs(); if (currentTime > self->nextReadTimeout) { @@ -706,13 +706,13 @@ IsoClientConnection_associateAsync(IsoClientConnection self, uint32_t connectTim self->readTimeoutInMs = readTimeoutInMs; /* set timeout for connect */ - self->nextReadTimeout = Hal_getTimeInMs() + connectTimeoutInMs; + self->nextReadTimeout = Hal_getMonotonicTimeInMs() + connectTimeoutInMs; /* Connect to Local Ip Address*/ if (self->parameters->localIpAddress) { Socket_bind(self->socket, self->parameters->localIpAddress, self->parameters->localTcpPort); } - + if (Socket_connectAsync(self->socket, self->parameters->hostname, self->parameters->tcpPort) == false) { Socket_destroy(self->socket); @@ -725,9 +725,9 @@ IsoClientConnection_associateAsync(IsoClientConnection self, uint32_t connectTim success = false; } - + Semaphore_post(self->tickMutex); - + return success; } diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index 6eb3f76a..f3dbfab5 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -296,7 +296,7 @@ addToOutstandingCalls(MmsConnection self, uint32_t invokeId, eMmsOutstandingCall { self->outstandingCalls[i].isUsed = true; self->outstandingCalls[i].invokeId = invokeId; - self->outstandingCalls[i].timeout = Hal_getTimeInMs() + self->requestTimeout; + self->outstandingCalls[i].timeout = Hal_getMonotonicTimeInMs() + self->requestTimeout; self->outstandingCalls[i].type = type; self->outstandingCalls[i].userCallback = userCallback; self->outstandingCalls[i].userParameter = userParameter; @@ -1083,7 +1083,7 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload) { /* check timeouts */ - uint64_t currentTime = Hal_getTimeInMs(); + uint64_t currentTime = Hal_getMonotonicTimeInMs(); int i = 0; @@ -1171,7 +1171,7 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload) return false; } - if (payload != NULL) + if (payload != NULL) { if (ByteBuffer_getSize(payload) < 1) { return false; @@ -2030,9 +2030,9 @@ MmsConnection_abort(MmsConnection self, MmsError* mmsError) { IsoClientConnection_abortAsync(self->isoClient); - uint64_t timeout = Hal_getTimeInMs() + self->requestTimeout; + uint64_t timeout = Hal_getMonotonicTimeInMs() + self->requestTimeout; - while (Hal_getTimeInMs() < timeout) + while (Hal_getMonotonicTimeInMs() < timeout) { if (getConnectionState(self) == MMS_CONNECTION_STATE_CLOSED) { @@ -2044,7 +2044,7 @@ MmsConnection_abort(MmsConnection self, MmsError* mmsError) } } } - + if (success == false) { IsoClientConnection_close(self->isoClient); @@ -2117,7 +2117,7 @@ MmsConnection_concludeAsync(MmsConnection self, MmsError* mmsError, MmsConnectio self->concludeHandler = handler; self->concludeHandlerParameter = parameter; - self->concludeTimeout = Hal_getTimeInMs() + self->requestTimeout; + self->concludeTimeout = Hal_getMonotonicTimeInMs() + self->requestTimeout; IsoClientConnection_sendMessage(self->isoClient, concludeMessage); diff --git a/src/mms/iso_mms/client/mms_client_files.c b/src/mms/iso_mms/client/mms_client_files.c index f0abdf7b..633763eb 100644 --- a/src/mms/iso_mms/client/mms_client_files.c +++ b/src/mms/iso_mms/client/mms_client_files.c @@ -147,16 +147,14 @@ mmsClient_handleFileOpenRequest(MmsConnection connection, uint8_t* buffer, int b if (frsm != NULL) { - MmsOutstandingCall obtainFileCall = mmsClient_getMatchingObtainFileRequest(connection, filename); if (obtainFileCall) { - if (DEBUG_MMS_CLIENT) printf("MMS_CLIENT: file open is matching obtain file request for file %s\n", filename); - obtainFileCall->timeout = Hal_getTimeInMs() + connection->requestTimeout; + obtainFileCall->timeout = Hal_getMonotonicTimeInMs() + connection->requestTimeout; } FileHandle fileHandle = @@ -164,7 +162,6 @@ mmsClient_handleFileOpenRequest(MmsConnection connection, uint8_t* buffer, int b if (fileHandle != NULL) { - frsm->fileHandle = fileHandle; frsm->readPosition = filePosition; frsm->frsmId = getNextFrsmId(connection); @@ -207,7 +204,7 @@ mmsClient_handleFileReadRequest(MmsConnection connection, uint8_t* buffer, int b if (frsm) { if (frsm->obtainRequest) - frsm->obtainRequest->timeout = Hal_getTimeInMs() + connection->requestTimeout; + frsm->obtainRequest->timeout = Hal_getMonotonicTimeInMs() + connection->requestTimeout; #if defined(LIB61850_ENABLE_TEST_API) if (connection->fileReadArtificialDelayMs > 0) @@ -231,7 +228,7 @@ mmsClient_handleFileCloseRequest(MmsConnection connection, uint8_t* buffer, int if (frsm) { if (frsm->obtainRequest) - frsm->obtainRequest->timeout = Hal_getTimeInMs() + connection->requestTimeout; + frsm->obtainRequest->timeout = Hal_getMonotonicTimeInMs() + connection->requestTimeout; if (frsm->fileHandle) {