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

pull/72/head
Michael Zillgith 7 years ago
parent 0a3d86601b
commit 71493036dc

@ -97,7 +97,9 @@ main(int argc, char** argv)
IedServerConfig_enableFileService(config, false); IedServerConfig_enableFileService(config, false);
/* disable dynamic data set service */ /* disable dynamic data set service */
IedServerConfig_enableDynamicDataSetService(config, true); IedServerConfig_enableDynamicDataSetService(config, false);
IedServerConfig_enableLogService(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);

@ -59,6 +59,9 @@ struct sIedServerConfig
/** when true (default) enable dynamic data set services for MMS */ /** when true (default) enable dynamic data set services for MMS */
bool enableDynamicDataSetService; bool enableDynamicDataSetService;
/** when true (default) enable log service */
bool enableLogService;
}; };
/** /**
@ -137,6 +140,22 @@ IedServerConfig_enableDynamicDataSetService(IedServerConfig self, bool enable);
bool bool
IedServerConfig_isDynamicDataSetServiceEnabled(IedServerConfig self); IedServerConfig_isDynamicDataSetServiceEnabled(IedServerConfig self);
/**
* \brief Enable/disable the log service for MMS
*
* \param[in] enable set true to enable dynamic data set service, otherwise false
*/
void
IedServerConfig_enableLogService(IedServerConfig self, bool enable);
/**
* \brief Is the log service for MMS enabled or disabled
*
* \return true if enabled, false otherwise
*/
bool
IedServerConfig_isLogServiceEnabled(IedServerConfig self);
/** /**
* An opaque handle for an IED server instance * An opaque handle for an IED server instance
*/ */

@ -51,6 +51,10 @@ struct sIedServer
Semaphore dataModelLock; Semaphore dataModelLock;
#endif #endif
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
bool logServiceEnabled;
#endif
bool running; bool running;
}; };

@ -404,9 +404,17 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio
self->running = false; self->running = false;
self->localIpAddress = NULL; self->localIpAddress = NULL;
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
self->logServiceEnabled = true;
if (serverConfiguration) {
self->logServiceEnabled = serverConfiguration->enableLogService;
}
#endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */
#if (CONFIG_MMS_THREADLESS_STACK != 1) #if (CONFIG_MMS_THREADLESS_STACK != 1)
self->dataModelLock = Semaphore_create(1); self->dataModelLock = Semaphore_create(1);
#endif #endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */
#if (CONFIG_IEC61850_REPORT_SERVICE == 1) #if (CONFIG_IEC61850_REPORT_SERVICE == 1)
if (serverConfiguration) if (serverConfiguration)
@ -425,6 +433,7 @@ IedServer_createWithConfig(IedModel* dataModel, TLSConfiguration tlsConfiguratio
if (serverConfiguration) { if (serverConfiguration) {
MmsServer_enableFileService(self->mmsServer, serverConfiguration->enableFileService); MmsServer_enableFileService(self->mmsServer, serverConfiguration->enableFileService);
MmsServer_enableDynamicNamedVariableListService(self->mmsServer, serverConfiguration->enableDynamicDataSetService); MmsServer_enableDynamicNamedVariableListService(self->mmsServer, serverConfiguration->enableDynamicDataSetService);
MmsServer_enableJournalService(self->mmsServer, serverConfiguration->enableLogService);
} }
#endif #endif

@ -34,6 +34,7 @@ IedServerConfig_create()
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; self->enableDynamicDataSetService = true;
self->enableLogService = true;
} }
return self; return self;
@ -99,3 +100,15 @@ IedServerConfig_isDynamicDataSetServiceEnabled(IedServerConfig self)
{ {
return self->enableDynamicDataSetService; return self->enableDynamicDataSetService;
} }
void
IedServerConfig_enableLogService(IedServerConfig self, bool enable)
{
self->enableLogService = enable;
}
bool
IedServerConfig_isLogServiceEnabled(IedServerConfig self)
{
return self->enableLogService;
}

@ -1010,12 +1010,22 @@ createNamedVariableFromLogicalNode(MmsMapping* self, MmsDomain* domain,
#endif /* (CONFIG_IEC61850_REPORT_SERVICE == 1) */ #endif /* (CONFIG_IEC61850_REPORT_SERVICE == 1) */
#if (CONFIG_IEC61850_LOG_SERVICE == 1) #if (CONFIG_IEC61850_LOG_SERVICE == 1)
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
if (self->iedServer->logServiceEnabled) {
#endif
if (lcbCount > 0) { if (lcbCount > 0) {
namedVariable->typeSpec.structure.elements[currentComponent] = namedVariable->typeSpec.structure.elements[currentComponent] =
Logging_createLCBs(self, domain, logicalNode, lcbCount); Logging_createLCBs(self, domain, logicalNode, lcbCount);
currentComponent++; currentComponent++;
} }
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
}
#endif
#endif /* (CONFIG_IEC61850_LOG_SERVICE == 1) */ #endif /* (CONFIG_IEC61850_LOG_SERVICE == 1) */
@ -1118,6 +1128,10 @@ createMmsDomainFromIedDevice(MmsMapping* self, LogicalDevice* logicalDevice)
goto exit_function; goto exit_function;
#if (CONFIG_IEC61850_LOG_SERVICE == 1) #if (CONFIG_IEC61850_LOG_SERVICE == 1)
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
if (self->iedServer->logServiceEnabled) {
#endif
/* add logs (journals) */ /* add logs (journals) */
Log* log = self->model->logs; Log* log = self->model->logs;
@ -1145,6 +1159,11 @@ createMmsDomainFromIedDevice(MmsMapping* self, LogicalDevice* logicalDevice)
log = log->sibling; log = log->sibling;
} }
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
}
#endif
#endif /* (CONFIG_IEC61850_LOG_SERVICE == 1) */ #endif /* (CONFIG_IEC61850_LOG_SERVICE == 1) */
int nodesCount = LogicalDevice_getLogicalNodeCount(logicalDevice); int nodesCount = LogicalDevice_getLogicalNodeCount(logicalDevice);

