From fd3847dcc5b7a3d2a25dd72f48e6d23197a01393 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 2 Mar 2021 09:26:01 +0100 Subject: [PATCH] - IED server: make presence of BRCB.ResvTms configurable at runtime with function IedServerConfig_enableResvTmsForBRCB (F1558) --- dotnet/IEC61850forCSharp/IedServerConfig.cs | 577 ++++++++++-------- src/iec61850/inc/iec61850_server.h | 19 + src/iec61850/inc_private/ied_server_private.h | 1 + src/iec61850/server/impl/ied_server.c | 6 + src/iec61850/server/impl/ied_server_config.c | 14 + src/iec61850/server/mms_mapping/reporting.c | 56 +- 6 files changed, 383 insertions(+), 290 deletions(-) diff --git a/dotnet/IEC61850forCSharp/IedServerConfig.cs b/dotnet/IEC61850forCSharp/IedServerConfig.cs index d2b4f71b..acf7cbf3 100644 --- a/dotnet/IEC61850forCSharp/IedServerConfig.cs +++ b/dotnet/IEC61850forCSharp/IedServerConfig.cs @@ -27,275 +27,316 @@ using IEC61850.Common; namespace IEC61850.Server { - /// - /// IedServer configuration object - /// - public class IedServerConfig : IDisposable - { - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern IntPtr IedServerConfig_create(); + /// + /// IedServer configuration object + /// + public class IedServerConfig : IDisposable + { + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern IntPtr IedServerConfig_create(); - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern IntPtr IedServerConfig_destroy(IntPtr self); + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern IntPtr IedServerConfig_destroy(IntPtr self); - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_setReportBufferSize(IntPtr self, int reportBufferSize); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern int IedServerConfig_getReportBufferSize(IntPtr self); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_setReportBufferSizeForURCBs(IntPtr self, int reportBufferSize); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern int IedServerConfig_getReportBufferSizeForURCBs(IntPtr self); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_setFileServiceBasePath(IntPtr self, string basepath); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern IntPtr IedServerConfig_getFileServiceBasePath(IntPtr self); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_enableFileService(IntPtr self, [MarshalAs(UnmanagedType.I1)] bool enable); - - [return: MarshalAs(UnmanagedType.I1)] - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern bool IedServerConfig_isFileServiceEnabled(IntPtr self); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_setEdition(IntPtr self, byte edition); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern byte IedServerConfig_getEdition(IntPtr self); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_setMaxMmsConnections(IntPtr self, int maxConnections); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern int IedServerConfig_getMaxMmsConnections(IntPtr self); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - [return: MarshalAs(UnmanagedType.I1)] - static extern bool IedServerConfig_isDynamicDataSetServiceEnabled(IntPtr self); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_enableDynamicDataSetService(IntPtr self, [MarshalAs(UnmanagedType.I1)] bool enable); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_setMaxAssociationSpecificDataSets(IntPtr self, int maxDataSets); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern int IedServerConfig_getMaxAssociationSpecificDataSets(IntPtr self); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_setMaxDomainSpecificDataSets(IntPtr self, int maxDataSets); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern int IedServerConfig_getMaxDomainSpecificDataSets(IntPtr self); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_setMaxDataSetEntries(IntPtr self, int maxDataSetEntries); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern int IedServerConfig_getMaxDatasSetEntries(IntPtr self); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - static extern void IedServerConfig_enableLogService(IntPtr self, [MarshalAs(UnmanagedType.I1)] bool enable); - - [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] - [return: MarshalAs(UnmanagedType.I1)] - static extern bool IedServerConfig_isLogServiceEnabled(IntPtr self); - - internal IntPtr self; - - public IedServerConfig () - { - self = IedServerConfig_create (); - } - - /// - /// Gets or sets the size of the report buffer for buffered report control blocks - /// - /// The size of the report buffer. - public int ReportBufferSize - { - get { - return IedServerConfig_getReportBufferSize (self); - } - set { - IedServerConfig_setReportBufferSize (self, value); - } - } - - /// - /// Gets or sets the size of the report buffer for unbuffered report control blocks - /// - /// The size of the report buffer. - public int ReportBufferSizeForURCBs - { - get - { - return IedServerConfig_getReportBufferSizeForURCBs(self); - } - set - { - IedServerConfig_setReportBufferSizeForURCBs(self, value); - } - } - - /// - /// Gets or sets the file service base path. - /// - /// The file service base path. - public string FileServiceBasePath - { - get { - return Marshal.PtrToStringAnsi (IedServerConfig_getFileServiceBasePath (self)); - } - set { - IedServerConfig_setFileServiceBasePath (self, value); - } - } - - /// - /// Enable/Disable file service for MMS - /// - /// true if file service is enabled; otherwise, false. - public bool FileServiceEnabled - { - get - { - return IedServerConfig_isFileServiceEnabled(self); - } - set - { - IedServerConfig_enableFileService(self, value); - } - } - - /// - /// Gets or sets the edition of the IEC 61850 standard to use - /// - /// The IEC 61850 edition to use. - public Iec61850Edition Edition - { - get { - return (Iec61850Edition)IedServerConfig_getEdition (self); - } - set { - IedServerConfig_setEdition (self, (byte) value); - } - } - - /// - /// Gets or sets maximum number of MMS clients - /// - /// The max number of MMS client connections. - public int MaxMmsConnections - { - get { - return IedServerConfig_getMaxMmsConnections (self); - } - set { - IedServerConfig_setMaxMmsConnections (self, value); - } - } - - /// - /// Enable/Disable dynamic data set service for MMS - /// - /// true if dynamic data set service enabled; otherwise, false. - public bool DynamicDataSetServiceEnabled - { - get { - return IedServerConfig_isDynamicDataSetServiceEnabled (self); - } - set { - IedServerConfig_enableDynamicDataSetService (self, value); - } - } - - /// - /// Gets or sets the maximum number of data set entries for dynamic data sets - /// - /// The max. number data set entries. - public int MaxDataSetEntries - { - get { - return IedServerConfig_getMaxDatasSetEntries (self); - } - set { - IedServerConfig_setMaxDataSetEntries (self, value); - } - } - - /// - /// Gets or sets the maximum number of association specific (non-permanent) data sets. - /// - /// The max. number of association specific data sets. - public int MaxAssociationSpecificDataSets - { - get { - return IedServerConfig_getMaxAssociationSpecificDataSets (self); - } - set { - IedServerConfig_setMaxAssociationSpecificDataSets (self, value); - } - } - - /// - /// Gets or sets the maximum number of domain specific (permanent) data sets. - /// - /// The max. numebr of domain specific data sets. - public int MaxDomainSpecificDataSets - { - get { - return IedServerConfig_getMaxDomainSpecificDataSets (self); - } - set { - IedServerConfig_setMaxDomainSpecificDataSets (self, value); - } - } - - /// - /// Enable/Disable log service for MMS - /// - /// true if log service is enabled; otherwise, false. - public bool LogServiceEnabled - { - get - { - return IedServerConfig_isLogServiceEnabled(self); - } - set - { - IedServerConfig_enableLogService(self, value); - } - } - - /// - /// Releases all resource used by the object. - /// - /// Call when you are finished using the . The - /// method leaves the in an unusable state. After - /// calling , you must release all references to the - /// so the garbage collector can reclaim the memory that the - /// was occupying. - public void Dispose() - { - lock (this) { - if (self != IntPtr.Zero) { - IedServerConfig_destroy (self); - self = IntPtr.Zero; - } - } - } - - ~IedServerConfig() - { - Dispose (); - } - } + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_setReportBufferSize(IntPtr self, int reportBufferSize); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern int IedServerConfig_getReportBufferSize(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_setReportBufferSizeForURCBs(IntPtr self, int reportBufferSize); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern int IedServerConfig_getReportBufferSizeForURCBs(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_setFileServiceBasePath(IntPtr self, string basepath); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern IntPtr IedServerConfig_getFileServiceBasePath(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_enableFileService(IntPtr self, [MarshalAs(UnmanagedType.I1)] bool enable); + + [return: MarshalAs(UnmanagedType.I1)] + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern bool IedServerConfig_isFileServiceEnabled(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_setEdition(IntPtr self, byte edition); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern byte IedServerConfig_getEdition(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_setMaxMmsConnections(IntPtr self, int maxConnections); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern int IedServerConfig_getMaxMmsConnections(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + static extern bool IedServerConfig_isDynamicDataSetServiceEnabled(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_enableDynamicDataSetService(IntPtr self, [MarshalAs(UnmanagedType.I1)] bool enable); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_setMaxAssociationSpecificDataSets(IntPtr self, int maxDataSets); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern int IedServerConfig_getMaxAssociationSpecificDataSets(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_setMaxDomainSpecificDataSets(IntPtr self, int maxDataSets); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern int IedServerConfig_getMaxDomainSpecificDataSets(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_setMaxDataSetEntries(IntPtr self, int maxDataSetEntries); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern int IedServerConfig_getMaxDatasSetEntries(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_enableLogService(IntPtr self, [MarshalAs(UnmanagedType.I1)] bool enable); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + static extern bool IedServerConfig_isLogServiceEnabled(IntPtr self); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServerConfig_enableResvTmsForBRCB(IntPtr self, [MarshalAs(UnmanagedType.I1)] bool enable); + + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + static extern bool IedServerConfig_isResvTmsForBRCBEnabled(IntPtr self); + + internal IntPtr self; + + public IedServerConfig() + { + self = IedServerConfig_create(); + } + + /// + /// Gets or sets the size of the report buffer for buffered report control blocks + /// + /// The size of the report buffer. + public int ReportBufferSize + { + get + { + return IedServerConfig_getReportBufferSize(self); + } + set + { + IedServerConfig_setReportBufferSize(self, value); + } + } + + /// + /// Gets or sets the size of the report buffer for unbuffered report control blocks + /// + /// The size of the report buffer. + public int ReportBufferSizeForURCBs + { + get + { + return IedServerConfig_getReportBufferSizeForURCBs(self); + } + set + { + IedServerConfig_setReportBufferSizeForURCBs(self, value); + } + } + + /// + /// Gets or sets the file service base path. + /// + /// The file service base path. + public string FileServiceBasePath + { + get + { + return Marshal.PtrToStringAnsi(IedServerConfig_getFileServiceBasePath(self)); + } + set + { + IedServerConfig_setFileServiceBasePath(self, value); + } + } + + /// + /// Enable/Disable file service for MMS + /// + /// true if file service is enabled; otherwise, false. + public bool FileServiceEnabled + { + get + { + return IedServerConfig_isFileServiceEnabled(self); + } + set + { + IedServerConfig_enableFileService(self, value); + } + } + + /// + /// Gets or sets the edition of the IEC 61850 standard to use + /// + /// The IEC 61850 edition to use. + public Iec61850Edition Edition + { + get + { + return (Iec61850Edition)IedServerConfig_getEdition(self); + } + set + { + IedServerConfig_setEdition(self, (byte)value); + } + } + + /// + /// Gets or sets maximum number of MMS clients + /// + /// The max number of MMS client connections. + public int MaxMmsConnections + { + get + { + return IedServerConfig_getMaxMmsConnections(self); + } + set + { + IedServerConfig_setMaxMmsConnections(self, value); + } + } + + /// + /// Enable/Disable dynamic data set service for MMS + /// + /// true if dynamic data set service enabled; otherwise, false. + public bool DynamicDataSetServiceEnabled + { + get + { + return IedServerConfig_isDynamicDataSetServiceEnabled(self); + } + set + { + IedServerConfig_enableDynamicDataSetService(self, value); + } + } + + /// + /// Gets or sets the maximum number of data set entries for dynamic data sets + /// + /// The max. number data set entries. + public int MaxDataSetEntries + { + get + { + return IedServerConfig_getMaxDatasSetEntries(self); + } + set + { + IedServerConfig_setMaxDataSetEntries(self, value); + } + } + + /// + /// Gets or sets the maximum number of association specific (non-permanent) data sets. + /// + /// The max. number of association specific data sets. + public int MaxAssociationSpecificDataSets + { + get + { + return IedServerConfig_getMaxAssociationSpecificDataSets(self); + } + set + { + IedServerConfig_setMaxAssociationSpecificDataSets(self, value); + } + } + + /// + /// Gets or sets the maximum number of domain specific (permanent) data sets. + /// + /// The max. numebr of domain specific data sets. + public int MaxDomainSpecificDataSets + { + get + { + return IedServerConfig_getMaxDomainSpecificDataSets(self); + } + set + { + IedServerConfig_setMaxDomainSpecificDataSets(self, value); + } + } + + /// + /// Enable/Disable log service for MMS + /// + /// true if log service is enabled; otherwise, false. + public bool LogServiceEnabled + { + get + { + return IedServerConfig_isLogServiceEnabled(self); + } + set + { + IedServerConfig_enableLogService(self, value); + } + } + + /// + /// Enable/Disable the presence of ResvTms attribute in BRCBs (buffered report control blocks) + /// + /// true if BRCB has ResvTms; otherwise, false. + public bool BRCBHasResvTms + { + get + { + return IedServerConfig_isResvTmsForBRCBEnabled(self); + } + set + { + IedServerConfig_enableResvTmsForBRCB(self, value); + } + } + + /// + /// Releases all resource used by the object. + /// + /// Call when you are finished using the . The + /// method leaves the in an unusable state. After + /// calling , you must release all references to the + /// so the garbage collector can reclaim the memory that the + /// was occupying. + public void Dispose() + { + lock (this) + { + if (self != IntPtr.Zero) + { + IedServerConfig_destroy(self); + self = IntPtr.Zero; + } + } + } + + ~IedServerConfig() + { + Dispose(); + } + } } diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index 4d111d4e..0615defa 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -89,6 +89,9 @@ struct sIedServerConfig /** enable visibility of SGCB.ResvTms (default: true) */ bool enableResvTmsForSGCB; + + /** BRCB has resvTms attribute - only edition 2 (default: true) */ + bool enableResvTmsForBRCB; }; /** @@ -304,6 +307,22 @@ IedServerConfig_enableEditSG(IedServerConfig self, bool enable); LIB61850_API void IedServerConfig_enableResvTmsForSGCB(IedServerConfig self, bool enable); +/** + * \brief Enable/disable the presence of BRCB.ResvTms + * + * \param[in] enable set true to enable, otherwise false (default value it true) + */ +LIB61850_API void +IedServerConfig_enableResvTmsForBRCB(IedServerConfig self, bool enable); + +/** + * \brief ResvTms for BRCB enabled (visible) + * + * \return true if enabled, false otherwise + */ +LIB61850_API bool +IedServerConfig_isResvTmsForBRCBEnabled(IedServerConfig self); + /** * \brief Enable/disable using the integrated GOOSE publisher for configured GoCBs * diff --git a/src/iec61850/inc_private/ied_server_private.h b/src/iec61850/inc_private/ied_server_private.h index 6b1aad8a..0c05efe2 100644 --- a/src/iec61850/inc_private/ied_server_private.h +++ b/src/iec61850/inc_private/ied_server_private.h @@ -47,6 +47,7 @@ struct sIedServer #if (CONFIG_IEC61850_REPORT_SERVICE == 1) int reportBufferSizeBRCBs; int reportBufferSizeURCBs; + bool enableBRCBResvTms; #endif #if (CONFIG_MMS_THREADLESS_STACK != 1) diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index d2199c2c..c24ee4a9 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -482,10 +482,16 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio if (serverConfiguration) { self->reportBufferSizeBRCBs = serverConfiguration->reportBufferSize; self->reportBufferSizeURCBs = serverConfiguration->reportBufferSizeURCBs; + self->enableBRCBResvTms = serverConfiguration->enableResvTmsForBRCB; } else { self->reportBufferSizeBRCBs = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; self->reportBufferSizeURCBs = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; +#if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) + self->enableBRCBResvTms = true; +#else + self->enableBRCBResvTms = false; +#endif } #endif diff --git a/src/iec61850/server/impl/ied_server_config.c b/src/iec61850/server/impl/ied_server_config.c index 4f79819d..6d294765 100644 --- a/src/iec61850/server/impl/ied_server_config.c +++ b/src/iec61850/server/impl/ied_server_config.c @@ -55,6 +55,7 @@ IedServerConfig_create() self->edition = IEC_61850_EDITION_2; self->maxMmsConnections = 5; self->enableEditSG = true; + self->enableResvTmsForBRCB = true; } return self; @@ -199,6 +200,19 @@ IedServerConfig_enableResvTmsForSGCB(IedServerConfig self, bool enable) self->enableResvTmsForSGCB = enable; } +void +IedServerConfig_enableResvTmsForBRCB(IedServerConfig self, bool enable) +{ + self->enableResvTmsForBRCB = enable; +} + +bool +IedServerConfig_isResvTmsForBRCBEnabled(IedServerConfig self) +{ + return self->enableResvTmsForBRCB; +} + + void IedServerConfig_useIntegratedGoosePublisher(IedServerConfig self, bool enable) { diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 40454739..1aa0cffa 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -269,10 +269,16 @@ ReportControl_getRCBValue(ReportControl* rc, char* elementName) if (rc->server->edition >= IEC_61850_EDITION_2) { #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) - if (strcmp(elementName, "ResvTms") == 0) - return MmsValue_getElement(rc->rcbValues, 13); - if (strcmp(elementName, "Owner") == 0) - return MmsValue_getElement(rc->rcbValues, 14); + if (rc->server->enableBRCBResvTms) { + if (strcmp(elementName, "ResvTms") == 0) + return MmsValue_getElement(rc->rcbValues, 13); + if (strcmp(elementName, "Owner") == 0) + return MmsValue_getElement(rc->rcbValues, 14); + } + else { + if (strcmp(elementName, "Owner") == 0) + return MmsValue_getElement(rc->rcbValues, 13); + } #else if (strcmp(elementName, "Owner") == 0) return MmsValue_getElement(rc->rcbValues, 13); @@ -1118,7 +1124,8 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock, if (reportControl->server->edition >= IEC_61850_EDITION_2) { #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) - brcbElementCount++; + if (reportControl->server->enableBRCBResvTms) + brcbElementCount++; #endif if (reportControl->hasOwner) @@ -1249,16 +1256,17 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock, int currentIndex = 13; #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) - int resvTmsIndex = currentIndex; - namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); - namedVariable->name = StringUtils_copyString("ResvTms"); - namedVariable->type = MMS_INTEGER; - namedVariable->typeSpec.integer = 16; - rcb->typeSpec.structure.elements[currentIndex] = namedVariable; - mmsValue->value.structure.components[currentIndex] = MmsValue_newInteger(16); - currentIndex++; + if (reportControl->server->enableBRCBResvTms) { + namedVariable = (MmsVariableSpecification*) GLOBAL_CALLOC(1, sizeof(MmsVariableSpecification)); + namedVariable->name = StringUtils_copyString("ResvTms"); + namedVariable->type = MMS_INTEGER; + namedVariable->typeSpec.integer = 16; + rcb->typeSpec.structure.elements[currentIndex] = namedVariable; + mmsValue->value.structure.components[currentIndex] = MmsValue_newInteger(16); + currentIndex++; + } #endif /* (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) */ if (reportControl->hasOwner) { @@ -1281,7 +1289,9 @@ createBufferedReportControlBlock(ReportControlBlock* reportControlBlock, } #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) - MmsValue_setInt16(mmsValue->value.structure.components[resvTmsIndex], reportControl->resvTms); + if (reportControl->server->enableBRCBResvTms) { + MmsValue_setInt16(mmsValue->value.structure.components[resvTmsIndex], reportControl->resvTms); + } #endif } @@ -1569,9 +1579,11 @@ checkReservationTimeout(MmsMapping* self, ReportControl* rc) printf("IED_SERVER: reservation timeout expired for %s.%s\n", rc->parentLN->name, rc->name); #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) - MmsValue* resvTmsVal = ReportControl_getRCBValue(rc, "ResvTms"); - if (resvTmsVal) - MmsValue_setInt16(resvTmsVal, rc->resvTms); + if (self->iedServer->enableBRCBResvTms) { + MmsValue* resvTmsVal = ReportControl_getRCBValue(rc, "ResvTms"); + if (resvTmsVal) + MmsValue_setInt16(resvTmsVal, rc->resvTms); + } #endif rc->reservationTimeout = 0; @@ -1641,9 +1653,11 @@ reserveRcb(ReportControl* rc, MmsServerConnection connection) if (rc->buffered) { #if (CONFIG_IEC61850_BRCB_WITH_RESVTMS == 1) - MmsValue* resvTmsVal = ReportControl_getRCBValue(rc, "ResvTms"); - if (resvTmsVal) - MmsValue_setInt16(resvTmsVal, rc->resvTms); + if (rc->server->enableBRCBResvTms) { + MmsValue* resvTmsVal = ReportControl_getRCBValue(rc, "ResvTms"); + if (resvTmsVal) + MmsValue_setInt16(resvTmsVal, rc->resvTms); + } #endif } else { @@ -1655,7 +1669,6 @@ reserveRcb(ReportControl* rc, MmsServerConnection connection) updateOwner(rc, connection); } -#if 1 MmsDataAccessError Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* elementName, MmsValue* value, MmsServerConnection connection) @@ -2087,7 +2100,6 @@ exit_function: return retVal; } -#endif void Reporting_deactivateReportsForConnection(MmsMapping* self, MmsServerConnection connection)