From 0a3d86601b3d8ce0f607c6b9ba52f03fffeb73e7 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 26 Jul 2018 07:48:33 +0200 Subject: [PATCH] - IEC 61850 server/MMS server: make dynamic data set service configurable at runtime with IedServerConfig object (new functions IedServerConfig_enableDynamicDataSetService and IedServerConfig_isDynamicDataSetServiceEnabled) --- .../server_example_basic_io.c | 3 ++ src/iec61850/inc/iec61850_server.h | 19 +++++++++ src/iec61850/server/impl/ied_server.c | 4 +- src/iec61850/server/impl/ied_server_config.c | 12 ++++++ src/mms/inc/mms_server.h | 11 +++++ src/mms/inc_private/mms_server_internal.h | 1 + .../iso_mms/server/mms_association_service.c | 13 ++++-- src/mms/iso_mms/server/mms_server.c | 7 ++++ .../iso_mms/server/mms_server_connection.c | 41 +++++++++++++++---- src/vs/libiec61850-wo-goose.def | 2 + src/vs/libiec61850.def | 2 + 11 files changed, 101 insertions(+), 14 deletions(-) diff --git a/examples/server_example_basic_io/server_example_basic_io.c b/examples/server_example_basic_io/server_example_basic_io.c index 7e413922..54887187 100644 --- a/examples/server_example_basic_io/server_example_basic_io.c +++ b/examples/server_example_basic_io/server_example_basic_io.c @@ -96,6 +96,9 @@ main(int argc, char** argv) /* disable MMS file service */ IedServerConfig_enableFileService(config, false); + /* disable dynamic data set service */ + IedServerConfig_enableDynamicDataSetService(config, true); + /* Create a new IEC 61850 server instance */ iedServer = IedServer_createWithConfig(&iedModel, NULL, config); diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index 9ad4507c..1f17d226 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -56,6 +56,9 @@ struct sIedServerConfig /** when true (default) enable MMS file service */ bool enableFileService; + + /** when true (default) enable dynamic data set services for MMS */ + bool enableDynamicDataSetService; }; /** @@ -118,6 +121,22 @@ IedServerConfig_enableFileService(IedServerConfig self, bool enable); bool IedServerConfig_isFileServiceEnabled(IedServerConfig self); +/** + * \brief Enable/disable the dynamic data set service for MMS + * + * \param[in] enable set true to enable dynamic data set service, otherwise false + */ +void +IedServerConfig_enableDynamicDataSetService(IedServerConfig self, bool enable); + +/** + * \brief Is the dynamic data set service for MMS enabled or disabled + * + * \return true if enabled, false otherwise + */ +bool +IedServerConfig_isDynamicDataSetServiceEnabled(IedServerConfig self); + /** * An opaque handle for an IED server instance */ diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index c88c7823..200032fa 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -422,8 +422,10 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio 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); + } #endif if (serverConfiguration) diff --git a/src/iec61850/server/impl/ied_server_config.c b/src/iec61850/server/impl/ied_server_config.c index 23552f40..956b0645 100644 --- a/src/iec61850/server/impl/ied_server_config.c +++ b/src/iec61850/server/impl/ied_server_config.c @@ -33,6 +33,7 @@ IedServerConfig_create() self->reportBufferSize = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; self->fileServiceBasepath = StringUtils_copyString(CONFIG_VIRTUAL_FILESTORE_BASEPATH); self->enableFileService = true; + self->enableDynamicDataSetService = true; } return self; @@ -87,3 +88,14 @@ IedServerConfig_isFileServiceEnabled(IedServerConfig self) return self->enableFileService; } +void +IedServerConfig_enableDynamicDataSetService(IedServerConfig self, bool enable) +{ + self->enableDynamicDataSetService = enable; +} + +bool +IedServerConfig_isDynamicDataSetServiceEnabled(IedServerConfig self) +{ + return self->enableDynamicDataSetService; +} diff --git a/src/mms/inc/mms_server.h b/src/mms/inc/mms_server.h index f47760b1..d0a2cd60 100644 --- a/src/mms/inc/mms_server.h +++ b/src/mms/inc/mms_server.h @@ -236,6 +236,17 @@ MmsServer_setFilestoreBasepath(MmsServer self, const char* basepath); void MmsServer_enableFileService(MmsServer self, bool enable); +/** + * \brief Enable/disable dynamic named variable list (data set) service + * + * NOTE: requires CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME = 1 in stack configuration + * + * \param[in] self the MmsServer instance + * \param[in] enable true to enable named variable list services, false to disable + */ +void +MmsServer_enableDynamicNamedVariableListService(MmsServer self, bool enable); + /** * \brief lock the cached server data model * diff --git a/src/mms/inc_private/mms_server_internal.h b/src/mms/inc_private/mms_server_internal.h index bb350fb4..0013d63a 100644 --- a/src/mms/inc_private/mms_server_internal.h +++ b/src/mms/inc_private/mms_server_internal.h @@ -166,6 +166,7 @@ struct sMmsServer { #if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) bool fileServiceEnabled; + bool dynamicVariableListServiceEnabled; #endif /* (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) */ }; diff --git a/src/mms/iso_mms/server/mms_association_service.c b/src/mms/iso_mms/server/mms_association_service.c index c1d31318..e31a411a 100644 --- a/src/mms/iso_mms/server/mms_association_service.c +++ b/src/mms/iso_mms/server/mms_association_service.c @@ -105,10 +105,6 @@ encodeInitResponseDetail(MmsServerConnection self, uint8_t* buffer, int bufPos, | MMS_SERVICE_GET_VARIABLE_ACCESS_ATTRIBUTES , 0x00 - #if ((MMS_DATA_SET_SERVICE == 1) && (MMS_DYNAMIC_DATA_SETS == 1)) - | MMS_SERVICE_DEFINE_NAMED_VARIABLE_LIST - | MMS_SERVICE_DELETE_NAMED_VARIABLE_LIST - #endif #if ((MMS_DATA_SET_SERVICE == 1) && (MMS_GET_DATA_SET_ATTRIBUTES == 1)) | MMS_SERVICE_GET_NAMED_VARIABLE_LIST_ATTRIBUTES #endif @@ -151,6 +147,15 @@ encodeInitResponseDetail(MmsServerConnection self, uint8_t* buffer, int bufPos, } + if (self->server->dynamicVariableListServiceEnabled) { + +#if ((MMS_DATA_SET_SERVICE == 1) && (MMS_DYNAMIC_DATA_SETS == 1)) + servicesSupported[1] |= MMS_SERVICE_DEFINE_NAMED_VARIABLE_LIST; + servicesSupported[1] |= MMS_SERVICE_DELETE_NAMED_VARIABLE_LIST; +#endif + + } + #else uint8_t servicesSupported[] = diff --git a/src/mms/iso_mms/server/mms_server.c b/src/mms/iso_mms/server/mms_server.c index 46d08ad5..3b029e17 100644 --- a/src/mms/iso_mms/server/mms_server.c +++ b/src/mms/iso_mms/server/mms_server.c @@ -69,6 +69,7 @@ MmsServer_create(MmsDevice* device, TLSConfiguration tlsConfiguration) #if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) self->fileServiceEnabled = true; + self->dynamicVariableListServiceEnabled = true; #endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */ return self; @@ -111,6 +112,12 @@ MmsServer_enableFileService(MmsServer self, bool enable) self->fileServiceEnabled = enable; } +void +MmsServer_enableDynamicNamedVariableListService(MmsServer self, bool enable) +{ + self->dynamicVariableListServiceEnabled = enable; +} + #endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */ void diff --git a/src/mms/iso_mms/server/mms_server_connection.c b/src/mms/iso_mms/server/mms_server_connection.c index 4767ca7e..4017b636 100644 --- a/src/mms/iso_mms/server/mms_server_connection.c +++ b/src/mms/iso_mms/server/mms_server_connection.c @@ -1,7 +1,7 @@ /* * mms_server_connection.c * - * Copyright 2013-2016 Michael Zillgith + * Copyright 2013-2018 Michael Zillgith * * This file is part of libIEC61850. * @@ -334,11 +334,42 @@ handleConfirmedRequestPdu( #endif /* MMS_GET_VARIABLE_ACCESS_ATTRIBUTES == 1 */ #if (MMS_DYNAMIC_DATA_SETS == 1) + +#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) + + case 0xab: /* define-named-variable-list */ + if (self->server->dynamicVariableListServiceEnabled) + mmsServer_handleDefineNamedVariableListRequest(self, + buffer, bufPos, bufPos + length, + invokeId, response); + else + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); + break; + + case 0xad: /* delete-named-variable-list-request */ + if (self->server->dynamicVariableListServiceEnabled) + mmsServer_handleDeleteNamedVariableListRequest(self, + buffer, bufPos, bufPos + length, + invokeId, response); + else + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); + break; + +#else case 0xab: /* define-named-variable-list */ mmsServer_handleDefineNamedVariableListRequest(self, buffer, bufPos, bufPos + length, invokeId, response); break; + + case 0xad: /* delete-named-variable-list-request */ + mmsServer_handleDeleteNamedVariableListRequest(self, + buffer, bufPos, bufPos + length, + invokeId, response); + break; + +#endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */ + #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ #if (MMS_GET_DATA_SET_ATTRIBUTES == 1) @@ -349,14 +380,6 @@ handleConfirmedRequestPdu( break; #endif /* (MMS_GET_DATA_SET_ATTRIBUTES == 1) */ -#if (MMS_DYNAMIC_DATA_SETS == 1) - case 0xad: /* delete-named-variable-list-request */ - mmsServer_handleDeleteNamedVariableListRequest(self, - buffer, bufPos, bufPos + length, - invokeId, response); - break; -#endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ - default: mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); return; diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 092b3051..284acd03 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -606,3 +606,5 @@ EXPORTS ControlObjectClient_getCtlValType IedServerConfig_enableFileService IedServerConfig_isFileServiceEnabled + IedServerConfig_enableDynamicDataSetService + IedServerConfig_isDynamicDataSetServiceEnabled diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index 991b2f8c..b11db748 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -734,3 +734,5 @@ EXPORTS SVPublisher_ASDU_setSmpCntWrap IedServerConfig_enableFileService IedServerConfig_isFileServiceEnabled + IedServerConfig_enableDynamicDataSetService + IedServerConfig_isDynamicDataSetServiceEnabled