- IED server: integrated GOOSE publisher - lock data model during GOOSE retransmission to avoid corrupted GOOSE data

pull/320/head
Michael Zillgith 5 years ago
parent 0451460c7e
commit a5f3e79ad1

@ -66,7 +66,7 @@ LIB61850_INTERNAL bool
MmsGooseControlBlock_isEnabled(MmsGooseControlBlock self);
LIB61850_INTERNAL void
MmsGooseControlBlock_checkAndPublish(MmsGooseControlBlock self, uint64_t currentTime);
MmsGooseControlBlock_checkAndPublish(MmsGooseControlBlock self, uint64_t currentTime, MmsMapping* mapping);
LIB61850_INTERNAL void
MmsGooseControlBlock_setStateChangePending(MmsGooseControlBlock self);

@ -335,10 +335,14 @@ MmsGooseControlBlock_disable(MmsGooseControlBlock self)
void
MmsGooseControlBlock_checkAndPublish(MmsGooseControlBlock self, uint64_t currentTime)
MmsGooseControlBlock_checkAndPublish(MmsGooseControlBlock self, uint64_t currentTime, MmsMapping* mapping)
{
if (currentTime >= self->nextPublishTime) {
IedServer_lockDataModel(mapping->iedServer);
if (currentTime >= self->nextPublishTime) {
#if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(self->publisherMutex);
#endif
@ -348,6 +352,8 @@ MmsGooseControlBlock_checkAndPublish(MmsGooseControlBlock self, uint64_t current
if (self->retransmissionsLeft > 0) {
self->nextPublishTime = currentTime + self->minTime;
if (self->retransmissionsLeft > 0) {
self->nextPublishTime = currentTime + self->minTime;
if (self->retransmissionsLeft > 1)
GoosePublisher_setTimeAllowedToLive(self->publisher, self->minTime * 3);
@ -366,10 +372,15 @@ MmsGooseControlBlock_checkAndPublish(MmsGooseControlBlock self, uint64_t current
Semaphore_post(self->publisherMutex);
#endif
}
IedServer_unlockDataModel(mapping->iedServer);
}
else if ((self->nextPublishTime - currentTime) > ((uint32_t) self->maxTime * 2)) {
self->nextPublishTime = currentTime + self->minTime;
}
}
}
void
MmsGooseControlBlock_setStateChangePending(MmsGooseControlBlock self)

@ -3015,7 +3015,7 @@ GOOSE_processGooseEvents(MmsMapping* self, uint64_t currentTimeInMs)
MmsGooseControlBlock mmsGCB = (MmsGooseControlBlock) element->data;
if (MmsGooseControlBlock_isEnabled(mmsGCB)) {
MmsGooseControlBlock_checkAndPublish(mmsGCB, currentTimeInMs);
MmsGooseControlBlock_checkAndPublish(mmsGCB, currentTimeInMs, self);
}
element = LinkedList_getNext(element);

Loading…
Cancel
Save