- IEC 61850 server/MMS server: make dynamic data set service configurable at runtime with IedServerConfig object (new functions IedServerConfig_enableDynamicDataSetService and IedServerConfig_isDynamicDataSetServiceEnabled)

pull/72/head
Michael Zillgith 7 years ago
parent 27e883a1bc
commit 0a3d86601b

@ -96,6 +96,9 @@ main(int argc, char** argv)
/* disable MMS file service */ /* disable MMS file service */
IedServerConfig_enableFileService(config, false); IedServerConfig_enableFileService(config, false);
/* disable dynamic data set service */
IedServerConfig_enableDynamicDataSetService(config, true);
/* Create a new IEC 61850 server instance */ /* Create a new IEC 61850 server instance */
iedServer = IedServer_createWithConfig(&iedModel, NULL, config); iedServer = IedServer_createWithConfig(&iedModel, NULL, config);

@ -56,6 +56,9 @@ struct sIedServerConfig
/** when true (default) enable MMS file service */ /** when true (default) enable MMS file service */
bool enableFileService; 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 bool
IedServerConfig_isFileServiceEnabled(IedServerConfig self); 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 * An opaque handle for an IED server instance
*/ */

@ -422,8 +422,10 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio
self->mmsServer = MmsServer_create(self->mmsDevice, tlsConfiguration); self->mmsServer = MmsServer_create(self->mmsDevice, tlsConfiguration);
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) #if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
if (serverConfiguration) if (serverConfiguration) {
MmsServer_enableFileService(self->mmsServer, serverConfiguration->enableFileService); MmsServer_enableFileService(self->mmsServer, serverConfiguration->enableFileService);
MmsServer_enableDynamicNamedVariableListService(self->mmsServer, serverConfiguration->enableDynamicDataSetService);
}
#endif #endif
if (serverConfiguration) if (serverConfiguration)

@ -33,6 +33,7 @@ IedServerConfig_create()
self->reportBufferSize = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE; self->reportBufferSize = CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE;
self->fileServiceBasepath = StringUtils_copyString(CONFIG_VIRTUAL_FILESTORE_BASEPATH); self->fileServiceBasepath = StringUtils_copyString(CONFIG_VIRTUAL_FILESTORE_BASEPATH);
self->enableFileService = true; self->enableFileService = true;
self->enableDynamicDataSetService = true;
} }
return self; return self;
@ -87,3 +88,14 @@ IedServerConfig_isFileServiceEnabled(IedServerConfig self)
return self->enableFileService; return self->enableFileService;
} }
void
IedServerConfig_enableDynamicDataSetService(IedServerConfig self, bool enable)
{
self->enableDynamicDataSetService = enable;
}
bool
IedServerConfig_isDynamicDataSetServiceEnabled(IedServerConfig self)
{
return self->enableDynamicDataSetService;
}

@ -236,6 +236,17 @@ MmsServer_setFilestoreBasepath(MmsServer self, const char* basepath);
void void
MmsServer_enableFileService(MmsServer self, bool enable); 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 * \brief lock the cached server data model
* *

@ -166,6 +166,7 @@ struct sMmsServer {
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) #if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
bool fileServiceEnabled; bool fileServiceEnabled;
bool dynamicVariableListServiceEnabled;
#endif /* (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) */ #endif /* (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) */
}; };

@ -105,10 +105,6 @@ encodeInitResponseDetail(MmsServerConnection self, uint8_t* buffer, int bufPos,
| MMS_SERVICE_GET_VARIABLE_ACCESS_ATTRIBUTES | MMS_SERVICE_GET_VARIABLE_ACCESS_ATTRIBUTES
, ,
0x00 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)) #if ((MMS_DATA_SET_SERVICE == 1) && (MMS_GET_DATA_SET_ATTRIBUTES == 1))
| MMS_SERVICE_GET_NAMED_VARIABLE_LIST_ATTRIBUTES | MMS_SERVICE_GET_NAMED_VARIABLE_LIST_ATTRIBUTES
#endif #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 #else
uint8_t servicesSupported[] = uint8_t servicesSupported[] =

