From eacdfa953dd94197d318157089beceeb48933a1a Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 18 Jul 2018 21:48:04 +0200 Subject: [PATCH] - IED SERVER: fixed bug when calling write access handler (wrong pointer for ClientConnection object) --- demos/beaglebone/beagle_demo.icd | 2 +- .../server_example_password_auth.c | 17 +++++++++++ .../simpleIO_direct_control.icd | 4 +++ .../static_model.c | 28 +++++++++++++++++-- .../static_model.h | 4 +++ src/iec61850/server/mms_mapping/mms_mapping.c | 6 +++- 6 files changed, 56 insertions(+), 5 deletions(-) diff --git a/demos/beaglebone/beagle_demo.icd b/demos/beaglebone/beagle_demo.icd index b76febab..57cdbb99 100644 --- a/demos/beaglebone/beagle_demo.icd +++ b/demos/beaglebone/beagle_demo.icd @@ -270,7 +270,7 @@ - + diff --git a/examples/server_example_password_auth/server_example_password_auth.c b/examples/server_example_password_auth/server_example_password_auth.c index 40f3d804..b66b469e 100644 --- a/examples/server_example_password_auth/server_example_password_auth.c +++ b/examples/server_example_password_auth/server_example_password_auth.c @@ -126,6 +126,20 @@ controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) MmsValue_delete(timeStamp); } + +static MmsDataAccessError +writeAccessHandler (DataAttribute* dataAttribute, MmsValue* value, ClientConnection connection, void* parameter) +{ + void* securityToken = ClientConnection_getSecurityToken(connection); + + if (securityToken != password2) + return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + + return DATA_ACCESS_ERROR_SUCCESS; +} + + + int main(int argc, char** argv) { iedServer = IedServer_create(&iedModel); @@ -153,6 +167,9 @@ int main(int argc, char** argv) { IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4, (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO4); + /* Set write access handler */ + IedServer_handleWriteAccess(iedServer, IEDMODEL_GenericIO_LLN0_ModAuto_setVal, writeAccessHandler, NULL); + /* MMS server will be instructed to start listening to client connections. */ IedServer_start(iedServer, 102); diff --git a/examples/server_example_password_auth/simpleIO_direct_control.icd b/examples/server_example_password_auth/simpleIO_direct_control.icd index 3081dffe..7cb91a23 100644 --- a/examples/server_example_password_auth/simpleIO_direct_control.icd +++ b/examples/server_example_password_auth/simpleIO_direct_control.icd @@ -94,6 +94,7 @@ + @@ -186,6 +187,9 @@ + + + diff --git a/examples/server_example_password_auth/static_model.c b/examples/server_example_password_auth/static_model.c index 1db7d778..4cc943c7 100644 --- a/examples/server_example_password_auth/static_model.c +++ b/examples/server_example_password_auth/static_model.c @@ -3,7 +3,7 @@ * * automatically generated from simpleIO_direct_control.icd */ -#include "../server_example_password_auth/static_model.h" +#include "static_model.h" static void initializeValues(); @@ -227,7 +227,7 @@ DataObject iedModel_GenericIO_LLN0_NamPlt = { DataObjectModelType, "NamPlt", (ModelNode*) &iedModel_GenericIO_LLN0, - NULL, + (ModelNode*) &iedModel_GenericIO_LLN0_ModAuto, (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_vendor, 0 }; @@ -297,6 +297,28 @@ DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { NULL, 0}; +DataObject iedModel_GenericIO_LLN0_ModAuto = { + DataObjectModelType, + "ModAuto", + (ModelNode*) &iedModel_GenericIO_LLN0, + NULL, + (ModelNode*) &iedModel_GenericIO_LLN0_ModAuto_setVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_ModAuto_setVal = { + DataAttributeModelType, + "setVal", + (ModelNode*) &iedModel_GenericIO_LLN0_ModAuto, + NULL, + NULL, + 0, + IEC61850_FC_SP, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + LogicalNode iedModel_GenericIO_LPHD1 = { LogicalNodeModelType, "LPHD1", @@ -1773,7 +1795,7 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { extern ReportControlBlock iedModel_GenericIO_LLN0_report0; -ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 24, 111, 50, 1000, NULL}; +ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 24, 239, 50, 1000, NULL}; diff --git a/examples/server_example_password_auth/static_model.h b/examples/server_example_password_auth/static_model.h index 58dd28b5..372674e7 100644 --- a/examples/server_example_password_auth/static_model.h +++ b/examples/server_example_password_auth/static_model.h @@ -31,6 +31,8 @@ extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev; extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_d; extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev; extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs; +extern DataObject iedModel_GenericIO_LLN0_ModAuto; +extern DataAttribute iedModel_GenericIO_LLN0_ModAuto_setVal; extern LogicalNode iedModel_GenericIO_LPHD1; extern DataObject iedModel_GenericIO_LPHD1_PhyNam; extern DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor; @@ -174,6 +176,8 @@ extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; #define IEDMODEL_GenericIO_LLN0_NamPlt_d (&iedModel_GenericIO_LLN0_NamPlt_d) #define IEDMODEL_GenericIO_LLN0_NamPlt_configRev (&iedModel_GenericIO_LLN0_NamPlt_configRev) #define IEDMODEL_GenericIO_LLN0_NamPlt_ldNs (&iedModel_GenericIO_LLN0_NamPlt_ldNs) +#define IEDMODEL_GenericIO_LLN0_ModAuto (&iedModel_GenericIO_LLN0_ModAuto) +#define IEDMODEL_GenericIO_LLN0_ModAuto_setVal (&iedModel_GenericIO_LLN0_ModAuto_setVal) #define IEDMODEL_GenericIO_LPHD1 (&iedModel_GenericIO_LPHD1) #define IEDMODEL_GenericIO_LPHD1_PhyNam (&iedModel_GenericIO_LPHD1_PhyNam) #define IEDMODEL_GenericIO_LPHD1_PhyNam_vendor (&iedModel_GenericIO_LPHD1_PhyNam_vendor) diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index edb53e4f..04163c71 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -2062,8 +2062,12 @@ mmsWriteHandler(void* parameter, MmsDomain* domain, MmsValue* matchingValue = checkIfValueBelongsToModelNode(dataAttribute, cachedValue, value); if (matchingValue != NULL) { + + ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, + connection); + MmsDataAccessError handlerResult = - accessHandler->handler(dataAttribute, matchingValue, (ClientConnection) connection, + accessHandler->handler(dataAttribute, matchingValue, clientConnection, accessHandler->parameter); if (handlerResult == DATA_ACCESS_ERROR_SUCCESS)