VOL-3505 Send an ofp_error_msg on flow add/delete error

Change-Id: I3791d4ab7ae0f7730f52988234d0c99af2cea75f
diff --git a/rw_core/core/device/event/event.go b/rw_core/core/device/event/event.go
index 5817c64..f1a6ce8 100644
--- a/rw_core/core/device/event/event.go
+++ b/rw_core/core/device/event/event.go
@@ -19,6 +19,7 @@
 import (
 	"context"
 	"encoding/hex"
+	"fmt"
 	"sync"
 
 	"github.com/golang/protobuf/ptypes/empty"
@@ -139,6 +140,26 @@
 	}
 }
 
+func (q *Manager) SendFlowChangeEvent(ctx context.Context, deviceID string, res []error, xid uint32) {
+	logger.Debugw(ctx, "SendChangeEvent", log.Fields{"device-id": deviceID, "flowId": xid})
+	errorType := openflow_13.OfpErrorType_OFPET_FLOW_MOD_FAILED
+	q.changeEventQueue <- openflow_13.ChangeEvent{
+		Id: deviceID,
+		Event: &openflow_13.ChangeEvent_Error{
+			Error: &openflow_13.OfpErrorMsg{
+				Header: &openflow_13.OfpHeader{
+					Version: 0,
+					Type:    openflow_13.OfpType_OFPT_FLOW_MOD,
+					Xid:     xid,
+				},
+				Type: uint32(errorType),
+				Code: uint32(openflow_13.OfpFlowModFailedCode_OFPFMFC_UNKNOWN),
+				Data: []byte(fmt.Sprintf("%v", res[:])),
+			},
+		},
+	}
+}
+
 // ReceiveChangeEvents receives change in events
 func (q *Manager) ReceiveChangeEvents(_ *empty.Empty, changeEvents voltha.VolthaService_ReceiveChangeEventsServer) error {
 	ctx := context.Background()