@ -69,6 +69,7 @@ MmsServer_create(MmsDevice* device, TLSConfiguration tlsConfiguration)
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) #if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
self->fileServiceEnabled = true; self->fileServiceEnabled = true;
self->dynamicVariableListServiceEnabled = true;
#endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */ #endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */
return self; return self;
@ -111,6 +112,12 @@ MmsServer_enableFileService(MmsServer self, bool enable)
self->fileServiceEnabled = enable; self->fileServiceEnabled = enable;
} }
void
MmsServer_enableDynamicNamedVariableListService(MmsServer self, bool enable)
{
self->dynamicVariableListServiceEnabled = enable;
}
#endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */ #endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */
void void

@ -1,7 +1,7 @@
/* /*
* mms_server_connection.c * mms_server_connection.c
* *
* Copyright 2013-2016 Michael Zillgith * Copyright 2013-2018 Michael Zillgith
* *
* This file is part of libIEC61850. * This file is part of libIEC61850.
* *
@ -334,29 +334,52 @@ handleConfirmedRequestPdu(
#endif /* MMS_GET_VARIABLE_ACCESS_ATTRIBUTES == 1 */ #endif /* MMS_GET_VARIABLE_ACCESS_ATTRIBUTES == 1 */
#if (MMS_DYNAMIC_DATA_SETS == 1) #if (MMS_DYNAMIC_DATA_SETS == 1)
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
case 0xab: /* define-named-variable-list */ case 0xab: /* define-named-variable-list */
if (self->server->dynamicVariableListServiceEnabled)
mmsServer_handleDefineNamedVariableListRequest(self, mmsServer_handleDefineNamedVariableListRequest(self,
buffer, bufPos, bufPos + length, buffer, bufPos, bufPos + length,
invokeId, response); invokeId, response);
else
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response);
break; break;
#endif /* (MMS_DYNAMIC_DATA_SETS == 1) */
#if (MMS_GET_DATA_SET_ATTRIBUTES == 1) case 0xad: /* delete-named-variable-list-request */
case 0xac: /* get-named-variable-list-attributes-request */ if (self->server->dynamicVariableListServiceEnabled)
mmsServer_handleGetNamedVariableListAttributesRequest(self, 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, buffer, bufPos, bufPos + length,
invokeId, response); invokeId, response);
break; break;
#endif /* (MMS_GET_DATA_SET_ATTRIBUTES == 1) */
#if (MMS_DYNAMIC_DATA_SETS == 1)
case 0xad: /* delete-named-variable-list-request */ case 0xad: /* delete-named-variable-list-request */
mmsServer_handleDeleteNamedVariableListRequest(self, mmsServer_handleDeleteNamedVariableListRequest(self,
buffer, bufPos, bufPos + length, buffer, bufPos, bufPos + length,
invokeId, response); invokeId, response);
break; break;
#endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */
#endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */
#if (MMS_GET_DATA_SET_ATTRIBUTES == 1)
case 0xac: /* get-named-variable-list-attributes-request */
mmsServer_handleGetNamedVariableListAttributesRequest(self,
buffer, bufPos, bufPos + length,
invokeId, response);
break;
#endif /* (MMS_GET_DATA_SET_ATTRIBUTES == 1) */
default: default:
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response);
return; return;

@ -606,3 +606,5 @@ EXPORTS
ControlObjectClient_getCtlValType ControlObjectClient_getCtlValType
IedServerConfig_enableFileService IedServerConfig_enableFileService
IedServerConfig_isFileServiceEnabled IedServerConfig_isFileServiceEnabled
IedServerConfig_enableDynamicDataSetService
IedServerConfig_isDynamicDataSetServiceEnabled

@ -734,3 +734,5 @@ EXPORTS
SVPublisher_ASDU_setSmpCntWrap SVPublisher_ASDU_setSmpCntWrap
IedServerConfig_enableFileService IedServerConfig_enableFileService
IedServerConfig_isFileServiceEnabled IedServerConfig_isFileServiceEnabled
IedServerConfig_enableDynamicDataSetService
IedServerConfig_isDynamicDataSetServiceEnabled

Loading…
Cancel
Save