From 5c3fd679a8740eef5092d1cb8e6bc403e2028e1e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 9 May 2024 14:48:45 +0100 Subject: [PATCH] - code format changes - IED server: added function IedServer_ignoreReadAccess --- src/iec61850/client/client_report_control.c | 45 +- src/iec61850/client/ied_connection.c | 877 +++++++++++------- src/iec61850/inc/iec61850_server.h | 9 + .../inc_private/ied_connection_private.h | 11 +- src/iec61850/inc_private/ied_server_private.h | 3 +- src/iec61850/server/impl/client_connection.c | 13 +- src/iec61850/server/impl/ied_server.c | 36 +- src/iec61850/server/mms_mapping/control.c | 563 ++++++----- src/iec61850/server/mms_mapping/mms_mapping.c | 68 +- 9 files changed, 1024 insertions(+), 601 deletions(-) diff --git a/src/iec61850/client/client_report_control.c b/src/iec61850/client/client_report_control.c index 6affd50e..65967cdb 100644 --- a/src/iec61850/client/client_report_control.c +++ b/src/iec61850/client/client_report_control.c @@ -528,39 +528,44 @@ readObjectHandlerInternal(uint32_t invokeId, void* parameter, MmsError err, MmsV IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { - + if (call) + { IedConnection_GetRCBValuesHandler handler = (IedConnection_GetRCBValuesHandler) call->callback; ClientReportControlBlock updateRcb = (ClientReportControlBlock) call->specificParameter; char* rcbReference = (char*) call->specificParameter2.pointer; - - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { handler(invokeId, call->callbackParameter, iedConnection_mapMmsErrorToIedError(err), NULL); } - else { - - if (value == NULL) { + else + { + if (value == NULL) + { handler(invokeId, call->callbackParameter, IED_ERROR_OBJECT_DOES_NOT_EXIST, NULL); } - else { - if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) { + else + { + if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) + { if (DEBUG_IED_CLIENT) printf("DEBUG_IED_CLIENT: getRCBValues returned data-access-error!\n"); handler(invokeId, call->callbackParameter, iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)), NULL); } - else { - + else + { ClientReportControlBlock returnRcb = updateRcb; if (returnRcb == NULL) returnRcb = ClientReportControlBlock_create(rcbReference); - if (clientReportControlBlock_updateValues(returnRcb, value)) { + if (clientReportControlBlock_updateValues(returnRcb, value)) + { handler(invokeId, call->callbackParameter, IED_ERROR_OK, returnRcb); } - else { + else + { if (DEBUG_IED_CLIENT) printf("DEBUG_IED_CLIENT: getRCBValues returned wrong type!\n"); @@ -569,19 +574,18 @@ readObjectHandlerInternal(uint32_t invokeId, void* parameter, MmsError err, MmsV if (updateRcb == NULL) ClientReportControlBlock_destroy(returnRcb); } - } MmsValue_delete(value); } - } GLOBAL_FREEMEM(rcbReference); iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -598,7 +602,8 @@ IedConnection_getRCBValuesAsync(IedConnection self, IedClientError* error, const char* domainName = MmsMapping_getMmsDomainFromObjectReference(rcbReference, domainId); - if (domainName == NULL) { + if (domainName == NULL) + { *error = IED_ERROR_USER_PROVIDED_INVALID_ARGUMENT; return 0; } @@ -608,7 +613,8 @@ IedConnection_getRCBValuesAsync(IedConnection self, IedClientError* error, const IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -627,7 +633,8 @@ IedConnection_getRCBValuesAsync(IedConnection self, IedClientError* error, const *error = iedConnection_mapMmsErrorToIedError(err); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { GLOBAL_FREEMEM(call->specificParameter2.pointer); iedConnection_releaseOutstandingCall(self, call); return 0; diff --git a/src/iec61850/client/ied_connection.c b/src/iec61850/client/ied_connection.c index 014f204f..cf363c3b 100644 --- a/src/iec61850/client/ied_connection.c +++ b/src/iec61850/client/ied_connection.c @@ -1,7 +1,7 @@ /* * ied_connection.c * - * Copyright 2013-2023 Michael Zillgith + * Copyright 2013-2024 Michael Zillgith * * This file is part of libIEC61850. * @@ -47,7 +47,8 @@ struct sClientDataSet MmsValue* dataSetValues; /* MmsValue instance of type MMS_ARRAY */ }; -struct sFileDirectoryEntry { +struct sFileDirectoryEntry +{ char* fileName; uint32_t fileSize; uint64_t lastModified; @@ -271,8 +272,10 @@ iedConnection_allocateOutstandingCall(IedConnection self) int i = 0; - for (i = 0; i < OUTSTANDING_CALLS; i++) { - if (self->outstandingCalls[i].used == false) { + for (i = 0; i < OUTSTANDING_CALLS; i++) + { + if (self->outstandingCalls[i].used == false) + { self->outstandingCalls[i].used = true; call = &(self->outstandingCalls[i]); break; @@ -303,8 +306,10 @@ iedConnection_lookupOutstandingCall(IedConnection self, uint32_t invokeId) int i = 0; - for (i = 0; i < OUTSTANDING_CALLS; i++) { - if ((self->outstandingCalls[i].used) && (self->outstandingCalls[i].invokeId == invokeId)) { + for (i = 0; i < OUTSTANDING_CALLS; i++) + { + if ((self->outstandingCalls[i].used) && (self->outstandingCalls[i].invokeId == invokeId)) + { call = &(self->outstandingCalls[i]); break; } @@ -1121,7 +1126,8 @@ IedConnection_getServerDirectoryAsync(IedConnection self, IedClientError* error, MmsConnection_getDomainNamesAsync(self->connection, &(call->invokeId), &err, continueAfter, result, getNameListHandler, self); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(err); iedConnection_releaseOutstandingCall(self, call); @@ -1153,7 +1159,8 @@ IedConnection_getLogicalDeviceVariablesAsync(IedConnection self, IedClientError* MmsConnection_getDomainVariableNamesAsync(self->connection, &(call->invokeId), &err, ldName, continueAfter, result, getNameListHandler, self); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(err); iedConnection_releaseOutstandingCall(self, call); @@ -1185,7 +1192,8 @@ IedConnection_getLogicalDeviceDataSetsAsync(IedConnection self, IedClientError* MmsConnection_getDomainVariableListNamesAsync(self->connection, &(call->invokeId), &err, ldName, continueAfter, result, getNameListHandler, self); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(err); iedConnection_releaseOutstandingCall(self, call); @@ -1206,15 +1214,16 @@ readObjectHandlerInternal(uint32_t invokeId, void* parameter, MmsError err, MmsV IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { - + if (call) + { IedConnection_ReadObjectHandler handler = (IedConnection_ReadObjectHandler) call->callback; handler(invokeId, call->callbackParameter, iedConnection_mapMmsErrorToIedError(err), value); iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -1235,14 +1244,16 @@ IedConnection_readObjectAsync(IedConnection self, IedClientError* error, const c domainId = MmsMapping_getMmsDomainFromObjectReference(objRef, domainIdBuffer); itemId = MmsMapping_createMmsVariableNameFromObjectReference(objRef, fc, itemIdBuffer); - if ((domainId == NULL) || (itemId == NULL)) { + if ((domainId == NULL) || (itemId == NULL)) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -1255,15 +1266,18 @@ IedConnection_readObjectAsync(IedConnection self, IedClientError* error, const c /* check if item ID contains an array "(..)" */ char* brace = strchr(itemId, '('); - if (brace) { + if (brace) + { char* secondBrace = strchr(brace, ')'); - if (secondBrace) { + if (secondBrace) + { char* endPtr; int index = (int) strtol(brace + 1, &endPtr, 10); - if (endPtr == secondBrace) { + if (endPtr == secondBrace) + { char* component = NULL; if (strlen(secondBrace + 1) > 1) @@ -1282,8 +1296,8 @@ IedConnection_readObjectAsync(IedConnection self, IedClientError* error, const c else MmsConnection_readVariableAsync(self->connection, &(call->invokeId), &err, domainId, itemId, readObjectHandlerInternal, self); - if ((err != MMS_ERROR_NONE) || (*error != IED_ERROR_OK)) { - + if ((err != MMS_ERROR_NONE) || (*error != IED_ERROR_OK)) + { if (err != MMS_ERROR_NONE) { *error = iedConnection_mapMmsErrorToIedError(err); } @@ -1296,7 +1310,6 @@ IedConnection_readObjectAsync(IedConnection self, IedClientError* error, const c return call->invokeId; } - MmsValue* IedConnection_readObject(IedConnection self, IedClientError* error, const char* objectReference, FunctionalConstraint fc) @@ -1311,7 +1324,8 @@ IedConnection_readObject(IedConnection self, IedClientError* error, const char* domainId = MmsMapping_getMmsDomainFromObjectReference(objectReference, domainIdBuffer); itemId = MmsMapping_createMmsVariableNameFromObjectReference(objectReference, fc, itemIdBuffer); - if ((domainId == NULL) || (itemId == NULL)) { + if ((domainId == NULL) || (itemId == NULL)) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -1321,15 +1335,18 @@ IedConnection_readObject(IedConnection self, IedClientError* error, const char* /* check if item ID contains an array "(..)" */ char* brace = strchr(itemId, '('); - if (brace) { + if (brace) + { char* secondBrace = strchr(brace, ')'); - if (secondBrace) { + if (secondBrace) + { char* endPtr; int index = (int) strtol(brace + 1, &endPtr, 10); - if (endPtr == secondBrace) { + if (endPtr == secondBrace) + { char* component = NULL; if (strlen(secondBrace + 1) > 1) @@ -1363,10 +1380,12 @@ IedConnection_readBooleanValue(IedConnection self, IedClientError* error, const bool retVal = false; - if (value != NULL) { + if (value != NULL) + { if (MmsValue_getType(value) == MMS_BOOLEAN) retVal = MmsValue_getBoolean(value); - else { + else + { if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) *error = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)); else @@ -1386,10 +1405,12 @@ IedConnection_readFloatValue(IedConnection self, IedClientError* error, const ch float retVal = 0.f; - if (value != NULL) { + if (value != NULL) + { if (MmsValue_getType(value) == MMS_FLOAT) retVal = MmsValue_toFloat(value); - else { + else + { if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) *error = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)); else @@ -1409,10 +1430,12 @@ IedConnection_readStringValue(IedConnection self, IedClientError* error, const c char* retVal = NULL; - if (value != NULL) { + if (value != NULL) + { if ((MmsValue_getType(value) == MMS_VISIBLE_STRING) || (MmsValue_getType(value) == MMS_STRING)) retVal = StringUtils_copyString(MmsValue_toString(value)); - else { + else + { if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) *error = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)); else @@ -1432,10 +1455,12 @@ IedConnection_readInt32Value(IedConnection self, IedClientError* error, const ch int32_t retVal = 0; - if (value != NULL) { + if (value != NULL) + { if ((MmsValue_getType(value) == MMS_INTEGER) || (MmsValue_getType(value) == MMS_UNSIGNED)) retVal = MmsValue_toInt32(value); - else { + else + { if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) *error = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)); else @@ -1455,10 +1480,12 @@ IedConnection_readUnsigned32Value(IedConnection self, IedClientError* error, con uint32_t retVal = 0; - if (value != NULL) { + if (value != NULL) + { if ((MmsValue_getType(value) == MMS_INTEGER) || (MmsValue_getType(value) == MMS_UNSIGNED)) retVal = MmsValue_toUint32(value); - else { + else + { if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) *error = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)); else @@ -1478,10 +1505,12 @@ IedConnection_readInt64Value(IedConnection self, IedClientError* error, const ch int64_t retVal = 0; - if (value != NULL) { + if (value != NULL) + { if ((MmsValue_getType(value) == MMS_INTEGER) || (MmsValue_getType(value) == MMS_UNSIGNED)) retVal = MmsValue_toInt64(value); - else { + else + { if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) *error = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)); else @@ -1502,15 +1531,17 @@ IedConnection_readTimestampValue(IedConnection self, IedClientError* error, cons Timestamp* retVal = timeStamp; - if (value != NULL) { - if (MmsValue_getType(value) == MMS_UTC_TIME) { - + if (value != NULL) + { + if (MmsValue_getType(value) == MMS_UTC_TIME) + { if (retVal == NULL) retVal = (Timestamp*) GLOBAL_MALLOC(sizeof(Timestamp)); memcpy(retVal->val, value->value.utcTime, 8); } - else { + else + { if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) *error = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)); else @@ -1531,12 +1562,13 @@ IedConnection_readQualityValue(IedConnection self, IedClientError* error, const Quality quality = QUALITY_VALIDITY_GOOD; - if (value != NULL) { - + if (value != NULL) + { if ((MmsValue_getType(value) == MMS_BIT_STRING) && (MmsValue_getBitStringSize(value) == 13)) { quality = Quality_fromMmsValue(value); } - else { + else + { if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) *error = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)); else @@ -1563,7 +1595,8 @@ IedConnection_writeObject(IedConnection self, IedClientError* error, const char* domainId = MmsMapping_getMmsDomainFromObjectReference(objectReference, domainIdBuffer); itemId = MmsMapping_createMmsVariableNameFromObjectReference(objectReference, fc, itemIdBuffer); - if ((domainId == NULL) || (itemId == NULL)) { + if ((domainId == NULL) || (itemId == NULL)) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return; } @@ -1573,15 +1606,18 @@ IedConnection_writeObject(IedConnection self, IedClientError* error, const char* /* check if item ID contains an array "(..)" */ char* brace = strchr(itemId, '('); - if (brace) { + if (brace) + { char* secondBrace = strchr(brace, ')'); - if (secondBrace) { + if (secondBrace) + { char* endPtr; int index = (int) strtol(brace + 1, &endPtr, 10); - if (endPtr == secondBrace) { + if (endPtr == secondBrace) + { char* component = NULL; if (strlen(secondBrace + 1) > 1) @@ -1599,7 +1635,8 @@ IedConnection_writeObject(IedConnection self, IedClientError* error, const char* else *error = IED_ERROR_USER_PROVIDED_INVALID_ARGUMENT; } - else { + else + { MmsConnection_writeVariable(self->connection, &mmsError, domainId, itemId, value); *error = iedConnection_mapMmsErrorToIedError(mmsError); @@ -1613,8 +1650,8 @@ writeVariableHandler(uint32_t invokeId, void* parameter, MmsError err, MmsDataAc IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { - + if (call) + { IedConnection_GenericServiceHandler handler = (IedConnection_GenericServiceHandler) call->callback; IedClientError iedError = iedConnection_mapMmsErrorToIedError(err); @@ -1626,7 +1663,8 @@ writeVariableHandler(uint32_t invokeId, void* parameter, MmsError err, MmsDataAc iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -1647,14 +1685,16 @@ IedConnection_writeObjectAsync(IedConnection self, IedClientError* error, const domainId = MmsMapping_getMmsDomainFromObjectReference(objectReference, domainIdBuffer); itemId = MmsMapping_createMmsVariableNameFromObjectReference(objectReference, fc, itemIdBuffer); - if ((domainId == NULL) || (itemId == NULL)) { + if ((domainId == NULL) || (itemId == NULL)) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -1668,7 +1708,8 @@ IedConnection_writeObjectAsync(IedConnection self, IedClientError* error, const /* check if item ID contains an array "(..)" */ char* brace = strchr(itemId, '('); - if (brace) { + if (brace) + { char* secondBrace = strchr(brace, ')'); if (secondBrace) { @@ -1676,7 +1717,8 @@ IedConnection_writeObjectAsync(IedConnection self, IedClientError* error, const int index = (int) strtol(brace + 1, &endPtr, 10); - if (endPtr == secondBrace) { + if (endPtr == secondBrace) + { char* component = NULL; if (strlen(secondBrace + 1) > 1) @@ -1695,13 +1737,15 @@ IedConnection_writeObjectAsync(IedConnection self, IedClientError* error, const else *error = IED_ERROR_USER_PROVIDED_INVALID_ARGUMENT; } - else { + else + { MmsConnection_writeVariableAsync(self->connection, &(call->invokeId), &err, domainId, itemId, value, writeVariableHandler, self); *error = iedConnection_mapMmsErrorToIedError(err); } - if (*error != IED_ERROR_OK) { + if (*error != IED_ERROR_OK) + { iedConnection_releaseOutstandingCall(self, call); return 0; } @@ -1742,7 +1786,6 @@ IedConnection_writeInt32Value(IedConnection self, IedClientError* error, const c IedConnection_writeObject(self, error, objectReference, fc, &mmsValue); } - void IedConnection_writeUnsigned32Value(IedConnection self, IedClientError* error, const char* objectReference, FunctionalConstraint fc, uint32_t value) @@ -1811,9 +1854,10 @@ IedConnection_getDeviceModelFromServer(IedConnection self, IedClientError* error LinkedList logicalDeviceNames = MmsConnection_getDomainNames(self->connection, &mmsError); - if (logicalDeviceNames != NULL) { - - if (self->logicalDevices != NULL) { + if (logicalDeviceNames) + { + if (self->logicalDevices) + { LinkedList_destroyDeep(self->logicalDevices, (LinkedListValueDeleteFunction) ICLogicalDevice_destroy); self->logicalDevices = NULL; } @@ -1822,20 +1866,23 @@ IedConnection_getDeviceModelFromServer(IedConnection self, IedClientError* error LinkedList logicalDevices = LinkedList_create(); - while (logicalDevice != NULL) { + while (logicalDevice) + { char* name = (char*) logicalDevice->data; LinkedList variables = MmsConnection_getDomainVariableNames(self->connection, &mmsError, name); - if (variables != NULL) { + if (variables) + { ICLogicalDevice* icLogicalDevice = ICLogicalDevice_create(name); ICLogicalDevice_setVariableList(icLogicalDevice, variables); LinkedList_add(logicalDevices, icLogicalDevice); } - else { + else + { if (error) *error = iedConnection_mapMmsErrorToIedError(mmsError); break; @@ -1844,10 +1891,12 @@ IedConnection_getDeviceModelFromServer(IedConnection self, IedClientError* error logicalDevice = LinkedList_getNext(logicalDevice); } - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { LinkedList_destroyDeep(logicalDevices, (LinkedListValueDeleteFunction) ICLogicalDevice_destroy); } - else { + else + { self->logicalDevices = logicalDevices; } @@ -1862,19 +1911,22 @@ IedConnection_getLogicalDeviceList(IedConnection self, IedClientError* error) { *error = IED_ERROR_OK; - if (self->logicalDevices == NULL) { + if (self->logicalDevices == NULL) + { IedConnection_getDeviceModelFromServer(self, error); if (*error != IED_ERROR_OK) return NULL; } - if (self->logicalDevices != NULL) { + if (self->logicalDevices) + { LinkedList logicalDevice = LinkedList_getNext(self->logicalDevices); LinkedList logicalDeviceList = LinkedList_create(); - while (logicalDevice != NULL) { + while (logicalDevice) + { ICLogicalDevice* icLogicalDevice = (ICLogicalDevice*) logicalDevice->data; char* logicalDeviceName = StringUtils_copyString(icLogicalDevice->name); @@ -1889,7 +1941,8 @@ IedConnection_getLogicalDeviceList(IedConnection self, IedClientError* error) return logicalDeviceList; } - else { + else + { if (error) *error = IED_ERROR_UNKNOWN; @@ -1920,19 +1973,22 @@ IedConnection_getFileDirectory(IedConnection self, IedClientError* error, const bool moreFollows = false; - do { + do + { moreFollows = MmsConnection_getFileDirectory(self->connection, &mmsError, directoryName, continueAfter, mmsFileDirectoryHandler, fileNames); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(mmsError); LinkedList_destroyDeep(fileNames, (LinkedListValueDeleteFunction) FileDirectoryEntry_destroy); return NULL; } - if (moreFollows) { + if (moreFollows) + { FileDirectoryEntry lastDirectoryEntry = (FileDirectoryEntry) LinkedList_getData(LinkedList_getLastElement(fileNames)); @@ -1957,7 +2013,8 @@ IedConnection_getFileDirectoryEx(IedConnection self, IedClientError* error, cons bool moreFollowsInternal = MmsConnection_getFileDirectory(self->connection, &mmsError, directoryName, continueAfter, mmsFileDirectoryHandler, fileNames); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(mmsError); LinkedList_destroyDeep(fileNames, (LinkedListValueDeleteFunction) FileDirectoryEntry_destroy); @@ -1978,9 +2035,10 @@ fileDirectoryHandlerEx(uint32_t invokeId, void* parameter, MmsError err, char* f IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { - - if (call->specificParameter2.getFileDirectory.cont) { + if (call) + { + if (call->specificParameter2.getFileDirectory.cont) + { IedConnection_FileDirectoryEntryHandler handler = (IedConnection_FileDirectoryEntryHandler) call->callback; call->specificParameter2.getFileDirectory.cont = @@ -1990,7 +2048,8 @@ fileDirectoryHandlerEx(uint32_t invokeId, void* parameter, MmsError err, char* f if (filename == NULL) iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -2004,7 +2063,8 @@ IedConnection_getFileDirectoryAsyncEx(IedConnection self, IedClientError* error, IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -2018,7 +2078,8 @@ IedConnection_getFileDirectoryAsyncEx(IedConnection self, IedClientError* error, *error = iedConnection_mapMmsErrorToIedError(err); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { iedConnection_releaseOutstandingCall(self, call); return 0; } @@ -2058,7 +2119,8 @@ IedConnection_getFile(IedConnection self, IedClientError* error, const char* fil int32_t frsmId = MmsConnection_fileOpen(self->connection, &mmsError, fileName, 0, &fileSize, NULL); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(mmsError); return 0; } @@ -2069,17 +2131,20 @@ IedConnection_getFile(IedConnection self, IedClientError* error, const char* fil clientFileReadHandler.retVal = true; clientFileReadHandler.byteReceived = 0; - while (true) { + while (true) + { bool moreFollows = MmsConnection_fileRead(self->connection, &mmsError, frsmId, mmsFileReadHandler, &clientFileReadHandler); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(mmsError); return 0; } - if (clientFileReadHandler.retVal == false) { + if (clientFileReadHandler.retVal == false) + { *error = IED_ERROR_UNKNOWN; break; } @@ -2100,7 +2165,8 @@ mmsConnectionFileCloseHandler (uint32_t invokeId, void* parameter, MmsError mmsE { (void)success; - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: failed to close file error: %i (mms-error: %i)\n", iedConnection_mapMmsErrorToIedError(mmsError), mmsError); } @@ -2109,10 +2175,12 @@ mmsConnectionFileCloseHandler (uint32_t invokeId, void* parameter, MmsError mmsE IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { + if (call) + { iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -2126,46 +2194,53 @@ mmsConnectionFileReadHandler (uint32_t invokeId, void* parameter, MmsError mmsEr IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { - + if (call) + { IedConnection_GetFileAsyncHandler handler = (IedConnection_GetFileAsyncHandler) call->callback; - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { IedClientError err = iedConnection_mapMmsErrorToIedError(mmsError); handler(call->specificParameter2.getFileInfo.originalInvokeId, call->callbackParameter, err, invokeId, NULL, 0, false); - if (mmsError != MMS_ERROR_SERVICE_TIMEOUT) { + if (mmsError != MMS_ERROR_SERVICE_TIMEOUT) + { /* close file */ MmsConnection_fileCloseAsync(self->connection, &(call->invokeId), &mmsError, frsmId, mmsConnectionFileCloseHandler, self); if (mmsError != MMS_ERROR_NONE) iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: getFile timeout -> stop download\n"); iedConnection_releaseOutstandingCall(self, call); } } - else { + else + { bool cont = handler(call->specificParameter2.getFileInfo.originalInvokeId, call->callbackParameter, IED_ERROR_OK, invokeId, buffer, byteReceived, moreFollows); - if ((moreFollows == false) || (cont == false)) { + if ((moreFollows == false) || (cont == false)) + { /* close file */ MmsConnection_fileCloseAsync(self->connection, &(call->invokeId), &mmsError, frsmId, mmsConnectionFileCloseHandler, self); if (mmsError != MMS_ERROR_NONE) iedConnection_releaseOutstandingCall(self, call); } - else { + else + { /* send next read request */ MmsConnection_fileReadAsync(self->connection, &(call->invokeId), &mmsError, frsmId, mmsConnectionFileReadHandler, self); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { IedClientError err = iedConnection_mapMmsErrorToIedError(mmsError); handler(invokeId, call->callbackParameter, err, invokeId, NULL, 0, false); @@ -2173,16 +2248,16 @@ mmsConnectionFileReadHandler (uint32_t invokeId, void* parameter, MmsError mmsEr /* close file */ MmsConnection_fileCloseAsync(self->connection, &(call->invokeId), &mmsError, frsmId, mmsConnectionFileCloseHandler, self); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { iedConnection_releaseOutstandingCall(self, call); } - } } } - } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -2198,24 +2273,27 @@ mmsConnectionFileOpenHandler (uint32_t invokeId, void* parameter, MmsError mmsEr IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { - + if (call) + { IedConnection_GetFileAsyncHandler handler = (IedConnection_GetFileAsyncHandler) call->callback; call->specificParameter2.getFileInfo.originalInvokeId = invokeId; - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { IedClientError err = iedConnection_mapMmsErrorToIedError(mmsError); handler(invokeId, call->callbackParameter, err, invokeId, NULL, 0, false); iedConnection_releaseOutstandingCall(self, call); } - else { + else + { call->specificParameter2.getFileInfo.originalInvokeId = invokeId; MmsConnection_fileReadAsync(self->connection, &(call->invokeId), &mmsError, frsmId, mmsConnectionFileReadHandler, self); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { IedClientError err = iedConnection_mapMmsErrorToIedError(mmsError); handler(invokeId, call->callbackParameter, err, invokeId, NULL, 0, false); @@ -2227,9 +2305,9 @@ mmsConnectionFileOpenHandler (uint32_t invokeId, void* parameter, MmsError mmsEr iedConnection_releaseOutstandingCall(self, call); } } - } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -2244,7 +2322,8 @@ IedConnection_getFileAsync(IedConnection self, IedClientError* error, const char IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -2256,7 +2335,8 @@ IedConnection_getFileAsync(IedConnection self, IedClientError* error, const char *error = iedConnection_mapMmsErrorToIedError(err); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { iedConnection_releaseOutstandingCall(self, call); return 0; } @@ -2298,14 +2378,16 @@ deleteFileAndSetFileHandler (uint32_t invokeId, void* parameter, MmsError mmsErr IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { + if (call) + { IedConnection_GenericServiceHandler handler = (IedConnection_GenericServiceHandler) call->callback; handler(invokeId, call->callbackParameter, iedConnection_mapMmsErrorToIedError(mmsError)); iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -2319,7 +2401,8 @@ IedConnection_setFileAsync(IedConnection self, IedClientError* error, const char IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -2331,7 +2414,8 @@ IedConnection_setFileAsync(IedConnection self, IedClientError* error, const char *error = iedConnection_mapMmsErrorToIedError(err); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { iedConnection_releaseOutstandingCall(self, call); return 0; } @@ -2371,7 +2455,8 @@ IedConnection_deleteFileAsync(IedConnection self, IedClientError* error, const c *error = iedConnection_mapMmsErrorToIedError(err); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { iedConnection_releaseOutstandingCall(self, call); return 0; } @@ -2403,15 +2488,18 @@ IedConnection_getLogicalDeviceDirectory(IedConnection self, IedClientError* erro LinkedList logicalDevice = LinkedList_getNext(self->logicalDevices); - while (logicalDevice != NULL) { + while (logicalDevice) + { ICLogicalDevice* device = (ICLogicalDevice*) logicalDevice->data; - if (strcmp(device->name, logicalDeviceName) == 0) { + if (strcmp(device->name, logicalDeviceName) == 0) + { LinkedList logicalNodeNames = LinkedList_create(); LinkedList variable = LinkedList_getNext(device->variables); - while (variable != NULL) { + while (variable) + { char* variableName = (char*) variable->data; if (strchr(variableName, '$') == NULL) @@ -2436,7 +2524,8 @@ addToStringSet(LinkedList set, char* string) { LinkedList element = set; - while (LinkedList_getNext(element) != NULL) { + while (LinkedList_getNext(element) != NULL) + { if (strcmp((char*) LinkedList_getNext(element)->data, string) == 0) return false; @@ -2452,21 +2541,25 @@ addVariablesWithFc(char* fc, char* lnName, LinkedList variables, LinkedList lnDi { LinkedList variable = LinkedList_getNext(variables); - while (variable != NULL) { + while (variable) + { char* variableName = (char*) variable->data; char* fcPos = strchr(variableName, '$'); - if (fcPos != NULL) { + if (fcPos != NULL) + { if (memcmp(fcPos + 1, fc, 2) != 0) goto next_element; int lnNameLen = (int)(fcPos - variableName); - if (strncmp(variableName, lnName, lnNameLen) == 0) { + if (strncmp(variableName, lnName, lnNameLen) == 0) + { char* fcEndPos = strchr(fcPos + 1, '$'); - if (fcEndPos != NULL) { + if (fcEndPos != NULL) + { char* nameEndPos = strchr(fcEndPos + 1, '$'); if (nameEndPos == NULL) @@ -2491,7 +2584,8 @@ getLogicalNodeDirectoryLogs(IedConnection self, IedClientError* error, const cha LinkedList journals = MmsConnection_getDomainJournals(mmsCon, &mmsError, logicalDeviceName); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(mmsError); return NULL; } @@ -2500,17 +2594,19 @@ getLogicalNodeDirectoryLogs(IedConnection self, IedClientError* error, const cha LinkedList journal = LinkedList_getNext(journals); - while (journal != NULL) { - + while (journal) + { char* journalName = (char*) LinkedList_getData(journal); char* logName = strchr(journalName, '$'); - if (logName != NULL) { + if (logName) + { logName[0] = 0; logName += 1; - if (strcmp(journalName, logicalNodeName) == 0) { + if (strcmp(journalName, logicalNodeName) == 0) + { char* log = StringUtils_copyString(logName); LinkedList_add(logs, (void*) log); } @@ -2534,7 +2630,8 @@ getLogicalNodeDirectoryDataSets(IedConnection self, IedClientError* error, const LinkedList dataSets = MmsConnection_getDomainVariableListNames(mmsCon, &mmsError, logicalDeviceName); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(mmsError); return NULL; } @@ -2543,16 +2640,19 @@ getLogicalNodeDirectoryDataSets(IedConnection self, IedClientError* error, const LinkedList dataSet = LinkedList_getNext(dataSets); - while (dataSet != NULL) { + while (dataSet) + { char* dataSetName = (char*) LinkedList_getData(dataSet); char* lnDataSetName = strchr(dataSetName, '$'); - if (lnDataSetName != NULL) { + if (lnDataSetName) + { lnDataSetName[0] = 0; lnDataSetName += 1; - if (strcmp(dataSetName, logicalNodeName) == 0) { + if (strcmp(dataSetName, logicalNodeName) == 0) + { char* lnDataSet = StringUtils_copyString(lnDataSetName); LinkedList_add(lnDataSets, (void*) lnDataSet); } @@ -2572,7 +2672,8 @@ IedConnection_getLogicalNodeDirectory(IedConnection self, IedClientError* error, { *error = IED_ERROR_OK; - if (strlen(logicalNodeReference) > 129) { + if (strlen(logicalNodeReference) > 129) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -2583,7 +2684,8 @@ IedConnection_getLogicalNodeDirectory(IedConnection self, IedClientError* error, char* ldSep = strchr(lnRefCopy, '/'); - if (ldSep == NULL) { + if (ldSep == NULL) + { *error = IED_ERROR_USER_PROVIDED_INVALID_ARGUMENT; return NULL; } @@ -2612,10 +2714,12 @@ IedConnection_getLogicalNodeDirectory(IedConnection self, IedClientError* error, ICLogicalDevice* ld = NULL; - while (device != NULL) { + while (device) + { ICLogicalDevice* ldCandidate = (ICLogicalDevice*) device->data; - if (strcmp(logicalDeviceName, ldCandidate->name) == 0) { + if (strcmp(logicalDeviceName, ldCandidate->name) == 0) + { ld = ldCandidate; break; } @@ -2623,25 +2727,28 @@ IedConnection_getLogicalNodeDirectory(IedConnection self, IedClientError* error, device = LinkedList_getNext(device); } - if (ld == NULL) { + if (ld == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } LinkedList lnDirectory = LinkedList_create(); - switch (acsiClass) { - + switch (acsiClass) + { case ACSI_CLASS_DATA_OBJECT: { LinkedList variable = LinkedList_getNext(ld->variables); - while (variable != NULL) { + while (variable) + { char* variableName = (char*) variable->data; char* fcPos = strchr(variableName, '$'); - if (fcPos != NULL) { + if (fcPos) + { if (memcmp(fcPos + 1, "RP", 2) == 0) goto next_element; @@ -2653,13 +2760,16 @@ IedConnection_getLogicalNodeDirectory(IedConnection self, IedClientError* error, int lnNameLen = (int)(fcPos - variableName); - if (strncmp(variableName, logicalNodeName, lnNameLen) == 0) { + if (strncmp(variableName, logicalNodeName, lnNameLen) == 0) + { char* fcEndPos = strchr(fcPos + 1, '$'); - if (fcEndPos != NULL) { + if (fcEndPos) + { char* nameEndPos = strchr(fcEndPos + 1, '$'); - if (nameEndPos == NULL) { + if (nameEndPos == NULL) + { char* dataObjectName = StringUtils_copyString(fcEndPos + 1); if (!addToStringSet(lnDirectory, dataObjectName)) @@ -2680,7 +2790,8 @@ IedConnection_getLogicalNodeDirectory(IedConnection self, IedClientError* error, { LinkedList variable = LinkedList_getNext(ld->variables); - while (variable != NULL) { + while (variable) + { char* variableName = (char*) variable->data; if (strcmp(variableName, "LLN0$SP$SGCB") == 0) @@ -2723,7 +2834,8 @@ IedConnection_getLogicalNodeVariables(IedConnection self, IedClientError* error, { *error = IED_ERROR_OK; - if (strlen(logicalNodeReference) > 129) { + if (strlen(logicalNodeReference) > 129) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -2740,7 +2852,8 @@ IedConnection_getLogicalNodeVariables(IedConnection self, IedClientError* error, char* ldSep = strchr(lnRefCopy, '/'); - if (ldSep == NULL) { + if (ldSep == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -2757,10 +2870,12 @@ IedConnection_getLogicalNodeVariables(IedConnection self, IedClientError* error, ICLogicalDevice* ld = NULL; - while (device != NULL) { + while (device) + { ICLogicalDevice* ldCandidate = (ICLogicalDevice*) device->data; - if (strcmp(logicalDeviceName, ldCandidate->name) == 0) { + if (strcmp(logicalDeviceName, ldCandidate->name) == 0) + { ld = ldCandidate; break; } @@ -2768,7 +2883,8 @@ IedConnection_getLogicalNodeVariables(IedConnection self, IedClientError* error, device = LinkedList_getNext(device); } - if (ld == NULL) { + if (ld == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -2780,15 +2896,18 @@ IedConnection_getLogicalNodeVariables(IedConnection self, IedClientError* error, LinkedList lnDirectory = LinkedList_create(); - while (variable != NULL) { + while (variable) + { char* variableName = (char*) variable->data; char* fcPos = strchr(variableName, '$'); - if (fcPos != NULL) { + if (fcPos) + { int lnNameLen = (int)(fcPos - variableName); - if (strncmp(variableName, logicalNodeName, lnNameLen) == 0) { + if (strncmp(variableName, logicalNodeName, lnNameLen) == 0) + { LinkedList_add(lnDirectory, StringUtils_copyString(fcPos + 1)); } } @@ -2806,7 +2925,8 @@ getDataDirectory(IedConnection self, IedClientError* error, { *error = IED_ERROR_OK; - if (strlen(dataReference) > 129) { + if (strlen(dataReference) > 129) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -2831,7 +2951,8 @@ getDataDirectory(IedConnection self, IedClientError* error, char* logicalNodeNameEnd = strchr(logicalNodeName, '.'); - if (logicalNodeNameEnd == NULL) { + if (logicalNodeNameEnd == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -2842,7 +2963,8 @@ getDataDirectory(IedConnection self, IedClientError* error, int dataNamePartLen = (int)strlen(dataNamePart); - if (dataNamePartLen < 1) { + if (dataNamePartLen < 1) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -2855,10 +2977,12 @@ getDataDirectory(IedConnection self, IedClientError* error, ICLogicalDevice* ld = NULL; - while (device != NULL) { + while (device) + { ICLogicalDevice* ldCandidate = (ICLogicalDevice*) device->data; - if (strcmp(logicalDeviceName, ldCandidate->name) == 0) { + if (strcmp(logicalDeviceName, ldCandidate->name) == 0) + { ld = ldCandidate; break; } @@ -2866,7 +2990,8 @@ getDataDirectory(IedConnection self, IedClientError* error, device = LinkedList_getNext(device); } - if (ld == NULL) { + if (ld == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -2875,18 +3000,20 @@ getDataDirectory(IedConnection self, IedClientError* error, LinkedList dataDirectory = LinkedList_create(); - while (variable != NULL) { + while (variable) + { char* variableName = (char*) variable->data; char* fcPos = strchr(variableName, '$'); - if (fcPos != NULL) { + if (fcPos) + { int lnNameLen = (int)(fcPos - variableName); - if (logicalNodeNameLen == lnNameLen) { - - if (memcmp(variableName, logicalNodeName, lnNameLen) == 0) { - + if (logicalNodeNameLen == lnNameLen) + { + if (memcmp(variableName, logicalNodeName, lnNameLen) == 0) + { /* ok we are in the correct logical node */ /* skip FC */ @@ -2902,10 +3029,10 @@ getDataDirectory(IedConnection self, IedClientError* error, if (remainingLen <= dataNamePartLen) goto next_variable; - if (remainingPart[dataNamePartLen] == '$') { - - if (memcmp(dataNamePart, remainingPart, dataNamePartLen) == 0) { - + if (remainingPart[dataNamePartLen] == '$') + { + if (memcmp(dataNamePart, remainingPart, dataNamePartLen) == 0) + { char* subElementName = remainingPart + dataNamePartLen + 1; char* subElementNameSep = strchr(subElementName, '$'); @@ -2915,7 +3042,8 @@ getDataDirectory(IedConnection self, IedClientError* error, char* elementName; - if (withFc) { + if (withFc) + { int elementNameLen = (int)strlen(subElementName); elementName = (char*) GLOBAL_MALLOC(elementNameLen + 5); @@ -2944,7 +3072,6 @@ getDataDirectory(IedConnection self, IedClientError* error, *error = IED_ERROR_OK; return dataDirectory; - } LinkedList @@ -2965,14 +3092,16 @@ getDataDirectoryByFc(IedConnection self, IedClientError* error, { *error = IED_ERROR_OK; - if (strlen(dataReference) > 129) { + if (strlen(dataReference) > 129) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } char* fcString = FunctionalConstraint_toString(fc); - if (fcString == NULL) { + if (fcString == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -2997,7 +3126,8 @@ getDataDirectoryByFc(IedConnection self, IedClientError* error, char* logicalNodeNameEnd = strchr(logicalNodeName, '.'); - if (logicalNodeNameEnd == NULL) { + if (logicalNodeNameEnd == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -3008,7 +3138,8 @@ getDataDirectoryByFc(IedConnection self, IedClientError* error, int dataNamePartLen = (int)strlen(dataNamePart); - if (dataNamePartLen < 1) { + if (dataNamePartLen < 1) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -3021,10 +3152,12 @@ getDataDirectoryByFc(IedConnection self, IedClientError* error, ICLogicalDevice* ld = NULL; - while (device != NULL) { + while (device) + { ICLogicalDevice* ldCandidate = (ICLogicalDevice*) device->data; - if (strcmp(logicalDeviceName, ldCandidate->name) == 0) { + if (strcmp(logicalDeviceName, ldCandidate->name) == 0) + { ld = ldCandidate; break; } @@ -3032,7 +3165,8 @@ getDataDirectoryByFc(IedConnection self, IedClientError* error, device = LinkedList_getNext(device); } - if (ld == NULL) { + if (ld == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -3041,18 +3175,20 @@ getDataDirectoryByFc(IedConnection self, IedClientError* error, LinkedList dataDirectory = LinkedList_create(); - while (variable != NULL) { + while (variable) + { char* variableName = (char*) variable->data; char* fcPos = strchr(variableName, '$'); - if (fcPos != NULL) { + if (fcPos) + { int lnNameLen = (int)(fcPos - variableName); - if (logicalNodeNameLen == lnNameLen) { - - if (memcmp(variableName, logicalNodeName, lnNameLen) == 0) { - + if (logicalNodeNameLen == lnNameLen) + { + if (memcmp(variableName, logicalNodeName, lnNameLen) == 0) + { /* ok we are in the correct logical node */ /* skip FC */ @@ -3071,10 +3207,10 @@ getDataDirectoryByFc(IedConnection self, IedClientError* error, if (remainingLen <= dataNamePartLen) goto next_variable; - if (remainingPart[dataNamePartLen] == '$') { - - if (memcmp(dataNamePart, remainingPart, dataNamePartLen) == 0) { - + if (remainingPart[dataNamePartLen] == '$') + { + if (memcmp(dataNamePart, remainingPart, dataNamePartLen) == 0) + { char* subElementName = remainingPart + dataNamePartLen + 1; char* subElementNameSep = strchr(subElementName, '$'); @@ -3103,7 +3239,6 @@ getDataDirectoryByFc(IedConnection self, IedClientError* error, *error = IED_ERROR_OK; return dataDirectory; - } @@ -3124,9 +3259,10 @@ IedConnection_createDataSet(IedConnection self, IedClientError* error, const cha const char* itemId; bool isAssociationSpecific = false; - if (dataSetReference[0] != '@') { - - if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + if (dataSetReference[0] != '@') + { + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) + { domainId = NULL; if (dataSetReference[0] == '/') @@ -3134,17 +3270,20 @@ IedConnection_createDataSet(IedConnection self, IedClientError* error, const cha else itemId = dataSetReference; } - else { + else + { domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - if (domainId == NULL) { + if (domainId == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } int domainIdLength = (int)strlen(domainId); - if ((strlen(dataSetReference) - domainIdLength - 1) > 32) { + if ((strlen(dataSetReference) - domainIdLength - 1) > 32) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } @@ -3154,7 +3293,8 @@ IedConnection_createDataSet(IedConnection self, IedClientError* error, const cha itemId = itemIdRef; } } - else { + else + { itemId = dataSetReference + 1; isAssociationSpecific = true; } @@ -3165,12 +3305,13 @@ IedConnection_createDataSet(IedConnection self, IedClientError* error, const cha LinkedList dataSetElement = LinkedList_getNext(dataSetElements); - while (dataSetElement != NULL) { - + while (dataSetElement) + { MmsVariableAccessSpecification* dataSetEntry = MmsMapping_ObjectReferenceToVariableAccessSpec((char*) dataSetElement->data); - if (dataSetEntry == NULL) { + if (dataSetEntry == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto cleanup_list; } @@ -3208,8 +3349,10 @@ IedConnection_deleteDataSet(IedConnection self, IedClientError* error, const cha int dataSetReferenceLength = (int)strlen(dataSetReference); - if (dataSetReference[0] != '@') { - if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + if (dataSetReference[0] != '@') + { + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) + { domainId = NULL; if (dataSetReference[0] == '/') @@ -3217,16 +3360,18 @@ IedConnection_deleteDataSet(IedConnection self, IedClientError* error, const cha else StringUtils_copyStringMax(itemId, DATA_SET_MAX_NAME_LENGTH + 1, dataSetReference); } - else { - - if (MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainId) == NULL) { + else + { + if (MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainId) == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } const char* itemIdString = dataSetReference + strlen(domainId) + 1; - if (strlen(itemIdString) > DATA_SET_MAX_NAME_LENGTH) { + if (strlen(itemIdString) > DATA_SET_MAX_NAME_LENGTH) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } @@ -3236,8 +3381,10 @@ IedConnection_deleteDataSet(IedConnection self, IedClientError* error, const cha StringUtils_replace(itemId, '.', '$'); } } - else { - if (dataSetReferenceLength > 33) { + else + { + if (dataSetReferenceLength > 33) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } @@ -3267,13 +3414,14 @@ deleteNamedVariableListHandler(uint32_t invokeId, void* parameter, MmsError mmsE IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { - + if (call) + { IedConnection_GenericServiceHandler handler = (IedConnection_GenericServiceHandler)call->callback; IedClientError err = iedConnection_mapMmsErrorToIedError(mmsError); - if (err == IED_ERROR_OK) { + if (err == IED_ERROR_OK) + { if (success == false) err = IED_ERROR_ACCESS_DENIED; } @@ -3282,7 +3430,8 @@ deleteNamedVariableListHandler(uint32_t invokeId, void* parameter, MmsError mmsE iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -3301,9 +3450,10 @@ IedConnection_deleteDataSetAsync(IedConnection self, IedClientError* error, cons int dataSetReferenceLength = (int)strlen(dataSetReference); - if (dataSetReference[0] != '@') { - if ((dataSetReference[0] == '/') - || (strchr(dataSetReference, '/') == NULL)) { + if (dataSetReference[0] != '@') + { + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) + { domainId = NULL; if (dataSetReference[0] == '/') @@ -3311,17 +3461,18 @@ IedConnection_deleteDataSetAsync(IedConnection self, IedClientError* error, cons else StringUtils_copyStringMax(itemId, DATA_SET_MAX_NAME_LENGTH + 1, dataSetReference); } - else { - - if (MmsMapping_getMmsDomainFromObjectReference(dataSetReference, - domainId) == NULL) { + else + { + if (MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainId) == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } const char *itemIdString = dataSetReference + strlen(domainId) + 1; - if (strlen(itemIdString) > DATA_SET_MAX_NAME_LENGTH) { + if (strlen(itemIdString) > DATA_SET_MAX_NAME_LENGTH) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } @@ -3331,8 +3482,10 @@ IedConnection_deleteDataSetAsync(IedConnection self, IedClientError* error, cons StringUtils_replace(itemId, '.', '$'); } } - else { - if (dataSetReferenceLength > 33) { + else + { + if (dataSetReferenceLength > 33) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } @@ -3344,7 +3497,8 @@ IedConnection_deleteDataSetAsync(IedConnection self, IedClientError* error, cons MmsError mmsError; - if ((domainId == NULL) || (itemId[0] == 0)) { + if ((domainId == NULL) || (itemId[0] == 0)) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } @@ -3360,14 +3514,17 @@ IedConnection_deleteDataSetAsync(IedConnection self, IedClientError* error, cons call->callbackParameter = parameter; call->invokeId = 0; - if (isAssociationSpecific) { + if (isAssociationSpecific) + { MmsConnection_deleteAssociationSpecificNamedVariableListAsync(self->connection, &(call->invokeId), &mmsError, itemId, deleteNamedVariableListHandler, self); } - else { + else + { MmsConnection_deleteNamedVariableListAsync(self->connection, &(call->invokeId), &mmsError, domainId, itemId, deleteNamedVariableListHandler, self); } - if (*error != IED_ERROR_OK) { + if (*error != IED_ERROR_OK) + { iedConnection_releaseOutstandingCall(self, call); return 0; } @@ -3388,7 +3545,8 @@ createDataSetAsyncHandler(uint32_t invokeId, void* parameter, MmsError mmsError, IedClientError err = iedConnection_mapMmsErrorToIedError(mmsError); - if (err == IED_ERROR_OK) { + if (err == IED_ERROR_OK) + { if (success == false) err = IED_ERROR_ACCESS_DENIED; } @@ -3397,7 +3555,8 @@ createDataSetAsyncHandler(uint32_t invokeId, void* parameter, MmsError mmsError, iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -3411,7 +3570,8 @@ IedConnection_createDataSetAsync(IedConnection self, IedClientError* error, cons IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; goto exit_function; } @@ -3427,9 +3587,10 @@ IedConnection_createDataSetAsync(IedConnection self, IedClientError* error, cons const char* itemId; bool isAssociationSpecific = false; - if (dataSetReference[0] != '@') { - - if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + if (dataSetReference[0] != '@') + { + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) + { domainId = NULL; if (dataSetReference[0] == '/') @@ -3437,17 +3598,20 @@ IedConnection_createDataSetAsync(IedConnection self, IedClientError* error, cons else itemId = dataSetReference; } - else { + else + { domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - if (domainId == NULL) { + if (domainId == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } int domainIdLength = (int)strlen(domainId); - if ((strlen(dataSetReference) - domainIdLength - 1) > 32) { + if ((strlen(dataSetReference) - domainIdLength - 1) > 32) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } @@ -3457,7 +3621,8 @@ IedConnection_createDataSetAsync(IedConnection self, IedClientError* error, cons itemId = itemIdRef; } } - else { + else + { itemId = dataSetReference + 1; isAssociationSpecific = true; } @@ -3466,12 +3631,13 @@ IedConnection_createDataSetAsync(IedConnection self, IedClientError* error, cons LinkedList dataSetElement = LinkedList_getNext(dataSetElements); - while (dataSetElement != NULL) { - + while (dataSetElement) + { MmsVariableAccessSpecification* dataSetEntry = MmsMapping_ObjectReferenceToVariableAccessSpec((char*) dataSetElement->data); - if (dataSetEntry == NULL) { + if (dataSetEntry == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto cleanup_list; } @@ -3481,11 +3647,13 @@ IedConnection_createDataSetAsync(IedConnection self, IedClientError* error, cons dataSetElement = LinkedList_getNext(dataSetElement); } - if (isAssociationSpecific) { + if (isAssociationSpecific) + { MmsConnection_defineNamedVariableListAssociationSpecificAsync(self->connection, &(call->invokeId), &mmsError, itemId, dataSetEntries, createDataSetAsyncHandler, self); } - else { + else + { MmsConnection_defineNamedVariableListAsync(self->connection, &(call->invokeId), &mmsError, domainId, itemId, dataSetEntries, createDataSetAsyncHandler, self); } @@ -3525,8 +3693,10 @@ IedConnection_getDataSetDirectory(IedConnection self, IedClientError* error, con bool isAssociationSpecific = false; - if (dataSetReference[0] != '@') { - if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + if (dataSetReference[0] != '@') + { + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) + { domainId = NULL; if (dataSetReference[0] == '/') @@ -3534,17 +3704,20 @@ IedConnection_getDataSetDirectory(IedConnection self, IedClientError* error, con else itemId = dataSetReference; } - else { + else + { domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - if (domainId == NULL) { + if (domainId == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } const char* itemIdRef = dataSetReference + strlen(domainId) + 1; - if (strlen(itemIdRef) > DATA_SET_MAX_NAME_LENGTH) { + if (strlen(itemIdRef) > DATA_SET_MAX_NAME_LENGTH) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } @@ -3554,7 +3727,8 @@ IedConnection_getDataSetDirectory(IedConnection self, IedClientError* error, con itemId = itemIdRefInBuffer; } } - else { + else + { itemId = dataSetReference + 1; isAssociationSpecific = true; } @@ -3570,13 +3744,14 @@ IedConnection_getDataSetDirectory(IedConnection self, IedClientError* error, con entries = MmsConnection_readNamedVariableListDirectory(self->connection, &mmsError, domainId, itemId, &deletable); - if (mmsError == MMS_ERROR_NONE) { - + if (mmsError == MMS_ERROR_NONE) + { LinkedList entry = LinkedList_getNext(entries); dataSetMembers = LinkedList_create(); - while (entry) { + while (entry) + { MmsVariableAccessSpecification* varAccessSpec = (MmsVariableAccessSpecification*)LinkedList_getData(entry); char* objectReference = MmsMapping_varAccessSpecToObjectReference(varAccessSpec); @@ -3607,17 +3782,20 @@ getDataSetDirectoryAsyncHandler(uint32_t invokeId, void* parameter, MmsError mms IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { + if (call) + { LinkedList dataSetMembers = NULL; if (mmsError != MMS_ERROR_NONE) err = iedConnection_mapMmsErrorToIedError(mmsError); - if (specs) { + if (specs) + { dataSetMembers = LinkedList_create(); LinkedList specElem = LinkedList_getNext(specs); - while (specElem) { + while (specElem) + { MmsVariableAccessSpecification* varAccessSpec = (MmsVariableAccessSpecification*)LinkedList_getData(specElem); char* objectReference = MmsMapping_varAccessSpecToObjectReference(varAccessSpec); @@ -3648,7 +3826,8 @@ IedConnection_getDataSetDirectoryAsync(IedConnection self, IedClientError* error IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -3665,8 +3844,10 @@ IedConnection_getDataSetDirectoryAsync(IedConnection self, IedClientError* error bool isAssociationSpecific = false; - if (dataSetReference[0] != '@') { - if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + if (dataSetReference[0] != '@') + { + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) + { domainId = NULL; if (dataSetReference[0] == '/') @@ -3674,17 +3855,20 @@ IedConnection_getDataSetDirectoryAsync(IedConnection self, IedClientError* error else itemId = dataSetReference; } - else { + else + { domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - if (domainId == NULL) { + if (domainId == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } const char* itemIdRef = dataSetReference + strlen(domainId) + 1; - if (strlen(itemIdRef) > DATA_SET_MAX_NAME_LENGTH) { + if (strlen(itemIdRef) > DATA_SET_MAX_NAME_LENGTH) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } @@ -3694,7 +3878,8 @@ IedConnection_getDataSetDirectoryAsync(IedConnection self, IedClientError* error itemId = itemIdRefInBuffer; } } - else { + else + { itemId = dataSetReference + 1; isAssociationSpecific = true; } @@ -3709,12 +3894,14 @@ IedConnection_getDataSetDirectoryAsync(IedConnection self, IedClientError* error exit_function: - if (*error != IED_ERROR_OK) { + if (*error != IED_ERROR_OK) + { iedConnection_releaseOutstandingCall(self, call); return 0; } - else { + else + { return call->invokeId; } } @@ -3731,9 +3918,10 @@ IedConnection_readDataSetValues(IedConnection self, IedClientError* error, const bool isAssociationSpecific = false; - if (dataSetReference[0] != '@') { - - if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + if (dataSetReference[0] != '@') + { + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) + { domainId = NULL; if (dataSetReference[0] == '/') @@ -3741,17 +3929,20 @@ IedConnection_readDataSetValues(IedConnection self, IedClientError* error, const else itemId = dataSetReference; } - else { + else + { domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - if (domainId == NULL) { + if (domainId == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } const char* itemIdRefOrig = dataSetReference + strlen(domainId) + 1; - if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) { + if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } @@ -3762,7 +3953,8 @@ IedConnection_readDataSetValues(IedConnection self, IedClientError* error, const itemId = itemIdRef; } } - else { + else + { itemId = dataSetReference + 1; isAssociationSpecific = true; } @@ -3778,18 +3970,21 @@ IedConnection_readDataSetValues(IedConnection self, IedClientError* error, const dataSetVal = MmsConnection_readNamedVariableListValues(self->connection, &mmsError, domainId, itemId, true); - if (dataSetVal == NULL) { + if (dataSetVal == NULL) + { *error = iedConnection_mapMmsErrorToIedError(mmsError); goto exit_function; } else *error = IED_ERROR_OK; - if (dataSet == NULL) { + if (dataSet == NULL) + { dataSet = ClientDataSet_create(dataSetReference); ClientDataSet_setDataSetValues(dataSet, dataSetVal); } - else { + else + { MmsValue* dataSetValues = ClientDataSet_getValues(dataSet); MmsValue_update(dataSetValues, dataSetVal); MmsValue_delete(dataSetVal); @@ -3815,11 +4010,13 @@ getDataSetHandlerInternal(uint32_t invokeId, void* parameter, MmsError err, MmsV if (value) { - if (dataSet == NULL) { + if (dataSet == NULL) + { dataSet = ClientDataSet_create(dataSetReference); ClientDataSet_setDataSetValues(dataSet, value); } - else { + else + { MmsValue* dataSetValues = ClientDataSet_getValues(dataSet); MmsValue_update(dataSetValues, value); } @@ -3834,7 +4031,8 @@ getDataSetHandlerInternal(uint32_t invokeId, void* parameter, MmsError err, MmsV iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -3852,9 +4050,10 @@ IedConnection_readDataSetValuesAsync(IedConnection self, IedClientError* error, bool isAssociationSpecific = false; - if (dataSetReference[0] != '@') { - - if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + if (dataSetReference[0] != '@') + { + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) + { domainId = NULL; if (dataSetReference[0] == '/') @@ -3862,17 +4061,20 @@ IedConnection_readDataSetValuesAsync(IedConnection self, IedClientError* error, else itemId = dataSetReference; } - else { + else + { domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - if (domainId == NULL) { + if (domainId == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } const char* itemIdRefOrig = dataSetReference + strlen(domainId) + 1; - if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) { + if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } @@ -3883,14 +4085,16 @@ IedConnection_readDataSetValuesAsync(IedConnection self, IedClientError* error, itemId = itemIdRef; } } - else { + else + { itemId = dataSetReference + 1; isAssociationSpecific = true; } IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -3915,8 +4119,8 @@ IedConnection_readDataSetValuesAsync(IedConnection self, IedClientError* error, *error = iedConnection_mapMmsErrorToIedError(err); - if (err != MMS_ERROR_NONE) { - + if (err != MMS_ERROR_NONE) + { GLOBAL_FREEMEM(call->specificParameter2.pointer); iedConnection_releaseOutstandingCall(self, call); @@ -3939,9 +4143,10 @@ IedConnection_writeDataSetValues(IedConnection self, IedClientError* error, cons bool isAssociationSpecific = false; - if (dataSetReference[0] != '@') { - - if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + if (dataSetReference[0] != '@') + { + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) + { domainId = NULL; if (dataSetReference[0] == '/') @@ -3949,17 +4154,20 @@ IedConnection_writeDataSetValues(IedConnection self, IedClientError* error, cons else itemId = dataSetReference; } - else { + else + { domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - if (domainId == NULL) { + if (domainId == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } const char* itemIdRefOrig = dataSetReference + strlen(domainId) + 1; - if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) { + if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; goto exit_function; } @@ -3970,7 +4178,8 @@ IedConnection_writeDataSetValues(IedConnection self, IedClientError* error, cons itemId = itemIdRef; } } - else { + else + { itemId = dataSetReference + 1; isAssociationSpecific = true; } @@ -3992,15 +4201,16 @@ writeDataSetHandlerInternal(uint32_t invokeId, void* parameter, MmsError err, Li IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { - + if (call) + { IedConnection_WriteDataSetHandler handler = (IedConnection_WriteDataSetHandler) call->callback; handler(invokeId, call->callbackParameter, iedConnection_mapMmsErrorToIedError(err), accessResults); iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -4018,9 +4228,10 @@ IedConnection_writeDataSetValuesAsync(IedConnection self, IedClientError* error, bool isAssociationSpecific = false; - if (dataSetReference[0] != '@') { - - if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + if (dataSetReference[0] != '@') + { + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) + { domainId = NULL; if (dataSetReference[0] == '/') @@ -4028,17 +4239,20 @@ IedConnection_writeDataSetValuesAsync(IedConnection self, IedClientError* error, else itemId = dataSetReference; } - else { + else + { domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); - if (domainId == NULL) { + if (domainId == NULL) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } const char* itemIdRefOrig = dataSetReference + strlen(domainId) + 1; - if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) { + if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } @@ -4049,14 +4263,16 @@ IedConnection_writeDataSetValuesAsync(IedConnection self, IedClientError* error, itemId = itemIdRef; } } - else { + else + { itemId = dataSetReference + 1; isAssociationSpecific = true; } IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -4070,7 +4286,8 @@ IedConnection_writeDataSetValuesAsync(IedConnection self, IedClientError* error, *error = iedConnection_mapMmsErrorToIedError(err); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { iedConnection_releaseOutstandingCall(self, call); return 0; @@ -4092,8 +4309,8 @@ IedConnection_queryLogByTime(IedConnection self, IedClientError* error, const ch char* logDomain = logRef; char* logName = strchr(logRef, '/'); - if (logName != NULL) { - + if (logName) + { logName[0] = 0; logName++; @@ -4109,18 +4326,19 @@ IedConnection_queryLogByTime(IedConnection self, IedClientError* error, const ch MmsValue_delete(startTimeMms); MmsValue_delete(endTimeMms); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(mmsError); return NULL; } else return journalEntries; } - else { + else + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } - } static void @@ -4130,15 +4348,16 @@ readJournalHandler(uint32_t invokeId, void* parameter, MmsError err, LinkedList IedConnectionOutstandingCall call = iedConnection_lookupOutstandingCall(self, invokeId); - if (call) { - + if (call) + { IedConnection_QueryLogHandler handler = (IedConnection_QueryLogHandler) call->callback; handler(invokeId, call->callbackParameter, iedConnection_mapMmsErrorToIedError(err), journalEntries, moreFollows); iedConnection_releaseOutstandingCall(self, call); } - else { + else + { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: internal error - no matching outstanding call!\n"); } @@ -4155,14 +4374,15 @@ IedConnection_queryLogByTimeAsync(IedConnection self, IedClientError* error, con char* logDomain = logRef; char* logName = strchr(logRef, '/'); - if (logName != NULL) { - + if (logName != NULL) + { logName[0] = 0; logName++; IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -4186,18 +4406,19 @@ IedConnection_queryLogByTimeAsync(IedConnection self, IedClientError* error, con *error = iedConnection_mapMmsErrorToIedError(err); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { iedConnection_releaseOutstandingCall(self, call); return 0; } return call->invokeId; } - else { + else + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } - } uint32_t @@ -4211,14 +4432,15 @@ IedConnection_queryLogAfterAsync(IedConnection self, IedClientError* error, cons char* logDomain = logRef; char* logName = strchr(logRef, '/'); - if (logName != NULL) { - + if (logName) + { logName[0] = 0; logName++; IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); - if (call == NULL) { + if (call == NULL) + { *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; return 0; } @@ -4238,14 +4460,16 @@ IedConnection_queryLogAfterAsync(IedConnection self, IedClientError* error, cons *error = iedConnection_mapMmsErrorToIedError(err); - if (err != MMS_ERROR_NONE) { + if (err != MMS_ERROR_NONE) + { iedConnection_releaseOutstandingCall(self, call); return 0; } return call->invokeId; } - else { + else + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return 0; } @@ -4264,8 +4488,8 @@ IedConnection_queryLogAfter(IedConnection self, IedClientError* error, const cha char* logDomain = logRef; char* logName = strchr(logRef, '/'); - if (logName != NULL) { - + if (logName) + { logName[0] = 0; logName++; @@ -4277,14 +4501,16 @@ IedConnection_queryLogAfter(IedConnection self, IedClientError* error, const cha MmsValue_delete(timeStampMms); - if (mmsError != MMS_ERROR_NONE) { + if (mmsError != MMS_ERROR_NONE) + { *error = iedConnection_mapMmsErrorToIedError(mmsError); return NULL; } else return journalEntries; } - else { + else + { *error = IED_ERROR_OBJECT_REFERENCE_INVALID; return NULL; } @@ -4358,4 +4584,3 @@ FileDirectoryEntry_getLastModified(FileDirectoryEntry self) { return self->lastModified; } - diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index e059175f..04a81b78 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -2010,6 +2010,15 @@ typedef bool LIB61850_API void IedServer_setControlBlockAccessHandler(IedServer self, IedServer_ControlBlockAccessHandler handler, void* parameter); +/** + * \brief Temporarily ignore read requests (for testing purposes) + * + * \param self the instance of IedServer to operate on. + * \param ignore true to ignore read requests, false to handle read requests. +*/ +LIB61850_API void +IedServer_ingoreReadAccess(IedServer self, bool ignore); + /**@}*/ /**@}*/ diff --git a/src/iec61850/inc_private/ied_connection_private.h b/src/iec61850/inc_private/ied_connection_private.h index e571ca8e..f0f48247 100644 --- a/src/iec61850/inc_private/ied_connection_private.h +++ b/src/iec61850/inc_private/ied_connection_private.h @@ -1,7 +1,7 @@ /* * ied_connection_private.h * - * Copyright 2013-2022 Michael Zillgith + * Copyright 2013-2024 Michael Zillgith * * This file is part of libIEC61850. * @@ -34,14 +34,16 @@ typedef struct sIedConnectionOutstandingCall* IedConnectionOutstandingCall; -struct sIedConnectionOutstandingCall { +struct sIedConnectionOutstandingCall +{ bool used; uint32_t invokeId; void* callback; void* callbackParameter; void* specificParameter; /* function/service specific parameter */ - union { + union + { void* pointer; struct { uint32_t originalInvokeId; @@ -81,7 +83,8 @@ struct sIedConnection uint8_t timeQuality; }; -struct sClientReportControlBlock { +struct sClientReportControlBlock +{ char* objectReference; bool isBuffered; diff --git a/src/iec61850/inc_private/ied_server_private.h b/src/iec61850/inc_private/ied_server_private.h index d5555659..8dc5fede 100644 --- a/src/iec61850/inc_private/ied_server_private.h +++ b/src/iec61850/inc_private/ied_server_private.h @@ -81,10 +81,11 @@ struct sIedServer uint8_t timeQuality; /* user settable time quality for internally updated times */ + bool ignoreReadAccess; /* when true don't answer read request (for test purposes) */ + bool running; }; - LIB61850_INTERNAL IEC61850_ServiceError private_IedServer_convertMmsDataAccessErrorToServiceError(MmsDataAccessError mmsError); diff --git a/src/iec61850/server/impl/client_connection.c b/src/iec61850/server/impl/client_connection.c index dbca770a..6eac160d 100644 --- a/src/iec61850/server/impl/client_connection.c +++ b/src/iec61850/server/impl/client_connection.c @@ -1,7 +1,7 @@ /* * client_connection.c * - * Copyright 2013-2022 Michael Zillgith + * Copyright 2013-2024 Michael Zillgith * * This file is part of libIEC61850. * @@ -32,8 +32,8 @@ #include "libiec61850_platform_includes.h" -struct sClientConnection { - +struct sClientConnection +{ #if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore tasksCountMutex; #endif @@ -47,7 +47,8 @@ private_ClientConnection_create(void* serverConnectionHandle) { ClientConnection self = (ClientConnection) GLOBAL_MALLOC(sizeof(struct sClientConnection)); - if (self) { + if (self) + { #if (CONFIG_MMS_THREADLESS_STACK != 1) self->tasksCountMutex = Semaphore_create(1); #endif @@ -62,7 +63,8 @@ private_ClientConnection_create(void* serverConnectionHandle) void private_ClientConnection_destroy(ClientConnection self) { - if (self) { + if (self) + { #if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_destroy(self->tasksCountMutex); #endif @@ -123,7 +125,6 @@ private_ClientConnection_getServerConnectionHandle(ClientConnection self) return self->serverConnectionHandle; } - const char* ClientConnection_getPeerAddress(ClientConnection self) { diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index 8c83ddc0..c718e2c8 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -540,17 +540,18 @@ updateDataSetsWithCachedValues(IedServer self) } } - IedServer IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguration, IedServerConfig serverConfiguration) { IedServer self = (IedServer) GLOBAL_CALLOC(1, sizeof(struct sIedServer)); - if (self) { + if (self) + { self->model = dataModel; self->running = false; self->localIpAddress = NULL; + self->ignoreReadAccess = false; #if (CONFIG_IEC61850_EDITION_1 == 1) self->edition = IEC_61850_EDITION_1; @@ -561,7 +562,8 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio #if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) self->logServiceEnabled = true; - if (serverConfiguration) { + if (serverConfiguration) + { self->logServiceEnabled = serverConfiguration->enableLogService; self->edition = serverConfiguration->edition; } @@ -574,7 +576,8 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio #endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */ #if (CONFIG_IEC61850_REPORT_SERVICE == 1) - if (serverConfiguration) { + if (serverConfiguration) + { self->reportBufferSizeBRCBs = serverConfiguration->reportBufferSize; self->reportBufferSizeURCBs = serverConfiguration->reportBufferSizeURCBs; self->enableBRCBResvTms = serverConfiguration->enableResvTmsForBRCB; @@ -582,7 +585,8 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio self->syncIntegrityReportTimes = serverConfiguration->syncIntegrityReportTimes; self->rcbSettingsWritable = serverConfiguration->reportSettingsWritable; } - else { + else + { self->reportBufferSizeBRCBs = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; self->reportBufferSizeURCBs = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; self->enableOwnerForRCB = false; @@ -602,11 +606,13 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio #endif #if (CONFIG_IEC61850_SETTING_GROUPS == 1) - if (serverConfiguration) { + if (serverConfiguration) + { self->enableEditSG = serverConfiguration->enableEditSG; self->hasSGCBResvTms = serverConfiguration->enableResvTmsForSGCB; } - else { + else + { self->enableEditSG = true; self->hasSGCBResvTms = true; } @@ -614,14 +620,15 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio self->mmsMapping = MmsMapping_create(dataModel, self); - if (self->mmsMapping) { - + if (self->mmsMapping) + { self->mmsDevice = MmsMapping_getMmsDeviceModel(self->mmsMapping); self->mmsServer = MmsServer_create(self->mmsDevice, tlsConfiguration); #if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) - if (serverConfiguration) { + if (serverConfiguration) + { MmsServer_enableFileService(self->mmsServer, serverConfiguration->enableFileService); MmsServer_enableDynamicNamedVariableListService(self->mmsServer, serverConfiguration->enableDynamicDataSetService); MmsServer_setMaxAssociationSpecificDataSets(self->mmsServer, serverConfiguration->maxAssociationSpecificDataSets); @@ -668,7 +675,8 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio IedServer_setTimeQuality(self, true, false, false, 10); } - else { + else + { IedServer_destroy(self); self = NULL; } @@ -1992,3 +2000,9 @@ IedServer_setControlBlockAccessHandler(IedServer self, IedServer_ControlBlockAcc self->mmsMapping->controlBlockAccessHandler = handler; self->mmsMapping->controlBlockAccessHandlerParameter = parameter; } + +void +IedServer_ingoreReadAccess(IedServer self, bool ignore) +{ + self->ignoreReadAccess = ignore; +} diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index 6643bb91..34fb18d5 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -74,7 +74,8 @@ ControlObject_unselect(ControlObject* self, MmsServerConnection connection, MmsM static MmsValue* getOperParameterCtlNum(MmsValue* operParameters) { - if (MmsValue_getType(operParameters) == MMS_STRUCTURE) { + if (MmsValue_getType(operParameters) == MMS_STRUCTURE) + { if (MmsValue_getArraySize(operParameters) == 7) return MmsValue_getElement(operParameters, 3); else if (MmsValue_getArraySize(operParameters) == 6) @@ -87,7 +88,8 @@ getOperParameterCtlNum(MmsValue* operParameters) static MmsValue* getCancelParameterCtlNum(MmsValue* operParameters) { - if (MmsValue_getType(operParameters) == MMS_STRUCTURE) { + if (MmsValue_getType(operParameters) == MMS_STRUCTURE) + { if (MmsValue_getArraySize(operParameters) == 6) return MmsValue_getElement(operParameters, 3); else if (MmsValue_getArraySize(operParameters) == 5) @@ -100,7 +102,8 @@ getCancelParameterCtlNum(MmsValue* operParameters) static MmsValue* getCancelParameterOrigin(MmsValue* operParameters) { - if (MmsValue_getType(operParameters) == MMS_STRUCTURE) { + if (MmsValue_getType(operParameters) == MMS_STRUCTURE) + { if (MmsValue_getArraySize(operParameters) == 6) return MmsValue_getElement(operParameters, 2); else if (MmsValue_getArraySize(operParameters) == 5) @@ -211,11 +214,12 @@ getCancelParameterTime(MmsValue* operParameters) static void copyControlValuesToTrackingObject(MmsMapping* self, ControlObject* controlObject, IEC61850_ServiceType serviceType) { - if (controlObject->ctlVal) { - + if (controlObject->ctlVal) + { ControlTrkInstance trkInst = NULL; - switch (controlObject->cdc) { + switch (controlObject->cdc) + { case CST_SPCTRK: trkInst = self->spcTrk; break; @@ -247,7 +251,8 @@ copyControlValuesToTrackingObject(MmsMapping* self, ControlObject* controlObject break; } - if (trkInst) { + if (trkInst) + { if (trkInst->ctlVal) MmsValue_update(trkInst->ctlVal->mmsValue, controlObject->ctlVal); @@ -265,16 +270,20 @@ copyControlValuesToTrackingObject(MmsMapping* self, ControlObject* controlObject MmsValue* operVal = NULL; - if (serviceType == IEC61850_SERVICE_TYPE_SELECT_WITH_VALUES) { + if (serviceType == IEC61850_SERVICE_TYPE_SELECT_WITH_VALUES) + { if (controlObject->sbow) operVal = controlObject->sbow; } - else if (serviceType == IEC61850_SERVICE_TYPE_OPERATE) { + else if (serviceType == IEC61850_SERVICE_TYPE_OPERATE) + { if (controlObject->oper) operVal = controlObject->oper; } - else if (serviceType == IEC61850_SERVICE_TYPE_CANCEL) { - if (controlObject->cancel) { + else if (serviceType == IEC61850_SERVICE_TYPE_CANCEL) + { + if (controlObject->cancel) + { operVal = controlObject->cancel; if (trkInst->Test) { MmsValue_update(trkInst->Test->mmsValue, getCancelParameterTest(operVal)); @@ -286,8 +295,8 @@ copyControlValuesToTrackingObject(MmsMapping* self, ControlObject* controlObject } } - if (operVal) { - + if (operVal) + { if (trkInst->Test) { MmsValue_update(trkInst->Test->mmsValue, getOperParameterTest(operVal)); } @@ -300,7 +309,6 @@ copyControlValuesToTrackingObject(MmsMapping* self, ControlObject* controlObject MmsValue_update(trkInst->T->mmsValue, getOperParameterTime(operVal)); } } - } } } @@ -310,8 +318,8 @@ convertCheckHandlerResultToServiceError(CheckHandlerResult controlHandlerResult) { IEC61850_ServiceError serviceError; - switch (controlHandlerResult) { - + switch (controlHandlerResult) + { case CONTROL_HARDWARE_FAULT: serviceError = IEC61850_SERVICE_ERROR_FAILED_DUE_TO_SERVER_CONSTRAINT; break; @@ -352,7 +360,8 @@ updateGenericTrackingObjectValues(MmsMapping* self, ControlObject* controlObject ServiceTrkInstance trkInst = NULL; - if (controlObject->ctlVal) { + if (controlObject->ctlVal) + { switch(controlObject->cdc) { case CST_SPCTRK: @@ -389,7 +398,8 @@ updateGenericTrackingObjectValues(MmsMapping* self, ControlObject* controlObject } } - if (trkInst) { + if (trkInst) + { if (trkInst->serviceType) MmsValue_setInt32(trkInst->serviceType->mmsValue, (int) serviceType); @@ -460,7 +470,8 @@ getState(ControlObject* self) static void setStSeld(ControlObject* self, bool value) { - if (self->stSeld) { + if (self->stSeld) + { #if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_wait(self->pendingEventsLock); #endif @@ -479,7 +490,8 @@ setStSeld(ControlObject* self, bool value) static void updateSboTimeoutValue(ControlObject* self) { - if (self->sboTimeout != NULL) { + if (self->sboTimeout != NULL) + { uint32_t sboTimeoutVal = MmsValue_toInt32(self->sboTimeout); if (DEBUG_IED_SERVER) @@ -506,7 +518,8 @@ selectObject(ControlObject* self, uint64_t selectTime, MmsServerConnection conne updateNextControlTimeout(mmsMapping, selectTime); - if (self->selectStateChangedHandler) { + if (self->selectStateChangedHandler) + { self->selectStateChangedHandler((ControlAction) self, self->selectStateChangedHandlerParameter, true, @@ -517,7 +530,8 @@ selectObject(ControlObject* self, uint64_t selectTime, MmsServerConnection conne static void unselectObject(ControlObject* self, SelectStateChangedReason reason, MmsMapping* mmsMapping) { - if (getState(self) != STATE_UNSELECTED) { + if (getState(self) != STATE_UNSELECTED) + { setState(self, STATE_UNSELECTED); setStSeld(self, false); @@ -525,7 +539,8 @@ unselectObject(ControlObject* self, SelectStateChangedReason reason, MmsMapping* /* trigger timeout check in next cycle to update the next timeout value */ mmsMapping->nextControlTimeout = 0; - if (self->selectStateChangedHandler) { + if (self->selectStateChangedHandler) + { self->selectStateChangedHandler((ControlAction) self, self->selectStateChangedHandlerParameter, false, @@ -540,11 +555,14 @@ unselectObject(ControlObject* self, SelectStateChangedReason reason, MmsMapping* static void checkSelectTimeout(ControlObject* self, uint64_t currentTime, MmsMapping* mmsMapping) { - if ((self->ctlModel == 2) || (self->ctlModel == 4)) { - - if (getState(self) == STATE_READY) { - if (self->selectTimeout > 0) { - if (currentTime > (self->selectTime + self->selectTimeout)) { + if ((self->ctlModel == 2) || (self->ctlModel == 4)) + { + if (getState(self) == STATE_READY) + { + if (self->selectTimeout > 0) + { + if (currentTime > (self->selectTime + self->selectTimeout)) + { if (DEBUG_IED_SERVER) printf("IED_SERVER: select-timeout (timeout-val = %u) for control %s/%s.%s\n", self->selectTimeout, MmsDomain_getName(self->mmsDomain), self->lnName, self->name); @@ -562,7 +580,8 @@ checkSelectTimeout(ControlObject* self, uint64_t currentTime, MmsMapping* mmsMap static void setOpRcvd(ControlObject* self, bool value) { - if (self->opRcvd) { + if (self->opRcvd) + { #if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_wait(self->pendingEventsLock); #endif @@ -581,13 +600,16 @@ setOpRcvd(ControlObject* self, bool value) static void setOpOk(ControlObject* self, bool value, uint64_t currentTimeInMs) { - if (self->opOk) { + if (self->opOk) + { #if (CONFIG_MMS_THREADLESS_STACK != 1) Semaphore_wait(self->pendingEventsLock); #endif - if (value) { - if (self->tOpOk) { + if (value) + { + if (self->tOpOk) + { MmsValue* timestamp = self->tOpOk->mmsValue; MmsValue_setUtcTimeMsEx(timestamp, currentTimeInMs, self->iedServer->timeQuality); @@ -607,7 +629,8 @@ setOpOk(ControlObject* self, bool value, uint64_t currentTimeInMs) static bool isSboClassOperateOnce(ControlObject* self) { - if (self->sboClass != NULL) { + if (self->sboClass != NULL) + { if (MmsValue_toInt32(self->sboClass) == 1) return false; else @@ -620,8 +643,8 @@ isSboClassOperateOnce(ControlObject* self) static MmsValue* getOperParameterOperTime(MmsValue* operParameters) { - if (MmsValue_getType(operParameters) == MMS_STRUCTURE) { - + if (MmsValue_getType(operParameters) == MMS_STRUCTURE) + { if (MmsValue_getArraySize(operParameters) == 7) return MmsValue_getElement(operParameters, 1); } @@ -659,12 +682,14 @@ exitControlTask(ControlObject* self) static void abortControlOperation(ControlObject* self, bool unconditional, SelectStateChangedReason reason, MmsMapping* mmsMapping) { - if ((self->ctlModel == 2) || (self->ctlModel == 4)) { - - if (unconditional) { + if ((self->ctlModel == 2) || (self->ctlModel == 4)) + { + if (unconditional) + { unselectObject(self, reason, mmsMapping); } - else { + else + { if (isSboClassOperateOnce(self)) unselectObject(self, reason, mmsMapping); else @@ -694,7 +719,8 @@ operateControl(ControlObject* self, MmsValue* value, uint64_t currentTime, bool static void resetAddCause(ControlObject* self) { - if (self) { + if (self) + { self->addCauseValue = ADD_CAUSE_UNKNOWN; MmsValue_setInt32(self->addCause, self->addCauseValue); @@ -710,8 +736,8 @@ executeStateMachine: state = getState(controlObject); - switch (state) { - + switch (state) + { case STATE_WAIT_FOR_SELECT: { controlObject->isSelect = 1; @@ -724,12 +750,14 @@ executeStateMachine: controlObject->isSelect = 0; - if (checkHandlerResult != CONTROL_WAITING_FOR_SELECT) { - - if (controlObject->ctlModel == 2) { + if (checkHandlerResult != CONTROL_WAITING_FOR_SELECT) + { + if (controlObject->ctlModel == 2) + { LinkedList values = LinkedList_create(); - if (checkHandlerResult == CONTROL_ACCEPTED) { + if (checkHandlerResult == CONTROL_ACCEPTED) + { LinkedList_add(values, controlObject->sbo); selectObject(controlObject, Hal_getTimeInMs(), controlObject->mmsConnection, self); @@ -738,7 +766,8 @@ executeStateMachine: updateGenericTrackingObjectValues(self, controlObject, IEC61850_SERVICE_TYPE_SELECT, IEC61850_SERVICE_ERROR_NO_ERROR); #endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ } - else { + else + { LinkedList_add(values, &emptyString); setState(controlObject, STATE_UNSELECTED); @@ -753,9 +782,10 @@ executeStateMachine: LinkedList_destroyStatic(values); } - else if (controlObject->ctlModel == 4) { - if (checkHandlerResult == CONTROL_ACCEPTED) { - + else if (controlObject->ctlModel == 4) + { + if (checkHandlerResult == CONTROL_ACCEPTED) + { selectObject(controlObject, Hal_getTimeInMs(), controlObject->mmsConnection, self); if (controlObject->ctlNumSt) @@ -773,8 +803,8 @@ executeStateMachine: if (DEBUG_IED_SERVER) printf("IED_SERVER: SBOw - selected successful\n"); } - else { - + else + { setState(controlObject, STATE_UNSELECTED); ControlObject_sendLastApplError(controlObject, controlObject->mmsConnection, "SBOw", @@ -793,13 +823,15 @@ executeStateMachine: printf("IED_SERVER: SBOw - select rejected by application!\n"); } } - else { + else + { /* ERROR: invalid internal state! */ setState(controlObject, STATE_WAIT_FOR_SELECT); } } - else { + else + { updateNextControlTimeout(self, Hal_getTimeInMs() + 100); } @@ -818,19 +850,23 @@ executeStateMachine: controlObject->errorValue = CONTROL_ERROR_NO_ERROR; controlObject->addCauseValue = ADD_CAUSE_BLOCKED_BY_SYNCHROCHECK; - if (controlObject->waitForExecutionHandler != NULL) { + if (controlObject->waitForExecutionHandler != NULL) + { dynamicCheckResult = controlObject->waitForExecutionHandler((ControlAction) controlObject, controlObject->waitForExecutionHandlerParameter, controlObject->ctlVal, controlObject->testMode, controlObject->synchroCheck); } - if (dynamicCheckResult == CONTROL_RESULT_FAILED) { - if ((controlObject->errorValue != CONTROL_ERROR_NO_ERROR) || (controlObject->addCauseValue != ADD_CAUSE_UNKNOWN)) { + if (dynamicCheckResult == CONTROL_RESULT_FAILED) + { + if ((controlObject->errorValue != CONTROL_ERROR_NO_ERROR) || (controlObject->addCauseValue != ADD_CAUSE_UNKNOWN)) + { ControlObject_sendLastApplError(controlObject, controlObject->mmsConnection, "Oper", controlObject->errorValue, controlObject->addCauseValue, controlObject->ctlNum, controlObject->origin, false); } - if (!isTimeActivatedControl) { + if (!isTimeActivatedControl) + { MmsServerConnection_sendWriteResponse(controlObject->mmsConnection, controlObject->operateInvokeId, DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED, true); @@ -838,7 +874,8 @@ executeStateMachine: updateGenericTrackingObjectValues(self, controlObject, IEC61850_SERVICE_TYPE_OPERATE, IEC61850_SERVICE_ERROR_ACCESS_NOT_ALLOWED_IN_CURRENT_STATE); #endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ } - else { + else + { #if (CONFIG_IEC61850_SERVICE_TRACKING == 1) updateGenericTrackingObjectValues(self, controlObject, IEC61850_SERVICE_TYPE_TIME_ACTIVATED_OPERATE, IEC61850_SERVICE_ERROR_ACCESS_NOT_ALLOWED_IN_CURRENT_STATE); #endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ @@ -849,8 +886,10 @@ executeStateMachine: abortControlOperation(controlObject, false, SELECT_STATE_REASON_OPERATE_FAILED, self); exitControlTask(controlObject); } - else if (dynamicCheckResult == CONTROL_RESULT_OK) { - if (isTimeActivatedControl) { + else if (dynamicCheckResult == CONTROL_RESULT_OK) + { + if (isTimeActivatedControl) + { ControlObject_sendCommandTerminationPositive(controlObject); #if (CONFIG_IEC61850_SERVICE_TRACKING == 1) @@ -862,7 +901,8 @@ executeStateMachine: MmsValue_setUtcTime(operTm, 0); MmsValue_setUtcTimeQuality(operTm, self->iedServer->timeQuality); } - else { + else + { MmsServerConnection_sendWriteResponse(controlObject->mmsConnection, controlObject->operateInvokeId, DATA_ACCESS_ERROR_SUCCESS, true); @@ -877,7 +917,8 @@ executeStateMachine: goto executeStateMachine; } - else { + else + { updateNextControlTimeout(self, Hal_getTimeInMs() + 10); } } @@ -889,11 +930,12 @@ executeStateMachine: ControlHandlerResult result = operateControl(controlObject, controlObject->ctlVal, currentTime, controlObject->testMode); - if (result != CONTROL_RESULT_WAITING) { - - if (result == CONTROL_RESULT_OK) { - - if ((controlObject->ctlModel == 4) || (controlObject->ctlModel == 3)) { + if (result != CONTROL_RESULT_WAITING) + { + if (result == CONTROL_RESULT_OK) + { + if ((controlObject->ctlModel == 4) || (controlObject->ctlModel == 3)) + { ControlObject_sendCommandTerminationPositive(controlObject); #if (CONFIG_IEC61850_SERVICE_TRACKING == 1) @@ -903,9 +945,10 @@ executeStateMachine: abortControlOperation(controlObject, false, SELECT_STATE_REASON_OPERATED, self); } - else { - - if ((controlObject->ctlModel == 4) || (controlObject->ctlModel == 3)) { + else + { + if ((controlObject->ctlModel == 4) || (controlObject->ctlModel == 3)) + { if (DEBUG_IED_SERVER) printf("IED_SERVER: operate failed!\n"); @@ -925,7 +968,8 @@ executeStateMachine: resetAddCause(controlObject); } - else { + else + { updateNextControlTimeout(self, currentTimeInMs + 10); } } @@ -949,7 +993,8 @@ ControlObject_create(IedServer iedServer, MmsDomain* domain, char* lnName, char* self->stateLock = Semaphore_create(1); self->pendingEventsLock = Semaphore_create(1); - if ((self->stateLock == NULL) || (self->pendingEventsLock == NULL)) { + if ((self->stateLock == NULL) || (self->pendingEventsLock == NULL)) + { ControlObject_destroy(self); self = NULL; goto exit_function; @@ -958,7 +1003,8 @@ ControlObject_create(IedServer iedServer, MmsDomain* domain, char* lnName, char* self->name = StringUtils_copyString(name); - if (self->name == NULL) { + if (self->name == NULL) + { ControlObject_destroy(self); self = NULL; goto exit_function; @@ -970,20 +1016,24 @@ ControlObject_create(IedServer iedServer, MmsDomain* domain, char* lnName, char* MmsVariableSpecification* ctlValSpec = MmsVariableSpecification_getChildSpecificationByName(operSpec, "ctlVal", NULL); - if (ctlValSpec) { + if (ctlValSpec) + { self->ctlVal = MmsValue_newDefaultValue(ctlValSpec); } - else { + else + { if (DEBUG_IED_SERVER) printf("IED_SERVER: control object %s/%s.%s has no ctlVal element!\n", domain->domainName, lnName, name); } MmsVariableSpecification* originSpec = MmsVariableSpecification_getChildSpecificationByName(operSpec, "origin", NULL); - if (originSpec) { + if (originSpec) + { self->origin = MmsValue_newDefaultValue(originSpec); } - else { + else + { if (DEBUG_IED_SERVER) printf("IED_SERVER: control object %s/%s.%s has no origin element!\n", domain->domainName, lnName, name); } @@ -1015,7 +1065,8 @@ ControlObject_initialize(ControlObject* self) MmsValue* ctlModel = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, ctlModelName); - if (ctlModel == NULL) { + if (ctlModel == NULL) + { if (DEBUG_IED_SERVER) printf("IED_SERVER: No control model found for variable %s\n", ctlModelName); } @@ -1028,7 +1079,8 @@ ControlObject_initialize(ControlObject* self) self->ctlNumSt = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, ctlNumName); - if (self->ctlNumSt == NULL) { + if (self->ctlNumSt == NULL) + { /* for APC */ ctlNumName = StringUtils_createStringInBuffer(strBuf, 130, 4, self->lnName, "$MX$", self->name, "$ctlNum"); @@ -1039,7 +1091,8 @@ ControlObject_initialize(ControlObject* self) self->originSt = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, originName); - if (self->originSt == NULL) { + if (self->originSt == NULL) + { /* for APC */ originName = StringUtils_createStringInBuffer(strBuf, 130, 4, self->lnName, "$MX$", self->name, "$origin"); @@ -1053,7 +1106,8 @@ ControlObject_initialize(ControlObject* self) updateSboTimeoutValue(self); - if (self->sbo) { + if (self->sbo) + { char* controlObjectReference = StringUtils_createStringInBuffer(strBuf, 130, 5, self->mmsDomain->domainName, "/", self->lnName, "$CO$", self->name); @@ -1154,7 +1208,8 @@ ControlObject_initialize(ControlObject* self) self->stSeld = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, stSeldName); - if ((self->stSeld) && (self->stSeld->type != IEC61850_BOOLEAN)) { + if ((self->stSeld) && (self->stSeld->type != IEC61850_BOOLEAN)) + { self->stSeld = NULL; if (DEBUG_IED_SERVER) @@ -1165,7 +1220,8 @@ ControlObject_initialize(ControlObject* self) self->opRcvd = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, opRcvdName); - if ((self->opRcvd) && (self->opRcvd->type != IEC61850_BOOLEAN)) { + if ((self->opRcvd) && (self->opRcvd->type != IEC61850_BOOLEAN)) + { self->opRcvd = NULL; if (DEBUG_IED_SERVER) @@ -1176,7 +1232,8 @@ ControlObject_initialize(ControlObject* self) self->opOk = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, opOkName); - if ((self->opOk) && (self->opOk->type != IEC61850_BOOLEAN)) { + if ((self->opOk) && (self->opOk->type != IEC61850_BOOLEAN)) + { self->opOk = NULL; if (DEBUG_IED_SERVER) @@ -1187,7 +1244,8 @@ ControlObject_initialize(ControlObject* self) self->tOpOk = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, tOpOkName); - if ((self->tOpOk) && (self->tOpOk->type != IEC61850_TIMESTAMP)) { + if ((self->tOpOk) && (self->tOpOk->type != IEC61850_TIMESTAMP)) + { self->tOpOk = NULL; if (DEBUG_IED_SERVER) @@ -1197,7 +1255,8 @@ ControlObject_initialize(ControlObject* self) self->error = MmsValue_newIntegerFromInt32(0); self->addCause = MmsValue_newIntegerFromInt32(0); - if (ctlModel != NULL) { + if (ctlModel != NULL) + { int ctlModelVal = MmsValue_toInt32(ctlModel); if (DEBUG_IED_SERVER) @@ -1225,44 +1284,50 @@ ControlObject_handlePendingEvents(ControlObject* self) Semaphore_wait(self->pendingEventsLock); #endif - if (self->pendingEvents > 0) { - - if (self->pendingEvents & PENDING_EVENT_SELECTED) { + if (self->pendingEvents > 0) + { + if (self->pendingEvents & PENDING_EVENT_SELECTED) + { if (self->stSeld) IedServer_updateBooleanAttributeValue(self->iedServer, self->stSeld, true); self->pendingEvents &= ~(PENDING_EVENT_SELECTED); } - if (self->pendingEvents & PENDING_EVENT_UNSELECTED) { + if (self->pendingEvents & PENDING_EVENT_UNSELECTED) + { if (self->stSeld) IedServer_updateBooleanAttributeValue(self->iedServer, self->stSeld, false); self->pendingEvents &= ~(PENDING_EVENT_UNSELECTED); } - if (self->pendingEvents & PENDING_EVENT_OP_RCVD_TRUE) { + if (self->pendingEvents & PENDING_EVENT_OP_RCVD_TRUE) + { if (self->opRcvd) IedServer_updateBooleanAttributeValue(self->iedServer, self->opRcvd, true); self->pendingEvents &= ~(PENDING_EVENT_OP_RCVD_TRUE); } - if (self->pendingEvents & PENDING_EVENT_OP_RCVD_FALSE) { + if (self->pendingEvents & PENDING_EVENT_OP_RCVD_FALSE) + { if (self->opRcvd) IedServer_updateBooleanAttributeValue(self->iedServer, self->opRcvd, false); self->pendingEvents &= ~(PENDING_EVENT_OP_RCVD_FALSE); } - if (self->pendingEvents & PENDING_EVENT_OP_OK_TRUE) { + if (self->pendingEvents & PENDING_EVENT_OP_OK_TRUE) + { if (self->opOk) IedServer_updateBooleanAttributeValue(self->iedServer, self->opOk, true); self->pendingEvents &= ~(PENDING_EVENT_OP_OK_TRUE); } - if (self->pendingEvents & PENDING_EVENT_OP_OK_FALSE) { + if (self->pendingEvents & PENDING_EVENT_OP_OK_FALSE) + { if (self->opOk) IedServer_updateBooleanAttributeValue(self->iedServer, self->opOk, false); @@ -1278,7 +1343,8 @@ ControlObject_handlePendingEvents(ControlObject* self) void ControlObject_destroy(ControlObject* self) { - if (self) { + if (self) + { if (self->mmsValue) MmsValue_delete(self->mmsValue); @@ -1357,7 +1423,8 @@ ControlObject_getMmsValue(ControlObject* self) bool ControlObject_unselect(ControlObject* self, MmsServerConnection connection, MmsMapping* mmsMapping) { - if (self->mmsConnection == connection) { + if (self->mmsConnection == connection) + { abortControlOperation(self, true, SELECT_STATE_REASON_DISCONNECTED, mmsMapping); return true; } @@ -1415,29 +1482,32 @@ ControlObject_updateControlModel(ControlObject* self, ControlModel value, DataOb void Control_processControlActions(MmsMapping* self, uint64_t currentTimeInMs) { - if (currentTimeInMs >= self->nextControlTimeout) { - + if (currentTimeInMs >= self->nextControlTimeout) + { /* invalidate nextControlTimeout */ self->nextControlTimeout = (uint64_t) 0xFFFFFFFFFFFFFFFFLLU; LinkedList element = LinkedList_getNext(self->controlObjects); - while (element != NULL) { + while (element != NULL) + { ControlObject* controlObject = (ControlObject*) element->data; - if (controlObject->state != STATE_UNSELECTED) { - - if ((controlObject->ctlModel == 1) || (controlObject->ctlModel == 3)) { - if (controlObject->state == STATE_READY) { + if (controlObject->state != STATE_UNSELECTED) + { + if ((controlObject->ctlModel == 1) || (controlObject->ctlModel == 3)) + { + if (controlObject->state == STATE_READY) + { element = LinkedList_getNext(element); continue; } } - if (controlObject->state == STATE_WAIT_FOR_ACTIVATION_TIME) { - - if (controlObject->operateTime <= currentTimeInMs) { - + if (controlObject->state == STATE_WAIT_FOR_ACTIVATION_TIME) + { + if (controlObject->operateTime <= currentTimeInMs) + { /* enter state Perform Test */ setOpRcvd(controlObject, true); @@ -1448,7 +1518,9 @@ Control_processControlActions(MmsMapping* self, uint64_t currentTimeInMs) CheckHandlerResult checkResult = CONTROL_ACCEPTED; - if (controlObject->checkHandler != NULL) { /* perform operative tests */ + if (controlObject->checkHandler != NULL) + { + /* perform operative tests */ controlObject->errorValue = CONTROL_ERROR_NO_ERROR; controlObject->addCauseValue = ADD_CAUSE_BLOCKED_BY_INTERLOCKING; @@ -1458,8 +1530,8 @@ Control_processControlActions(MmsMapping* self, uint64_t currentTimeInMs) controlObject->interlockCheck); } - if (checkResult == CONTROL_ACCEPTED) { - + if (checkResult == CONTROL_ACCEPTED) + { if (DEBUG_IED_SERVER) printf("IED_SERVER: time activated operate: command accepted\n"); @@ -1468,8 +1540,8 @@ Control_processControlActions(MmsMapping* self, uint64_t currentTimeInMs) executeControlTask(self, controlObject, currentTimeInMs); } - else { - + else + { ControlObject_sendLastApplError(controlObject, controlObject->mmsConnection, "Oper", controlObject->errorValue, controlObject->addCauseValue, controlObject->ctlNum, controlObject->origin, false); @@ -1512,12 +1584,16 @@ Control_lookupControlObject(MmsMapping* self, MmsDomain* domain, char* lnName, c { LinkedList element = LinkedList_getNext(self->controlObjects); - while (element != NULL) { + while (element != NULL) + { ControlObject* controlObject = (ControlObject*) element->data; - if (ControlObject_getDomain(controlObject) == domain) { - if (strcmp(ControlObject_getLNName(controlObject), lnName) == 0) { - if (strcmp(ControlObject_getName(controlObject), objectName) == 0) { + if (ControlObject_getDomain(controlObject) == domain) + { + if (strcmp(ControlObject_getLNName(controlObject), lnName) == 0) + { + if (strcmp(ControlObject_getName(controlObject), objectName) == 0) + { return controlObject; } } @@ -1532,8 +1608,10 @@ Control_lookupControlObject(MmsMapping* self, MmsDomain* domain, char* lnName, c static MmsValue* getCtlVal(MmsValue* operParameters) { - if (MmsValue_getType(operParameters) == MMS_STRUCTURE) { - if (MmsValue_getArraySize(operParameters) > 5) { + if (MmsValue_getType(operParameters) == MMS_STRUCTURE) + { + if (MmsValue_getArraySize(operParameters) > 5) + { return MmsValue_getElement(operParameters, 0); } } @@ -1678,7 +1756,8 @@ ControlObject_sendLastApplError(ControlObject* self, MmsServerConnection connect StringUtils_createStringInBuffer(ctlObj, 130, 7, MmsDomain_getName(self->mmsDomain), "/", self->lnName, "$CO$", self->name, "$", ctlVariable); - if (DEBUG_IED_SERVER) { + if (DEBUG_IED_SERVER) + { printf("IED_SERVER: sendLastApplError:\n"); printf("IED_SERVER: control object: %s\n", ctlObj); printf("IED_SERVER: ctlNum: %u\n", MmsValue_toUint32(ctlNum)); @@ -1728,7 +1807,8 @@ doesElementEquals(char* element, char* name) { int i = 0; - while (name[i] != 0) { + while (name[i] != 0) + { if (element[i] == 0) return false; @@ -1773,13 +1853,14 @@ Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* varia char* varName = MmsMapping_getNextNameElement(objectName); - if (varName != NULL) { - + if (varName != NULL) + { bool foundVar = false; char* nextVarName = varName; - do { + do + { if (doesElementEquals(varName, "Oper") || doesElementEquals(varName, "SBO") || doesElementEquals(varName, "SBOw") || @@ -1806,24 +1887,28 @@ Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* varia ControlObject* controlObject = Control_lookupControlObject(self, domain, lnName, objectName); - if (controlObject != NULL) { - - if (varName != NULL) { + if (controlObject != NULL) + { + if (varName != NULL) + { if (strcmp(varName, "Oper") == 0) value = controlObject->oper; else if (strcmp(varName, "SBOw") == 0) value = controlObject->sbow; - else if (strcmp(varName, "SBO") == 0) { - if (controlObject->ctlModel == 2) { - + else if (strcmp(varName, "SBO") == 0) + { + if (controlObject->ctlModel == 2) + { uint64_t currentTime = Hal_getTimeInMs(); value = &emptyString; - if (isDirectAccess == true) { + if (isDirectAccess == true) + { checkSelectTimeout(controlObject, currentTime, self); - if (getState(controlObject) == STATE_UNSELECTED) { + if (getState(controlObject) == STATE_UNSELECTED) + { CheckHandlerResult checkResult = CONTROL_ACCEPTED; /* opRcvd must not be set here! */ @@ -1831,7 +1916,9 @@ Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* varia controlObject->addCauseValue = ADD_CAUSE_UNKNOWN; controlObject->mmsConnection = connection; - if (controlObject->checkHandler != NULL) { /* perform operative tests */ + if (controlObject->checkHandler != NULL) + { + /* perform operative tests */ controlObject->isSelect = 1; @@ -1841,7 +1928,8 @@ Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* varia controlObject->isSelect = 0; } - if (checkResult == CONTROL_ACCEPTED) { + if (checkResult == CONTROL_ACCEPTED) + { selectObject(controlObject, currentTime, connection, self); value = controlObject->sbo; @@ -1849,13 +1937,15 @@ Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* varia updateGenericTrackingObjectValues(self, controlObject, IEC61850_SERVICE_TYPE_SELECT, IEC61850_SERVICE_ERROR_NO_ERROR); #endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ } - else if (checkResult == CONTROL_WAITING_FOR_SELECT) { + else if (checkResult == CONTROL_WAITING_FOR_SELECT) + { controlObject->mmsConnection = connection; controlObject->operateInvokeId = MmsServerConnection_getLastInvokeId(connection); setState(controlObject, STATE_WAIT_FOR_SELECT); value = &delayedResponse; } - else { + else + { #if (CONFIG_IEC61850_SERVICE_TRACKING == 1) updateGenericTrackingObjectValues(self, controlObject, IEC61850_SERVICE_TYPE_SELECT, convertCheckHandlerResultToServiceError(checkResult)); @@ -1863,9 +1953,9 @@ Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* varia } } } - } - else { + else + { if (DEBUG_IED_SERVER) printf("IED_SERVER: select not applicable for control model %u\n", controlObject->ctlModel); @@ -1875,7 +1965,8 @@ Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* varia else if (strcmp(varName, "Cancel") == 0) value = controlObject->cancel; - else { + else + { value = MmsValue_getSubElement(ControlObject_getMmsValue(controlObject), ControlObject_getTypeSpec(controlObject), varName); } @@ -1884,7 +1975,8 @@ Control_readAccessControlObject(MmsMapping* self, MmsDomain* domain, char* varia value = ControlObject_getMmsValue(controlObject); } } - else { + else + { if (DEBUG_IED_SERVER) printf("IED_SERVER: Control object not found %s/%s.%s\n", domain->domainName, lnName, objectName); } @@ -1958,13 +2050,14 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char char* varName = MmsMapping_getNextNameElement(objectName); - if (varName != NULL) { - + if (varName != NULL) + { bool foundVar = false; char* nextVarName = varName; - do { + do + { if (doesElementEquals(varName, "Oper") || doesElementEquals(varName, "SBO") || doesElementEquals(varName, "SBOw") || @@ -1989,31 +2082,36 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char if (DEBUG_IED_SERVER) printf("IED_SERVER: write access control: objectName: (%s) varName: (%s)\n", objectName, varName); - if (varName == NULL) { + if (varName == NULL) + { indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; goto free_and_return; } controlObject = Control_lookupControlObject(self, domain, lnName, objectName); - if (controlObject == NULL) { + if (controlObject == NULL) + { indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; goto free_and_return; } - if (controlObject->ctlModel == CONTROL_MODEL_STATUS_ONLY) { + if (controlObject->ctlModel == CONTROL_MODEL_STATUS_ONLY) + { indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; goto free_and_return; } - if (strcmp(varName, "SBOw") == 0) { /* select with value */ - + if (strcmp(varName, "SBOw") == 0) /* select with value */ + { serviceType = IEC61850_SERVICE_TYPE_SELECT_WITH_VALUES; - if (controlObject->ctlModel == 4) { - - if (controlObject->sbow) { - if (MmsValue_update(controlObject->sbow, value) == false) { + if (controlObject->ctlModel == 4) + { + if (controlObject->sbow) + { + if (MmsValue_update(controlObject->sbow, value) == false) + { if (DEBUG_IED_SERVER) printf("IED_SERVER: SBOw - type mismatch\n"); } @@ -2021,14 +2119,15 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char MmsValue* ctlVal = getCtlVal(value); - if (ctlVal != NULL) { - + if (ctlVal != NULL) + { MmsValue* ctlNum = getOperParameterCtlNum(value); MmsValue* origin = getOperParameterOrigin(value); MmsValue* check = getOperParameterCheck(value); MmsValue* test = getOperParameterTest(value); - if (checkValidityOfOriginParameter(origin) == false) { + if (checkValidityOfOriginParameter(origin) == false) + { indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; ControlObject_sendLastApplError(controlObject, connection, "SBOw", CONTROL_ERROR_NO_ERROR, @@ -2046,9 +2145,10 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char checkSelectTimeout(controlObject, currentTime, self); - if (state != STATE_UNSELECTED) { - - if ((state == STATE_OPERATE) || (state == STATE_WAIT_FOR_EXECUTION)) { + if (state != STATE_UNSELECTED) + { + if ((state == STATE_OPERATE) || (state == STATE_WAIT_FOR_EXECUTION)) + { indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; ControlObject_sendLastApplError(controlObject, connection, "SBOw", @@ -2060,7 +2160,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char goto free_and_return; } - else { + else + { indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; ControlObject_sendLastApplError(controlObject, connection, "SBOw", CONTROL_ERROR_NO_ERROR, @@ -2072,8 +2173,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char goto free_and_return; } } - else { - + else + { CheckHandlerResult checkResult = CONTROL_ACCEPTED; /* opRcvd must not be set here! */ @@ -2088,7 +2189,9 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char controlObject->testMode = testCondition; - if (controlObject->checkHandler != NULL) { /* perform operative tests */ + if (controlObject->checkHandler != NULL) + { + /* perform operative tests */ controlObject->isSelect = 1; @@ -2100,7 +2203,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char controlObject->isSelect = 0; } - if (checkResult == CONTROL_ACCEPTED) { + if (checkResult == CONTROL_ACCEPTED) + { selectObject(controlObject, currentTime, connection, self); indication = DATA_ACCESS_ERROR_SUCCESS; @@ -2108,7 +2212,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char if (DEBUG_IED_SERVER) printf("IED_SERVER: SBOw - selected successful\n"); } - else if (checkResult == CONTROL_WAITING_FOR_SELECT) { + else if (checkResult == CONTROL_WAITING_FOR_SELECT) + { controlObject->mmsConnection = connection; controlObject->operateInvokeId = MmsServerConnection_getLastInvokeId(connection); @@ -2122,7 +2227,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char indication = DATA_ACCESS_ERROR_NO_RESPONSE; } - else { + else + { indication = (MmsDataAccessError) checkResult; ControlObject_sendLastApplError(controlObject, connection, "SBOw", controlObject->errorValue, @@ -2135,17 +2241,19 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char } } } - else { + else + { indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; } } - else { + else + { indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; goto free_and_return; } } - else if (strcmp(varName, "Oper") == 0) { - + else if (strcmp(varName, "Oper") == 0) + { serviceType = IEC61850_SERVICE_TYPE_OPERATE; MmsValue* ctlVal = getCtlVal(value); @@ -2156,19 +2264,22 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char MmsValue* timeParameter = getOperParameterTime(value); if ((ctlVal == NULL) || (test == NULL) || (ctlNum == NULL) || (origin == NULL) || (check == NULL) - || (timeParameter == NULL)) { + || (timeParameter == NULL)) + { indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; goto free_and_return; } - if (checkValidityOfOriginParameter(origin) == false) { + if (checkValidityOfOriginParameter(origin) == false) + { indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; ControlObject_sendLastApplError(controlObject, connection, "Oper", CONTROL_ERROR_NO_ERROR, ADD_CAUSE_INCONSISTENT_PARAMETERS, ctlNum, origin, true); - if ((controlObject->ctlModel == 2) || (controlObject->ctlModel == 4)) { + if ((controlObject->ctlModel == 2) || (controlObject->ctlModel == 4)) + { unselectObject(controlObject, SELECT_STATE_REASON_OPERATE_FAILED, self); } @@ -2181,7 +2292,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char int state = getState(controlObject); - if (state == STATE_WAIT_FOR_ACTIVATION_TIME) { + if (state == STATE_WAIT_FOR_ACTIVATION_TIME) + { indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; ControlObject_sendLastApplError(controlObject, connection, "Oper", @@ -2190,15 +2302,17 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char goto free_and_return; } - else if (state == STATE_READY) { - + else if (state == STATE_READY) + { bool interlockCheck = MmsValue_getBitStringBit(check, 1); bool synchroCheck = MmsValue_getBitStringBit(check, 0); bool testCondition = MmsValue_getBoolean(test); - if ((controlObject->ctlModel == 2) || (controlObject->ctlModel == 4)) { - if (controlObject->mmsConnection != connection) { + if ((controlObject->ctlModel == 2) || (controlObject->ctlModel == 4)) + { + if (controlObject->mmsConnection != connection) + { indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; if (DEBUG_IED_SERVER) printf("IED_SERVER: Oper - operate from wrong client connection!\n"); @@ -2209,7 +2323,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char goto free_and_return; } - if (controlObject->ctlModel == 4) { /* select-before-operate with enhanced security */ + if (controlObject->ctlModel == 4) /* select-before-operate with enhanced security */ + { if ((MmsValue_equals(ctlVal, controlObject->ctlVal) && MmsValue_equals(origin, controlObject->origin) && MmsValue_equals(ctlNum, controlObject->ctlNum) && @@ -2237,24 +2352,29 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char MmsValue* operTm = getOperParameterOperTime(value); - if (operTm != NULL) { + if (operTm != NULL) + { controlObject->operateTime = MmsValue_getUtcTimeInMs(operTm); - if (controlObject->operateTime > currentTime) { + if (controlObject->operateTime > currentTime) + { controlObject->timeActivatedOperate = true; controlObject->synchroCheck = synchroCheck; controlObject->interlockCheck = interlockCheck; controlObject->mmsConnection = connection; CheckHandlerResult checkResult = CONTROL_ACCEPTED; - if (controlObject->checkHandler != NULL) { /* perform operative tests */ + if (controlObject->checkHandler != NULL) + { + /* perform operative tests */ checkResult = controlObject->checkHandler((ControlAction) controlObject, controlObject->checkHandlerParameter, ctlVal, testCondition, interlockCheck); } - if (checkResult == CONTROL_ACCEPTED) { + if (checkResult == CONTROL_ACCEPTED) + { initiateControlTask(controlObject); setState(controlObject, STATE_WAIT_FOR_ACTIVATION_TIME); @@ -2266,19 +2386,21 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char indication = DATA_ACCESS_ERROR_SUCCESS; } - else { + else + { indication = (MmsDataAccessError) checkResult; } } } - else{ + else + { controlObject->operateTime = 0; } MmsValue_update(controlObject->oper, value); - if (controlObject->timeActivatedOperate == false) { - + if (controlObject->timeActivatedOperate == false) + { CheckHandlerResult checkResult = CONTROL_ACCEPTED; /* enter state Perform Test */ @@ -2288,13 +2410,16 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char controlObject->addCauseValue = ADD_CAUSE_UNKNOWN; controlObject->mmsConnection = connection; - if (controlObject->checkHandler != NULL) { /* perform operative tests */ + if (controlObject->checkHandler != NULL) + { + /* perform operative tests */ checkResult = controlObject->checkHandler((ControlAction) controlObject, controlObject->checkHandlerParameter, ctlVal, testCondition, interlockCheck); } - if (checkResult == CONTROL_ACCEPTED) { + if (checkResult == CONTROL_ACCEPTED) + { indication = DATA_ACCESS_ERROR_NO_RESPONSE; controlObject->mmsConnection = connection; @@ -2310,7 +2435,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char updateNextControlTimeout(self, currentTime); } - else { + else + { indication = (MmsDataAccessError) checkResult; /* leave state Perform Test */ @@ -2318,7 +2444,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char abortControlOperation(controlObject, false, SELECT_STATE_REASON_OPERATE_FAILED, self); - if ((controlObject->ctlModel == 3) || (controlObject->ctlModel == 4)) { + if ((controlObject->ctlModel == 3) || (controlObject->ctlModel == 4)) + { ControlObject_sendLastApplError(controlObject, connection, "Oper", controlObject->errorValue, controlObject->addCauseValue, ctlNum, origin, true); @@ -2327,7 +2454,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char } } - else if (state == STATE_UNSELECTED) { + else if (state == STATE_UNSELECTED) + { if (DEBUG_IED_SERVER) printf("IED_SERVER: Oper failed - control not selected!\n"); @@ -2340,7 +2468,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char goto free_and_return; } - else if ((state == STATE_OPERATE) || (state == STATE_WAIT_FOR_EXECUTION)) { + else if ((state == STATE_OPERATE) || (state == STATE_WAIT_FOR_EXECUTION)) + { if (DEBUG_IED_SERVER) printf("IED_SERVER: Oper failed - control already being executed!\n"); @@ -2353,8 +2482,8 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char goto free_and_return; } } - else if (strcmp(varName, "Cancel") == 0) { - + else if (strcmp(varName, "Cancel") == 0) + { serviceType = IEC61850_SERVICE_TYPE_CANCEL; int state = getState(controlObject); @@ -2365,14 +2494,16 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char MmsValue* ctlNum = getCancelParameterCtlNum(value); MmsValue* origin = getCancelParameterOrigin(value); - if ((ctlNum == NULL) || (origin == NULL)) { + if ((ctlNum == NULL) || (origin == NULL)) + { indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; if (DEBUG_IED_SERVER) printf("IED_SERVER: Invalid cancel message!\n"); goto free_and_return; } - if ((state == STATE_OPERATE) || (state == STATE_WAIT_FOR_EXECUTION)) { + if ((state == STATE_OPERATE) || (state == STATE_WAIT_FOR_EXECUTION)) + { indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; ControlObject_sendLastApplError(controlObject, connection, "Cancel", @@ -2382,26 +2513,32 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char goto free_and_return; } - if ((controlObject->ctlModel == 2) || (controlObject->ctlModel == 4)) { - if (state != STATE_UNSELECTED) { - if (controlObject->mmsConnection == connection) { + if ((controlObject->ctlModel == 2) || (controlObject->ctlModel == 4)) + { + if (state != STATE_UNSELECTED) + { + if (controlObject->mmsConnection == connection) + { indication = DATA_ACCESS_ERROR_SUCCESS; unselectObject(controlObject, SELECT_STATE_REASON_CANCELED, self); goto free_and_return; } - else { + else + { indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; ControlObject_sendLastApplError(controlObject, connection, "Cancel", CONTROL_ERROR_NO_ERROR, ADD_CAUSE_LOCKED_BY_OTHER_CLIENT, ctlNum, origin, true); } } - else { + else + { indication = DATA_ACCESS_ERROR_SUCCESS; } } - if (controlObject->timeActivatedOperate) { + if (controlObject->timeActivatedOperate) + { controlObject->timeActivatedOperate = false; abortControlOperation(controlObject, false, SELECT_STATE_REASON_CANCELED, self); @@ -2414,14 +2551,18 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, const char free_and_return: #if (CONFIG_IEC61850_SERVICE_TRACKING == 1) - if (controlObject) { - if (serviceError == IEC61850_SERVICE_ERROR_NO_ERROR) { - if (indication != DATA_ACCESS_ERROR_NO_RESPONSE) { + if (controlObject) + { + if (serviceError == IEC61850_SERVICE_ERROR_NO_ERROR) + { + if (indication != DATA_ACCESS_ERROR_NO_RESPONSE) + { updateGenericTrackingObjectValues(self, controlObject, serviceType, private_IedServer_convertMmsDataAccessErrorToServiceError(indication)); } } - else { + else + { updateGenericTrackingObjectValues(self, controlObject, serviceType, serviceError); } } @@ -2453,7 +2594,8 @@ ControlAction_getOrCat(ControlAction self) { ControlObject* controlObject = (ControlObject*) self; - if (controlObject->origin) { + if (controlObject->origin) + { MmsValue* orCat = MmsValue_getElement(controlObject->origin, 0); if (orCat) { @@ -2469,10 +2611,12 @@ ControlAction_getOrIdent(ControlAction self, int* orIdentSize) { ControlObject* controlObject = (ControlObject*) self; - if (controlObject->origin) { + if (controlObject->origin) + { MmsValue* orIdent = MmsValue_getElement(controlObject->origin, 1); - if (orIdent) { + if (orIdent) + { if (MmsValue_getType(orIdent) == MMS_OCTET_STRING) { *orIdentSize = MmsValue_getOctetStringSize(orIdent); return MmsValue_getOctetStringBuffer(orIdent); @@ -2547,4 +2691,3 @@ ControlAction_getControlTime(ControlAction self) } #endif /* (CONFIG_IEC61850_CONTROL_SERVICE == 1) */ - diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 90d863fa..a14ed58f 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -3186,7 +3186,6 @@ mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerCo } #endif - #if (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) /* GOOSE control blocks - GO */ if (isGooseControlBlock(separator)) { @@ -3213,8 +3212,8 @@ mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerCo #if (CONFIG_IEC61850_REPORT_SERVICE == 1) /* Report control blocks - BR, RP */ - if (isReportControlBlock(separator)) { - + if (isReportControlBlock(separator)) + { LinkedList reportControls = self->reportControls; LinkedList nextElement = reportControls; @@ -3235,11 +3234,12 @@ mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerCo else variableIdLen = strlen(variableId); - while ((nextElement = LinkedList_getNext(nextElement)) != NULL) { + while ((nextElement = LinkedList_getNext(nextElement)) != NULL) + { ReportControl* rc = (ReportControl*) nextElement->data; - if (rc->domain == domain) { - + if (rc->domain == domain) + { int parentLNNameStrLen = strlen(rc->parentLN->name); if (parentLNNameStrLen != lnNameLength) @@ -3248,7 +3248,8 @@ mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerCo if (memcmp(rc->parentLN->name, variableId, parentLNNameStrLen) != 0) continue; - if (strlen(rc->name) == variableIdLen) { + if (strlen(rc->name) == variableIdLen) + { if (strncmp(variableId, rc->name, variableIdLen) == 0) { char* elementName = MmsMapping_getNextNameElement(reportName); @@ -3665,15 +3666,26 @@ mmsReadAccessHandler (void* parameter, MmsDomain* domain, char* variableId, MmsS if (DEBUG_IED_SERVER) printf("IED_SERVER: mmsReadAccessHandler: Requested %s\n", variableId); + if (self->iedServer->ignoreReadAccess) + { + if (DEBUG_IED_SERVER) + printf("IED_SERVER: mmsReadAccessHandler - ignore request\n"); + + return DATA_ACCESS_ERROR_NO_RESPONSE; + } + char* separator = strchr(variableId, '$'); #if (CONFIG_IEC61850_SETTING_GROUPS == 1) - if (separator) { - if (isFunctionalConstraint("SE", separator)) { + if (separator) + { + if (isFunctionalConstraint("SE", separator)) + { SettingGroup* sg = getSettingGroupByMmsDomain(self, domain); - if (sg != NULL) { + if (sg != NULL) + { if (sg->sgcb->editSG == 0) return DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; } @@ -3695,7 +3707,8 @@ mmsReadAccessHandler (void* parameter, MmsDomain* domain, char* variableId, MmsS { FunctionalConstraint fc = IEC61850_FC_NONE; - if (separator != NULL) { + if (separator != NULL) + { fc = FunctionalConstraint_fromString(separator + 1); if (fc == IEC61850_FC_BR || fc == IEC61850_FC_US || @@ -3716,23 +3729,27 @@ mmsReadAccessHandler (void* parameter, MmsDomain* domain, char* variableId, MmsS { char* doStart = strchr(separator + 1, '$'); - if (doStart != NULL) { - + if (doStart != NULL) + { char* doEnd = strchr(doStart + 1, '$'); - if (doEnd == NULL) { + if (doEnd == NULL) + { StringUtils_copyStringToBuffer(doStart + 1, str); } - else { + else + { doEnd--; StringUtils_createStringFromBufferInBuffer(str, (uint8_t*) (doStart + 1), doEnd - doStart); } - if (fc == IEC61850_FC_SP) { + if (fc == IEC61850_FC_SP) + { if (!strcmp(str, "SGCB")) { - if (self->controlBlockAccessHandler) { + if (self->controlBlockAccessHandler) + { ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, connection); @@ -3747,10 +3764,10 @@ mmsReadAccessHandler (void* parameter, MmsDomain* domain, char* variableId, MmsS ModelNode* dobj = ModelNode_getChild((ModelNode*) ln, str); - if (dobj != NULL) { - - if (dobj->modelType == DataObjectModelType) { - + if (dobj != NULL) + { + if (dobj->modelType == DataObjectModelType) + { ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, connection); @@ -3759,7 +3776,8 @@ mmsReadAccessHandler (void* parameter, MmsDomain* domain, char* variableId, MmsS } } } - else { + else + { ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, connection); @@ -3769,10 +3787,12 @@ mmsReadAccessHandler (void* parameter, MmsDomain* domain, char* variableId, MmsS } } } - else { + else + { LogicalNode* ln = LogicalDevice_getLogicalNode(ld, variableId); - if (ln != NULL) { + if (ln != NULL) + { ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, connection); return self->readAccessHandler(ld, ln, NULL, fc, clientConnection,