diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index bffed036..c0203674 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -60,6 +60,9 @@ struct sIedServerConfig /** when true (default) enable dynamic data set services for MMS */ bool enableDynamicDataSetService; + /** maximum number of data set entries of dynamic data sets */ + int maxDataSetEntries; + /** when true (default) enable log service */ bool enableLogService; @@ -194,9 +197,17 @@ IedServerConfig_setMaxAssociationSpecificDataSets(IedServerConfig self, int maxD void IedServerConfig_setMaxDomainSpecificDataSets(IedServerConfig self, int maxDataSets); +/** + * \brief Set the maximum number of entries in a dynamic data set + * + * \param maxDataSetEntries the maximum number of entries allowed in a data set + */ void IedServerConfig_setMaxDataSetEntries(IedServerConfig self, int maxDataSetEntries); +int +IedServerConfig_getMaxDatasSetEntries(IedServerConfig self); + void IedServerConfig_enableWriteDataSetService(IedServerConfig self, bool enable); diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index a1a351b6..4bcb12f1 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -437,6 +437,7 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio if (serverConfiguration) { MmsServer_enableFileService(self->mmsServer, serverConfiguration->enableFileService); MmsServer_enableDynamicNamedVariableListService(self->mmsServer, serverConfiguration->enableDynamicDataSetService); + MmsServer_setMaxDataSetEntries(self->mmsServer, serverConfiguration->maxDataSetEntries); MmsServer_enableJournalService(self->mmsServer, serverConfiguration->enableLogService); MmsServer_setFilestoreBasepath(self->mmsServer, serverConfiguration->fileServiceBasepath); MmsServer_setMaxConnections(self->mmsServer, serverConfiguration->maxMmsConnections); diff --git a/src/iec61850/server/impl/ied_server_config.c b/src/iec61850/server/impl/ied_server_config.c index cc01c773..a03e0975 100644 --- a/src/iec61850/server/impl/ied_server_config.c +++ b/src/iec61850/server/impl/ied_server_config.c @@ -24,6 +24,10 @@ #include "iec61850_server.h" #include "libiec61850_platform_includes.h" +#ifndef CONFIG_MMS_MAX_NUMBER_OF_DATA_SET_MEMBERS +#define CONFIG_MMS_MAX_NUMBER_OF_DATA_SET_MEMBERS 100 +#endif + IedServerConfig IedServerConfig_create() { @@ -34,6 +38,7 @@ IedServerConfig_create() self->fileServiceBasepath = StringUtils_copyString(CONFIG_VIRTUAL_FILESTORE_BASEPATH); self->enableFileService = true; self->enableDynamicDataSetService = true; + self->maxDataSetEntries = CONFIG_MMS_MAX_NUMBER_OF_DATA_SET_MEMBERS; self->enableLogService = true; self->edition = IEC_61850_EDITION_2; } @@ -114,6 +119,18 @@ IedServerConfig_isDynamicDataSetServiceEnabled(IedServerConfig self) return self->enableDynamicDataSetService; } +void +IedServerConfig_setMaxDataSetEntries(IedServerConfig self, int maxDataSetEntries) +{ + self->maxDataSetEntries = maxDataSetEntries; +} + +int +IedServerConfig_getMaxDatasSetEntries(IedServerConfig self) +{ + return self->maxDataSetEntries; +} + void IedServerConfig_enableLogService(IedServerConfig self, bool enable) { diff --git a/src/mms/inc/mms_server.h b/src/mms/inc/mms_server.h index 1780bc39..e4cd063f 100644 --- a/src/mms/inc/mms_server.h +++ b/src/mms/inc/mms_server.h @@ -255,6 +255,15 @@ MmsServer_enableFileService(MmsServer self, bool enable); void MmsServer_enableDynamicNamedVariableListService(MmsServer self, bool enable); +/** + * \brief Set the maximum number of data set entries (for dynamic data sets) + * + * \param[in] self the MmsServer instance + * \param[in] maximum number of dynamic data set entires + */ +void +MmsServer_setMaxDataSetEntries(MmsServer self, int maxDataSetEntries); + /** * \brief Enable/disable journal service * diff --git a/src/mms/inc_private/mms_server_internal.h b/src/mms/inc_private/mms_server_internal.h index 62ea4061..bea5994b 100644 --- a/src/mms/inc_private/mms_server_internal.h +++ b/src/mms/inc_private/mms_server_internal.h @@ -168,6 +168,7 @@ struct sMmsServer { int maxConnections; bool fileServiceEnabled; bool dynamicVariableListServiceEnabled; + int maxDataSetEntries; bool journalServiceEnabled; #endif /* (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) */ diff --git a/src/mms/iso_mms/server/mms_named_variable_list_service.c b/src/mms/iso_mms/server/mms_named_variable_list_service.c index 469bc3d3..8aee035d 100644 --- a/src/mms/iso_mms/server/mms_named_variable_list_service.c +++ b/src/mms/iso_mms/server/mms_named_variable_list_service.c @@ -291,7 +291,7 @@ checkIfVariableExists(MmsDevice* device, MmsAccessSpecifier* accessSpecifier) static MmsNamedVariableList -createNamedVariableList(MmsDomain* domain, MmsDevice* device, +createNamedVariableList(MmsServer server, MmsDomain* domain, MmsDevice* device, DefineNamedVariableListRequest_t* request, char* variableListName, MmsError* mmsError) { @@ -299,7 +299,11 @@ createNamedVariableList(MmsDomain* domain, MmsDevice* device, int variableCount = request->listOfVariable.list.count; +#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) + if ((variableCount == 0 ) || (variableCount > server->maxDataSetEntries)) { +#else if ((variableCount == 0 ) || (variableCount > CONFIG_MMS_MAX_NUMBER_OF_DATA_SET_MEMBERS)) { +#endif *mmsError = MMS_ERROR_DEFINITION_OTHER; goto exit_function; } @@ -467,7 +471,7 @@ mmsServer_handleDefineNamedVariableListRequest( else { MmsError mmsError; - MmsNamedVariableList namedVariableList = createNamedVariableList(domain, device, + MmsNamedVariableList namedVariableList = createNamedVariableList(connection->server, domain, device, request, variableListName, &mmsError); if (namedVariableList != NULL) { @@ -513,7 +517,7 @@ mmsServer_handleDefineNamedVariableListRequest( else { MmsError mmsError; - MmsNamedVariableList namedVariableList = createNamedVariableList(NULL, device, + MmsNamedVariableList namedVariableList = createNamedVariableList(connection->server, NULL, device, request, variableListName, &mmsError); if (namedVariableList != NULL) { @@ -557,7 +561,7 @@ mmsServer_handleDefineNamedVariableListRequest( else { MmsError mmsError; - MmsNamedVariableList namedVariableList = createNamedVariableList(NULL, device, + MmsNamedVariableList namedVariableList = createNamedVariableList(connection->server, NULL, device, request, variableListName, &mmsError); if (namedVariableList != NULL) { diff --git a/src/mms/iso_mms/server/mms_server.c b/src/mms/iso_mms/server/mms_server.c index 5cf57390..18ef0a42 100644 --- a/src/mms/iso_mms/server/mms_server.c +++ b/src/mms/iso_mms/server/mms_server.c @@ -71,6 +71,7 @@ MmsServer_create(MmsDevice* device, TLSConfiguration tlsConfiguration) self->fileServiceEnabled = true; self->dynamicVariableListServiceEnabled = true; self->journalServiceEnabled = true; + self->maxDataSetEntries = CONFIG_MMS_MAX_NUMBER_OF_DATA_SET_MEMBERS; #endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */ return self; @@ -125,6 +126,12 @@ MmsServer_enableDynamicNamedVariableListService(MmsServer self, bool enable) self->dynamicVariableListServiceEnabled = enable; } +void +MmsServer_setMaxDataSetEntries(MmsServer self, int maxDataSetEntries) +{ + self->maxDataSetEntries = maxDataSetEntries; +} + void MmsServer_enableJournalService(MmsServer self, bool enable) { diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 27a7b3d6..9382c85c 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -614,3 +614,5 @@ EXPORTS IedServerConfig_getEdition IedServerConfig_setMaxMmsConnections IedServerConfig_getMaxMmsConnections + IedServerConfig_setMaxDataSetEntries + IedServerConfig_getMaxDatasSetEntries diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index e90c3ff1..79dc10ee 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -742,3 +742,5 @@ EXPORTS IedServerConfig_getEdition IedServerConfig_setMaxMmsConnections IedServerConfig_getMaxMmsConnections + IedServerConfig_setMaxDataSetEntries + IedServerConfig_getMaxDatasSetEntries