From 9bba6ce44abcc78d33eb373c27f0b2c4735ee9e4 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 19 Oct 2015 17:29:04 +0200 Subject: [PATCH] - fixed bug: EditSG can be modified by second client while reserved --- src/iec61850/server/mms_mapping/mms_mapping.c | 68 ++++++++++--------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index efaa0a18..5951e39a 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -548,10 +548,12 @@ getSettingGroupBySGCB(MmsMapping* self, SettingGroupControlBlock* sgcb) } static void -unselectSettingGroup(SettingGroup* settingGroup) +unselectEditSettingGroup(SettingGroup* settingGroup) { - printf("IED_SERVER: Unselect setting group\n"); - settingGroup->sgcb->editSG = 0; + if (DEBUG_IED_SERVER) + printf("IED_SERVER: Unselect setting group\n"); + + settingGroup->sgcb->editSG = 0; settingGroup->editingClient = NULL; MmsValue* editSg = MmsValue_getElement(settingGroup->sgcbMmsValues, 2); MmsValue_setUint8(editSg, 0U); @@ -568,7 +570,7 @@ unselectAllSettingGroups(MmsMapping* self, MmsServerConnection serverCon) SettingGroup* settingGroup = (SettingGroup*) LinkedList_getData(settingGroupElement); if (settingGroup->editingClient == (ClientConnection) serverCon) - unselectSettingGroup(settingGroup); + unselectEditSettingGroup(settingGroup); settingGroupElement = LinkedList_getNext(settingGroupElement); } @@ -584,7 +586,7 @@ MmsMapping_checkForSettingGroupReservationTimeouts(MmsMapping* self, uint64_t cu if (settingGroup->sgcb->editSG != 0) if (currentTime >= settingGroup->reservationTimeout) - unselectSettingGroup(settingGroup); + unselectEditSettingGroup(settingGroup); settingGroupElement = LinkedList_getNext(settingGroupElement); } @@ -1712,41 +1714,45 @@ mmsWriteHandler(void* parameter, MmsDomain* domain, if (sg != NULL) { uint32_t val = MmsValue_toUint32(value); - if ((val == 0) && (sg->editingClient == (ClientConnection) connection)) { - unselectSettingGroup(sg); - return DATA_ACCESS_ERROR_SUCCESS; - } + if (sg->editingClient == (ClientConnection) connection) { - if ((val > 0) && (val <= sg->sgcb->numOfSGs)) { + if (val == 0) { + unselectEditSettingGroup(sg); + return DATA_ACCESS_ERROR_SUCCESS; + } - if (sg->editSgChangedHandler != NULL) { + if ((val > 0) && (val <= sg->sgcb->numOfSGs)) { - if (sg->editSgChangedHandler(sg->editSgChangedHandlerParameter, sg->sgcb, - (uint8_t) val, (ClientConnection) connection)) - { - sg->sgcb->editSG = val; - sg->editingClient = (ClientConnection) connection; + if (sg->editSgChangedHandler != NULL) { - sg->reservationTimeout = Hal_getTimeInMs() + (sg->sgcb->resvTms * 1000); + if (sg->editSgChangedHandler(sg->editSgChangedHandlerParameter, sg->sgcb, + (uint8_t) val, (ClientConnection) connection)) + { + sg->sgcb->editSG = val; + sg->editingClient = (ClientConnection) connection; - MmsValue* editSg = MmsValue_getElement(sg->sgcbMmsValues, 2); - MmsValue* resvTms = MmsValue_getElement(sg->sgcbMmsValues, 5); + sg->reservationTimeout = Hal_getTimeInMs() + (sg->sgcb->resvTms * 1000); - MmsValue_setUint16(resvTms, sg->sgcb->resvTms); - MmsValue_setUint8(editSg, sg->sgcb->editSG); + MmsValue* editSg = MmsValue_getElement(sg->sgcbMmsValues, 2); + MmsValue* resvTms = MmsValue_getElement(sg->sgcbMmsValues, 5); - return DATA_ACCESS_ERROR_SUCCESS; - } - else - return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; - } - else - return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + MmsValue_setUint16(resvTms, sg->sgcb->resvTms); + MmsValue_setUint8(editSg, sg->sgcb->editSG); + return DATA_ACCESS_ERROR_SUCCESS; + } + else + return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + } + else + return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; + } + else + return DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID; } - else - return DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID; + else /* Edit SG was set by other client */ + return DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; } } else if (strcmp(nameId, "CnfEdit") == 0) { @@ -1762,7 +1768,7 @@ mmsWriteHandler(void* parameter, MmsDomain* domain, sg->editSgConfirmedHandler(sg->editSgConfirmedHandlerParameter, sg->sgcb, sg->sgcb->editSG); - unselectSettingGroup(sg); + unselectEditSettingGroup(sg); return DATA_ACCESS_ERROR_SUCCESS; }