From e06b4852585b976fdfa39772b421df72c7edb11e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 25 Jan 2022 00:40:14 +0100 Subject: [PATCH] - ensure RESERVED event before ENABLE event --- src/iec61850/server/mms_mapping/reporting.c | 37 +++++++++++++++------ 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 09d17d57..6f2b95cb 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -1804,6 +1804,14 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme if (updateReportDataset(self, rc, NULL, connection)) { + if (rc->reserved == false) { + reserveRcb(rc, connection); + + if (self->rcbEventHandler) { + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } + } + updateOwner(rc, connection); MmsValue* rptEna = ReportControl_getRCBValue(rc, "RptEna"); @@ -2201,27 +2209,36 @@ exit_function: rc->reservationTimeout = Hal_getTimeInMs() + (RESV_TMS_IMPLICIT_VALUE * 1000); if (rc->resvTms == 0) { - rc->resvTms = RESV_TMS_IMPLICIT_VALUE; - reserveRcb(rc, connection); + if (rc->reserved == false) { + rc->resvTms = RESV_TMS_IMPLICIT_VALUE; - if (self->rcbEventHandler) { - self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + reserveRcb(rc, connection); + + if (self->rcbEventHandler) { + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } } + + } else if (rc->resvTms == -1) { - reserveRcb(rc, connection); + if (rc->reserved == false) { + reserveRcb(rc, connection); - if (self->rcbEventHandler) { - self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + if (self->rcbEventHandler) { + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } } } } else { - reserveRcb(rc, connection); + if (rc->reserved == false) { + reserveRcb(rc, connection); - if (self->rcbEventHandler) { - self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + if (self->rcbEventHandler) { + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } } } }