- MMS server: replaced MmsNamedVariableListChangedHandler by more generic MmsNamedVariableListAccessHandler (LIB61850-387)

- MMS server: implemented dataset access handler callback in dataset read access (LIB61850-387)
v1.6_develop_387
Michael Zillgith 3 years ago
parent e77bd15134
commit 39a55f672c

@ -1,7 +1,7 @@
/* /*
* mms_mapping.c * mms_mapping.c
* *
* Copyright 2013-2022 Michael Zillgith * Copyright 2013-2023 Michael Zillgith
* *
* This file is part of libIEC61850. * This file is part of libIEC61850.
* *
@ -3379,7 +3379,7 @@ mmsReadAccessHandler (void* parameter, MmsDomain* domain, char* variableId, MmsS
} }
static MmsError static MmsError
variableListChangedHandler (void* parameter, bool create, MmsVariableListType listType, MmsDomain* domain, variableListAccessHandler (void* parameter, MmsVariableListAccessType accessType, MmsVariableListType listType, MmsDomain* domain,
char* listName, MmsServerConnection connection) char* listName, MmsServerConnection connection)
{ {
MmsError allow = MMS_ERROR_NONE; MmsError allow = MMS_ERROR_NONE;
@ -3389,10 +3389,16 @@ variableListChangedHandler (void* parameter, bool create, MmsVariableListType li
/* TODO add log message */ /* TODO add log message */
#if (DEBUG_IED_SERVER == 1) #if (DEBUG_IED_SERVER == 1)
if (create) if (accessType == MMS_VARLIST_CREATE)
printf("IED_SERVER: create data set "); printf("IED_SERVER: create data set ");
else else if (accessType == MMS_VARLIST_DELETE)
printf("IED_SERVER: delete data set "); printf("IED_SERVER: delete data set ");
else if (accessType == MMS_VARLIST_READ)
printf("IED_SERVER: read data set ");
else if (accessType == MMS_VARLIST_WRITE)
printf("IED_SERVER: write data set ");
else if (accessType == MMS_VARLIST_READ)
printf("IED_SERVER: get directory of data set ");
switch (listType) { switch (listType) {
case MMS_VMD_SPECIFIC: case MMS_VMD_SPECIFIC:
@ -3411,7 +3417,10 @@ variableListChangedHandler (void* parameter, bool create, MmsVariableListType li
MmsMapping* self = (MmsMapping*) parameter; MmsMapping* self = (MmsMapping*) parameter;
if (create) { if (accessType == MMS_VARLIST_CREATE) {
//TODO call user callback hander (IedServer_DataSetAccessHandler)
if (listType == MMS_DOMAIN_SPECIFIC) { if (listType == MMS_DOMAIN_SPECIFIC) {
/* check if LN exists - otherwise reject request (to fulfill test case sDsN1c) */ /* check if LN exists - otherwise reject request (to fulfill test case sDsN1c) */
@ -3441,7 +3450,10 @@ variableListChangedHandler (void* parameter, bool create, MmsVariableListType li
} }
} }
else { else if (accessType == MMS_VARLIST_DELETE) {
//TODO call user callback hander (IedServer_DataSetAccessHandler)
/* Check if data set is referenced in a report */ /* Check if data set is referenced in a report */
LinkedList rcElement = self->reportControls; LinkedList rcElement = self->reportControls;
@ -3519,6 +3531,15 @@ variableListChangedHandler (void* parameter, bool create, MmsVariableListType li
#endif /* (CONFIG_IEC61850_LOG_SERVICE == 1) */ #endif /* (CONFIG_IEC61850_LOG_SERVICE == 1) */
} }
else if (accessType == MMS_VARLIST_READ) {
//TODO call user callback hander (IedServer_DataSetAccessHandler)
}
else if (accessType == MMS_VARLIST_WRITE) {
//TODO call user callback hander (IedServer_DataSetAccessHandler)
}
else if (accessType == MMS_VARLIST_GET_DIRECTORY) {
//TODO call user callback hander (IedServer_DataSetAccessHandler)
}
return allow; return allow;
} }
@ -3530,7 +3551,7 @@ MmsMapping_installHandlers(MmsMapping* self)
MmsServer_installWriteHandler(self->mmsServer, mmsWriteHandler, (void*) self); MmsServer_installWriteHandler(self->mmsServer, mmsWriteHandler, (void*) self);
MmsServer_installReadAccessHandler(self->mmsServer, mmsReadAccessHandler, (void*) self); MmsServer_installReadAccessHandler(self->mmsServer, mmsReadAccessHandler, (void*) self);
MmsServer_installConnectionHandler(self->mmsServer, mmsConnectionHandler, (void*) self); MmsServer_installConnectionHandler(self->mmsServer, mmsConnectionHandler, (void*) self);
MmsServer_installVariableListChangedHandler(self->mmsServer, variableListChangedHandler, (void*) self); MmsServer_installVariableListAccessHandler(self->mmsServer, variableListAccessHandler, (void*) self);
} }
void void

@ -81,29 +81,14 @@ typedef MmsError (*MmsNamedVariableListAccessHandler)(void* parameter, MmsVariab
char* listName, MmsServerConnection connection); char* listName, MmsServerConnection connection);
/** /**
* \brief callback handler that is called whenever a named variable list changes * \brief Install callback handler that is called when a named variable list is accessed by a client
*
* \param parameter a user provided parameter
* \param create if true the the request if a request to create a new variable list, false is a delete request
* \param listType the type (scope) of the named variable list (either domain, association or VMD specific)
* \param domain the MMS domain the list is belonging to (is NULL for association or VMD specific lists!)
* \param listName the name
* \param connection client connection that requests the creation of deletion of the variable list
*
* \return MMS_ERROR_NONE if the request is accepted, otherwise the MmsError value that has to be sent back to the client
*/
typedef MmsError (*MmsNamedVariableListChangedHandler)(void* parameter, bool create, MmsVariableListType listType, MmsDomain* domain,
char* listName, MmsServerConnection connection);
/**
* \brief Install callback handler that is called when a named variable list changes (is created or deleted)
* *
* \param self the MmsServer instance to operate on * \param self the MmsServer instance to operate on
* \param handler the callback handler function * \param handler the callback handler function
* \param parameter user provided parameter that is passed to the callback handler * \param parameter user provided parameter that is passed to the callback handler
*/ */
LIB61850_INTERNAL void LIB61850_INTERNAL void
MmsServer_installVariableListChangedHandler(MmsServer self, MmsNamedVariableListChangedHandler handler, void* parameter); MmsServer_installVariableListAccessHandler(MmsServer self, MmsNamedVariableListAccessHandler handler, void* parameter);
/** /**
* \brief ObtainFile service callback handler * \brief ObtainFile service callback handler

@ -123,8 +123,8 @@ struct sMmsServer {
MmsConnectionHandler connectionHandler; MmsConnectionHandler connectionHandler;
void* connectionHandlerParameter; void* connectionHandlerParameter;
MmsNamedVariableListChangedHandler variableListChangedHandler; MmsNamedVariableListAccessHandler variableListAccessHandler;
void* variableListChangedHandlerParameter; void* variableListAccessHandlerParameter;
AcseAuthenticator authenticator; AcseAuthenticator authenticator;
void* authenticatorParameter; void* authenticatorParameter;
@ -421,7 +421,7 @@ mmsServer_createMmsWriteResponse(MmsServerConnection connection,
uint32_t invokeId, ByteBuffer* response, int numberOfItems, MmsDataAccessError* accessResults); uint32_t invokeId, ByteBuffer* response, int numberOfItems, MmsDataAccessError* accessResults);
LIB61850_INTERNAL MmsError LIB61850_INTERNAL MmsError
mmsServer_callVariableListChangedHandler(bool create, MmsVariableListType listType, MmsDomain* domain, mmsServer_callVariableListChangedHandler(MmsVariableListAccessType accessType, MmsVariableListType listType, MmsDomain* domain,
char* listName, MmsServerConnection connection); char* listName, MmsServerConnection connection);
#endif /* MMS_SERVER_INTERNAL_H_ */ #endif /* MMS_SERVER_INTERNAL_H_ */

@ -1,7 +1,7 @@
/* /*
* mms_named_variable_list_service.c * mms_named_variable_list_service.c
* *
* Copyright 2013-2020 Michael Zillgith * Copyright 2013-2023 Michael Zillgith
* *
* This file is part of libIEC61850. * This file is part of libIEC61850.
* *
@ -49,17 +49,17 @@
#endif #endif
MmsError MmsError
mmsServer_callVariableListChangedHandler(bool create, MmsVariableListType listType, MmsDomain* domain, mmsServer_callVariableListChangedHandler(MmsVariableListAccessType accessType, MmsVariableListType listType, MmsDomain* domain,
char* listName, MmsServerConnection connection) char* listName, MmsServerConnection connection)
{ {
MmsServer self = connection->server; MmsServer self = connection->server;
if (self->variableListChangedHandler != NULL) { if (self->variableListAccessHandler != NULL) {
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: call MmsNamedVariableListChangedHandler for new list %s\n", listName); printf("MMS_SERVER: call MmsNamedVariableListAccessHandler for new list %s\n", listName);
return self->variableListChangedHandler(self->variableListChangedHandlerParameter, return self->variableListAccessHandler(self->variableListAccessHandlerParameter,
create, listType, domain, listName, connection); accessType, listType, domain, listName, connection);
} }
else else
return MMS_ERROR_NONE; return MMS_ERROR_NONE;
@ -180,7 +180,7 @@ mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection,
if (MmsNamedVariableList_isDeletable(variableList)) { if (MmsNamedVariableList_isDeletable(variableList)) {
MmsError deleteError = mmsServer_callVariableListChangedHandler(false, MMS_DOMAIN_SPECIFIC, domain, listName, connection); MmsError deleteError = mmsServer_callVariableListChangedHandler(MMS_VARLIST_DELETE, MMS_DOMAIN_SPECIFIC, domain, listName, connection);
if (deleteError == MMS_ERROR_NONE) { if (deleteError == MMS_ERROR_NONE) {
MmsDomain_deleteNamedVariableList(domain, listName); MmsDomain_deleteNamedVariableList(domain, listName);
@ -203,7 +203,7 @@ mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection,
if (variableList != NULL) { if (variableList != NULL) {
numberMatched++; numberMatched++;
MmsError deleteError = mmsServer_callVariableListChangedHandler(false, MMS_ASSOCIATION_SPECIFIC, NULL, listName, connection); MmsError deleteError = mmsServer_callVariableListChangedHandler(MMS_VARLIST_DELETE, MMS_ASSOCIATION_SPECIFIC, NULL, listName, connection);
if (deleteError == MMS_ERROR_NONE) { if (deleteError == MMS_ERROR_NONE) {
numberDeleted++; numberDeleted++;
@ -224,7 +224,7 @@ mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection,
if (variableList != NULL) { if (variableList != NULL) {
numberMatched++; numberMatched++;
MmsError deleteError = mmsServer_callVariableListChangedHandler(false, MMS_VMD_SPECIFIC, NULL, listName, connection); MmsError deleteError = mmsServer_callVariableListChangedHandler(MMS_VARLIST_DELETE, MMS_VMD_SPECIFIC, NULL, listName, connection);
if (deleteError == MMS_ERROR_NONE) { if (deleteError == MMS_ERROR_NONE) {
numberDeleted++; numberDeleted++;
@ -526,7 +526,7 @@ mmsServer_handleDefineNamedVariableListRequest(
if (namedVariableList != NULL) { if (namedVariableList != NULL) {
mmsError = mmsServer_callVariableListChangedHandler(true, MMS_DOMAIN_SPECIFIC, domain, variableListName, connection); mmsError = mmsServer_callVariableListChangedHandler(MMS_VARLIST_CREATE, MMS_DOMAIN_SPECIFIC, domain, variableListName, connection);
if (mmsError == MMS_ERROR_NONE) { if (mmsError == MMS_ERROR_NONE) {
MmsDomain_addNamedVariableList(domain, namedVariableList); MmsDomain_addNamedVariableList(domain, namedVariableList);
@ -576,7 +576,7 @@ mmsServer_handleDefineNamedVariableListRequest(
if (namedVariableList != NULL) { if (namedVariableList != NULL) {
if (mmsServer_callVariableListChangedHandler(true, MMS_ASSOCIATION_SPECIFIC, NULL, variableListName, connection) == MMS_ERROR_NONE) { if (mmsServer_callVariableListChangedHandler(MMS_VARLIST_CREATE, MMS_ASSOCIATION_SPECIFIC, NULL, variableListName, connection) == MMS_ERROR_NONE) {
MmsServerConnection_addNamedVariableList(connection, namedVariableList); MmsServerConnection_addNamedVariableList(connection, namedVariableList);
createDefineNamedVariableListResponse(invokeId, response); createDefineNamedVariableListResponse(invokeId, response);
} }
@ -619,7 +619,7 @@ mmsServer_handleDefineNamedVariableListRequest(
request, variableListName, &mmsError); request, variableListName, &mmsError);
if (namedVariableList != NULL) { if (namedVariableList != NULL) {
if (mmsServer_callVariableListChangedHandler(true, MMS_VMD_SPECIFIC, NULL, variableListName, connection) if (mmsServer_callVariableListChangedHandler(MMS_VARLIST_CREATE, MMS_VMD_SPECIFIC, NULL, variableListName, connection)
== MMS_ERROR_NONE) { == MMS_ERROR_NONE) {
LinkedList_add(vmdScopeNVLs, (void*) namedVariableList); LinkedList_add(vmdScopeNVLs, (void*) namedVariableList);

@ -768,10 +768,22 @@ handleReadNamedVariableListRequest(
else { else {
MmsNamedVariableList namedList = MmsDomain_getNamedVariableList(domain, nameIdStr); MmsNamedVariableList namedList = MmsDomain_getNamedVariableList(domain, nameIdStr);
if (namedList != NULL) { if (namedList)
{
MmsError accessError = mmsServer_callVariableListChangedHandler(MMS_VARLIST_READ, MMS_DOMAIN_SPECIFIC, domain, namedList->name, connection);
if (accessError == MMS_ERROR_NONE) {
createNamedVariableListResponse(connection, namedList, invokeId, response, isSpecWithResult(read), createNamedVariableListResponse(connection, namedList, invokeId, response, isSpecWithResult(read),
&accessSpec); &accessSpec);
} }
else {
if (DEBUG_MMS_SERVER) printf("MMS read: named variable list %s access error: %i\n", nameIdStr, accessError);
mmsMsg_createServiceErrorPdu(invokeId, response, accessError);
}
}
else { else {
if (DEBUG_MMS_SERVER) printf("MMS read: named variable list %s not found!\n", nameIdStr); if (DEBUG_MMS_SERVER) printf("MMS read: named variable list %s not found!\n", nameIdStr);
mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
@ -791,6 +803,9 @@ handleReadNamedVariableListRequest(
mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
else { else {
MmsError accessError = mmsServer_callVariableListChangedHandler(MMS_VARLIST_READ, MMS_VMD_SPECIFIC, NULL, namedList->name, connection);
if (accessError == MMS_ERROR_NONE) {
VarAccessSpec accessSpec; VarAccessSpec accessSpec;
accessSpec.isNamedVariableList = true; accessSpec.isNamedVariableList = true;
@ -800,6 +815,13 @@ handleReadNamedVariableListRequest(
createNamedVariableListResponse(connection, namedList, invokeId, response, isSpecWithResult(read), &accessSpec); createNamedVariableListResponse(connection, namedList, invokeId, response, isSpecWithResult(read), &accessSpec);
} }
else {
if (DEBUG_MMS_SERVER) printf("MMS read: VMD specific named variable list %s access error: %i\n", listName, accessError);
mmsMsg_createServiceErrorPdu(invokeId, response, accessError);
}
}
} }
#if (MMS_DYNAMIC_DATA_SETS == 1) #if (MMS_DYNAMIC_DATA_SETS == 1)
else if (read->variableAccessSpecification.choice.variableListName.present == else if (read->variableAccessSpecification.choice.variableListName.present ==
@ -815,6 +837,11 @@ handleReadNamedVariableListRequest(
if (namedList == NULL) if (namedList == NULL)
mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
else { else {
MmsError accessError = mmsServer_callVariableListChangedHandler(MMS_VARLIST_READ, MMS_ASSOCIATION_SPECIFIC, NULL, namedList->name, connection);
if (accessError == MMS_ERROR_NONE) {
VarAccessSpec accessSpec; VarAccessSpec accessSpec;
accessSpec.isNamedVariableList = true; accessSpec.isNamedVariableList = true;
@ -824,6 +851,12 @@ handleReadNamedVariableListRequest(
createNamedVariableListResponse(connection, namedList, invokeId, response, isSpecWithResult(read), &accessSpec); createNamedVariableListResponse(connection, namedList, invokeId, response, isSpecWithResult(read), &accessSpec);
} }
else {
if (DEBUG_MMS_SERVER) printf("MMS read: association specific named variable list %s access error: %i\n", listName, accessError);
mmsMsg_createServiceErrorPdu(invokeId, response, accessError);
}
}
} }
#endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ #endif /* (MMS_DYNAMIC_DATA_SETS == 1) */
else else

@ -359,10 +359,10 @@ MmsServer_installConnectionHandler(MmsServer self, MmsConnectionHandler connecti
} }
void void
MmsServer_installVariableListChangedHandler(MmsServer self, MmsNamedVariableListChangedHandler handler, void* parameter) MmsServer_installVariableListAccessHandler(MmsServer self, MmsNamedVariableListAccessHandler handler, void* parameter)
{ {
self->variableListChangedHandler = handler; self->variableListAccessHandler = handler;
self->variableListChangedHandlerParameter = parameter; self->variableListAccessHandlerParameter = parameter;
} }
void void

Loading…
Cancel
Save