From 041325ef69a54d39ddbf94a968d6d1f3e6efbe7a Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 2 Sep 2020 12:40:59 +0200 Subject: [PATCH] - IEC 61850 server: fixed problem with test case sRp4 - RCB RptID attribute is not empty after writing empty string --- src/iec61850/server/mms_mapping/reporting.c | 29 ++++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 8981ef23..eaf00019 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -1603,10 +1603,7 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme if (rc->buffered) purgeBuf(rc); - if (strlen(MmsValue_toString(value)) == 0) - updateWithDefaultRptId(rc, rptId); - else - MmsValue_update(rptId, value); + MmsValue_update(rptId, value); goto exit_function; } @@ -2283,7 +2280,25 @@ sendNextReportEntrySegment(ReportControl* self) MmsValue_setOctetString(entryIdValue, (uint8_t*) report->entryId, 8); } - MmsValue* rptId = ReportControl_getRCBValue(self, "RptID"); + char rptIdBuf[130]; + + MmsValue rptId; + rptId.type = MMS_VISIBLE_STRING; + rptId.value.visibleString.size = sizeof(rptIdBuf); + rptId.value.visibleString.buf = rptIdBuf; + + MmsValue* rptIdFromRcb = ReportControl_getRCBValue(self, "RptID"); + + const char* rptIdStr = MmsValue_toString(rptIdFromRcb); + + if (rptIdStr[0] == 0) { + /* use default rptId when RptID is empty in RCB */ + updateWithDefaultRptId(self, &rptId); + } + else { + MmsValue_setVisibleString(&rptId, rptIdStr); + } + MmsValue* optFlds = ReportControl_getRCBValue(self, "OptFlds"); if (isBuffered == false) { @@ -2292,7 +2307,7 @@ sendNextReportEntrySegment(ReportControl* self) MmsValue_setBitStringBit(optFlds, 7, false); /* entryID */ } - accessResultSize += MmsValue_encodeMmsData(rptId, NULL, 0, false); + accessResultSize += MmsValue_encodeMmsData(&rptId, NULL, 0, false); accessResultSize += 5; /* add size of OptFlds */ MmsValue _inclusionField; @@ -2569,7 +2584,7 @@ sendNextReportEntrySegment(ReportControl* self) /* encode access-results */ - bufPos = MmsValue_encodeMmsData(rptId, buffer, bufPos, true); + bufPos = MmsValue_encodeMmsData(&rptId, buffer, bufPos, true); bufPos = MmsValue_encodeMmsData(optFlds, buffer, bufPos, true); if (hasSeqNum)