From ec5ccb62a03dfb552d0076781415bf14898687b4 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 20 Oct 2020 15:17:56 +0200 Subject: [PATCH] - IED server: RCB and LCB service tracking replaced $ with . characters in object references --- src/iec61850/inc/iec61850_model.h | 2 +- src/iec61850/inc_private/logging.h | 2 + src/iec61850/server/mms_mapping/logging.c | 28 ++++++++- src/iec61850/server/mms_mapping/mms_mapping.c | 4 +- src/iec61850/server/mms_mapping/reporting.c | 62 ++++++++++++++++--- 5 files changed, 85 insertions(+), 13 deletions(-) diff --git a/src/iec61850/inc/iec61850_model.h b/src/iec61850/inc/iec61850_model.h index a57dc228..dc5fa918 100644 --- a/src/iec61850/inc/iec61850_model.h +++ b/src/iec61850/inc/iec61850_model.h @@ -278,7 +278,7 @@ struct sLogControlBlock { char* name; char* dataSetName; - char* logRef; /* object reference to the journal. Defaults to /$GeneralLog */ + char* logRef; /* object reference to the journal */ uint8_t trgOps; /* TrgOps - trigger conditions */ uint32_t intPeriod; /* IntgPd - integrity period */ diff --git a/src/iec61850/inc_private/logging.h b/src/iec61850/inc_private/logging.h index f94d90df..9ec8f936 100644 --- a/src/iec61850/inc_private/logging.h +++ b/src/iec61850/inc_private/logging.h @@ -46,6 +46,8 @@ typedef struct { LogControlBlock* logControlBlock; MmsMapping* mmsMapping; + char* logRef; + DataSet* dataSet; char* dataSetRef; bool isDynamicDataSet; diff --git a/src/iec61850/server/mms_mapping/logging.c b/src/iec61850/server/mms_mapping/logging.c index 45a11ed1..eddb3864 100644 --- a/src/iec61850/server/mms_mapping/logging.c +++ b/src/iec61850/server/mms_mapping/logging.c @@ -181,6 +181,7 @@ LogControl_create(LogicalNode* parentLN, MmsMapping* mmsMapping) self->logInstance = NULL; self->intgPd = 0; self->nextIntegrityScan = 0; + self->logRef = NULL; return self; } @@ -196,6 +197,9 @@ LogControl_destroy(LogControl* self) if (self->dataSetRef != NULL) GLOBAL_FREEMEM(self->dataSetRef); + if (self->logRef) + GLOBAL_FREEMEM(self->logRef); + GLOBAL_FREEMEM(self); } } @@ -412,10 +416,22 @@ copyLCBValuesToTrackingObject(MmsMapping* self, LogControl* logControl) MmsValue_setBoolean(trkInst->logEna->mmsValue, logControl->enabled); if (trkInst->logRef) - MmsValue_setVisibleString(trkInst->logRef->mmsValue, logControl->logControlBlock->logRef); + MmsValue_setVisibleString(trkInst->logRef->mmsValue, logControl->logRef); if (trkInst->datSet) { - MmsValue_setVisibleString(trkInst->datSet->mmsValue, logControl->dataSetRef); + char datSet[130]; + + if (logControl->dataSetRef) { + strncpy(datSet, logControl->dataSetRef, 129); + datSet[129] = 0; + + StringUtils_replace(datSet, '$', '.'); + } + else { + datSet[0] = 0; + } + + MmsValue_setVisibleString(trkInst->datSet->mmsValue, datSet); } if (trkInst->intgPd) @@ -776,6 +792,10 @@ createLogControlBlock(MmsMapping* self, LogControlBlock* logControlBlock, strncat(logRef, logControlBlock->logRef, maxLogRefLength); mmsValue->value.structure.components[1] = MmsValue_newVisibleString(logRef); + + StringUtils_replace(logRef, '$', '.'); + + logControl->logRef = StringUtils_copyString(logRef); } else { char* logRef = StringUtils_createString(4, logControl->domain->domainName, "/", logControlBlock->parent->name, @@ -783,7 +803,9 @@ createLogControlBlock(MmsMapping* self, LogControlBlock* logControlBlock, mmsValue->value.structure.components[1] = MmsValue_newVisibleString(logRef); - GLOBAL_FREEMEM(logRef); + StringUtils_replace(logRef, '$', '.'); + + logControl->logRef = logRef; } /* DatSet */ diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 2d533be6..985bcc41 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -630,13 +630,15 @@ private_IedServer_convertMmsDataAccessErrorToServiceError(MmsDataAccessError mms errVal = IEC61850_SERVICE_ERROR_PARAMETER_VALUE_INAPPROPRIATE; break; case DATA_ACCESS_ERROR_TYPE_INCONSISTENT: + case DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT: errVal = IEC61850_SERVICE_ERROR_PARAMETER_VALUE_INCONSISTENT; break; case DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT: errVal = IEC61850_SERVICE_ERROR_INSTANCE_NOT_AVAILABLE; break; default: - printf("Data access error %i not mapped!\n", mmsError); + if (DEBUG_IED_SERVER) + printf("IED_SERVER: Data access error %i not mapped!\n", mmsError); errVal = IEC61850_SERVICE_ERROR_FAILED_DUE_TO_SERVER_CONSTRAINT; break; } diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 3feed31f..352d4080 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -324,8 +324,19 @@ copyRCBValuesToTrackingObject(MmsMapping* self, ReportControl* rc) if (trkInst->rptEna) MmsValue_update(trkInst->rptEna->mmsValue, ReportControl_getRCBValue(rc, "RptEna")); - if (trkInst->datSet) - MmsValue_update(trkInst->datSet->mmsValue, ReportControl_getRCBValue(rc, "DatSet")); + if (trkInst->datSet) { + char datSet[130]; + const char* datSetStr = MmsValue_toString(ReportControl_getRCBValue(rc, "DatSet")); + + if (datSetStr) { + strncpy(datSet, datSetStr, 129); + datSet[129] = 0; + + StringUtils_replace(datSet, '$', '.'); + + MmsValue_setVisibleString(trkInst->datSet->mmsValue, datSet); + } + } if (trkInst->confRev) MmsValue_update(trkInst->confRev->mmsValue, ReportControl_getRCBValue(rc, "ConfRev")); @@ -383,8 +394,19 @@ copyRCBValuesToTrackingObject(MmsMapping* self, ReportControl* rc) if (trkInst->resv) MmsValue_update(trkInst->rptEna->mmsValue, ReportControl_getRCBValue(rc, "Resv")); - if (trkInst->datSet) - MmsValue_update(trkInst->datSet->mmsValue, ReportControl_getRCBValue(rc, "DatSet")); + if (trkInst->datSet) { + char datSet[130]; + const char* datSetStr = MmsValue_toString(ReportControl_getRCBValue(rc, "DatSet")); + + if (datSetStr) { + strncpy(datSet, datSetStr, 129); + datSet[129] = 0; + + StringUtils_replace(datSet, '$', '.'); + + MmsValue_setVisibleString(trkInst->datSet->mmsValue, datSet); + } + } if (trkInst->confRev) MmsValue_update(trkInst->confRev->mmsValue, ReportControl_getRCBValue(rc, "ConfRev")); @@ -423,8 +445,20 @@ updateSingleTrackingValue(MmsMapping* self, ReportControl* rc, char* name, MmsVa attributeToUpdate = trkInst->rptID; else if (!strcmp(name, "RptEna")) attributeToUpdate = trkInst->rptEna; - else if (!strcmp(name, "DatSet")) - attributeToUpdate = trkInst->datSet; + else if (!strcmp(name, "DatSet")) { + + char datSet[130]; + const char* datSetStr = MmsValue_toString(newValue); + + if (datSetStr) { + strncpy(datSet, datSetStr, 129); + datSet[129] = 0; + + StringUtils_replace(datSet, '$', '.'); + + MmsValue_setVisibleString(trkInst->datSet->mmsValue, datSet); + } + } else if (!strcmp(name, "ConfRev")) attributeToUpdate = trkInst->confRev; else if (!strcmp(name, "OptFlds")) @@ -464,8 +498,20 @@ updateSingleTrackingValue(MmsMapping* self, ReportControl* rc, char* name, MmsVa attributeToUpdate = trkInst->rptEna; else if (!strcmp(name, "Resv")) attributeToUpdate = trkInst->resv; - else if (!strcmp(name, "DatSet")) - attributeToUpdate = trkInst->datSet; + else if (!strcmp(name, "DatSet")) { + + char datSet[130]; + const char* datSetStr = MmsValue_toString(newValue); + + if (datSetStr) { + strncpy(datSet, datSetStr, 129); + datSet[129] = 0; + + StringUtils_replace(datSet, '$', '.'); + + MmsValue_setVisibleString(trkInst->datSet->mmsValue, datSet); + } + } else if (!strcmp(name, "ConfRev")) attributeToUpdate = trkInst->confRev; else if (!strcmp(name, "OptFlds"))