@ -247,6 +247,17 @@ MmsServer_enableFileService(MmsServer self, bool enable);
void void
MmsServer_enableDynamicNamedVariableListService(MmsServer self, bool enable); MmsServer_enableDynamicNamedVariableListService(MmsServer self, bool enable);
/**
* \brief Enable/disable journal 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 journal service, false to disable
*/
void
MmsServer_enableJournalService(MmsServer self, bool enable);
/** /**
* \brief lock the cached server data model * \brief lock the cached server data model
* *

@ -167,6 +167,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; bool dynamicVariableListServiceEnabled;
bool journalServiceEnabled;
#endif /* (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) */ #endif /* (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) */
}; };

@ -112,15 +112,10 @@ encodeInitResponseDetail(MmsServerConnection self, uint8_t* buffer, int bufPos,
0x00, 0x00,
0x00, 0x00,
0x00, 0x00,
0x00
,
0x00, 0x00,
0x00, 0x00,
0x00 0x00,
#if (MMS_JOURNAL_SERVICE == 1) 0x00,
| MMS_SERVICE_READ_JOURNAL
#endif
,
0x00 0x00
| MMS_SERVICE_INFORMATION_REPORT | MMS_SERVICE_INFORMATION_REPORT
, ,
@ -156,6 +151,12 @@ encodeInitResponseDetail(MmsServerConnection self, uint8_t* buffer, int bufPos,
} }
if (self->server->journalServiceEnabled) {
#if (MMS_JOURNAL_SERVICE == 1)
servicesSupported[8] |= MMS_SERVICE_READ_JOURNAL;
#endif
}
#else #else
uint8_t servicesSupported[] = uint8_t servicesSupported[] =

@ -615,11 +615,10 @@ mmsServer_handleGetNameListRequest(
#endif /* (MMS_DATA_SET_SERVICE == 1) */ #endif /* (MMS_DATA_SET_SERVICE == 1) */
else if (objectClass == OBJECT_CLASS_JOURNAL) { else if (objectClass == OBJECT_CLASS_JOURNAL) {
LinkedList nameList = LinkedList_create();
#if (CONFIG_MMS_SORT_NAME_LIST == 1) /* response with empty list */
StringUtils_sortList(nameList);
#endif LinkedList nameList = LinkedList_create();
createNameListResponse(connection, invokeId, nameList, response, continueAfter); createNameListResponse(connection, invokeId, nameList, response, continueAfter);

@ -70,6 +70,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; self->dynamicVariableListServiceEnabled = true;
self->journalServiceEnabled = true;
#endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */ #endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */
return self; return self;
@ -118,6 +119,12 @@ MmsServer_enableDynamicNamedVariableListService(MmsServer self, bool enable)
self->dynamicVariableListServiceEnabled = enable; self->dynamicVariableListServiceEnabled = enable;
} }
void
MmsServer_enableJournalService(MmsServer self, bool enable)
{
self->journalServiceEnabled = enable;
}
#endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */ #endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */
void void

@ -190,9 +190,21 @@ handleConfirmedRequestPdu(
#endif /* MMS_OBTAIN_FILE_SERVICE == 1 */ #endif /* MMS_OBTAIN_FILE_SERVICE == 1 */
#if (MMS_JOURNAL_SERVICE == 1) #if (MMS_JOURNAL_SERVICE == 1)
#if (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1)
case 0x41: /* read-journal */ case 0x41: /* read-journal */
if (self->server->journalServiceEnabled)
mmsServer_handleReadJournalRequest(self, buffer, bufPos, bufPos + length, invokeId, response); mmsServer_handleReadJournalRequest(self, buffer, bufPos, bufPos + length, invokeId, response);
else
mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response);
break; break;
#else
case 0x41: /* read-journal */
mmsServer_handleReadJournalRequest(self, buffer, bufPos, bufPos + length, invokeId, response);
break;
#endif /* (CONFIG_MMS_SERVER_CONFIG_SERVICES_AT_RUNTIME == 1) */
#endif /* (MMS_JOURNAL_SERVICE == 1) */ #endif /* (MMS_JOURNAL_SERVICE == 1) */
#if (MMS_FILE_SERVICE == 1) #if (MMS_FILE_SERVICE == 1)

@ -608,3 +608,5 @@ EXPORTS
IedServerConfig_isFileServiceEnabled IedServerConfig_isFileServiceEnabled
IedServerConfig_enableDynamicDataSetService IedServerConfig_enableDynamicDataSetService
IedServerConfig_isDynamicDataSetServiceEnabled IedServerConfig_isDynamicDataSetServiceEnabled
IedServerConfig_enableLogService
IedServerConfig_isLogServiceEnabled

@ -736,3 +736,5 @@ EXPORTS
IedServerConfig_isFileServiceEnabled IedServerConfig_isFileServiceEnabled
IedServerConfig_enableDynamicDataSetService IedServerConfig_enableDynamicDataSetService
IedServerConfig_isDynamicDataSetServiceEnabled IedServerConfig_isDynamicDataSetServiceEnabled
IedServerConfig_enableLogService
IedServerConfig_isLogServiceEnabled

Loading…
Cancel
Save