From d3abbc0bc1108768e1d49a85c9457e3a7f34e09e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 24 Sep 2020 12:41:01 +0200 Subject: [PATCH] - IED server: fixed issue - read access to SGCB is not possible when read access handler is installed --- .../server_example_setting_groups/server_example_sg.c | 11 +++++++++++ src/iec61850/server/mms_mapping/mms_mapping.c | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/examples/server_example_setting_groups/server_example_sg.c b/examples/server_example_setting_groups/server_example_sg.c index eb588f87..6e16cd43 100644 --- a/examples/server_example_setting_groups/server_example_sg.c +++ b/examples/server_example_setting_groups/server_example_sg.c @@ -95,6 +95,15 @@ editSgConfirmedHandler(void* parameter, SettingGroupControlBlock* sgcb, } } +static MmsDataAccessError +readAccessHandler(LogicalDevice* ld, LogicalNode* ln, DataObject* dataObject, FunctionalConstraint fc, ClientConnection connection, void* parameter) +{ + void* securityToken = ClientConnection_getSecurityToken(connection); + + printf("Read access to %s/%s.%s\n", ld->name, ln->name, dataObject->name); + + return DATA_ACCESS_ERROR_SUCCESS; +} int main(int argc, char** argv) @@ -111,6 +120,8 @@ main(int argc, char** argv) IedServer_setEditSettingGroupChangedHandler(iedServer, sgcb, editSgChangedHandler, NULL); IedServer_setEditSettingGroupConfirmationHandler(iedServer, sgcb, editSgConfirmedHandler, NULL); + IedServer_setReadAccessHandler(iedServer, readAccessHandler, NULL); + /* MMS server will be instructed to start listening to client connections. */ IedServer_start(iedServer, 102); diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 49f31d4a..5f0957c6 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -2509,6 +2509,11 @@ mmsReadAccessHandler (void* parameter, MmsDomain* domain, char* variableId, MmsS StringUtils_createStringFromBufferInBuffer(str, (uint8_t*) (doStart + 1), doEnd - doStart); } + if (fc == IEC61850_FC_SP) { + if (!strcmp(str, "SGCB")) + return DATA_ACCESS_ERROR_SUCCESS; + } + ModelNode* dobj = ModelNode_getChild((ModelNode*) ln, str); if (dobj != NULL) {