diff --git a/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs
index 55a87e3c..7aa303ba 100644
--- a/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs
+++ b/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs
@@ -1993,7 +1993,15 @@ namespace IEC61850
///
/// Purge buffer procedure executed
///
- PURGEBUF = 7
+ PURGEBUF = 7,
+ ///
+ /// Report buffer overflow
+ ///
+ OVERFLOW = 8,
+ ///
+ /// A new report was created and inserted into the buffer
+ ///
+ REPORT_CREATED = 9
}
public delegate void RCBEventHandler(object parameter, ReportControlBlock rcb, ClientConnection con, RCBEventType eventType, string parameterName, MmsDataAccessError serviceError);
diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h
index 5a3dd29d..48c79533 100644
--- a/src/iec61850/inc/iec61850_server.h
+++ b/src/iec61850/inc/iec61850_server.h
@@ -1547,7 +1547,9 @@ typedef enum {
RCB_EVENT_ENABLE, /* << RCB enabled */
RCB_EVENT_DISABLE, /* << RCB disabled */
RCB_EVENT_GI, /* << GI report triggered */
- RCB_EVENT_PURGEBUF /* << Purge buffer procedure executed */
+ RCB_EVENT_PURGEBUF, /* << Purge buffer procedure executed */
+ RCB_EVENT_OVERFLOW, /* << Report buffer overflow */
+ RCB_EVENT_REPORT_CREATED /* << a new report was created and inserted into the buffer */
} IedServer_RCBEventType;
/**
diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c
index 537a1fad..91f1c004 100644
--- a/src/iec61850/server/mms_mapping/reporting.c
+++ b/src/iec61850/server/mms_mapping/reporting.c
@@ -166,7 +166,6 @@ ReportControl_unlockNotify(ReportControl* self)
#endif
}
-
static void
purgeBuf(ReportControl* rc)
{
@@ -183,7 +182,6 @@ purgeBuf(ReportControl* rc)
reportBuffer->reportsCount = 0;
}
-
static void
deleteDataSetValuesShadowBuffer(ReportControl* self)
{
@@ -3072,6 +3070,18 @@ exit_function:
Semaphore_post(buffer->lock);
#endif
+ if (reportControl->server) {
+ MmsMapping* mmsMapping = reportControl->server->mmsMapping;
+
+ if (mmsMapping->rcbEventHandler) {
+ if (overflow) {
+ mmsMapping->rcbEventHandler(mmsMapping->rcbEventHandlerParameter, reportControl->rcb, NULL, RCB_EVENT_OVERFLOW, NULL, DATA_ACCESS_ERROR_SUCCESS);
+ }
+
+ mmsMapping->rcbEventHandler(mmsMapping->rcbEventHandlerParameter, reportControl->rcb, NULL, RCB_EVENT_REPORT_CREATED, NULL, DATA_ACCESS_ERROR_SUCCESS);
+ }
+ }
+
return;
} /* enqueuReport() */