[VOL-3776] Wrong openflow error message caused disconnection from controller, thus miss removal of data for subscribers

Change-Id: I108177947f0972b4e56a63d39cb1ac1231c6e317
diff --git a/rw_core/core/device/event/event.go b/rw_core/core/device/event/event.go
index f1a6ce8..21d535f 100644
--- a/rw_core/core/device/event/event.go
+++ b/rw_core/core/device/event/event.go
@@ -18,8 +18,8 @@
 
 import (
 	"context"
+	"encoding/binary"
 	"encoding/hex"
-	"fmt"
 	"sync"
 
 	"github.com/golang/protobuf/ptypes/empty"
@@ -140,21 +140,37 @@
 	}
 }
 
-func (q *Manager) SendFlowChangeEvent(ctx context.Context, deviceID string, res []error, xid uint32) {
-	logger.Debugw(ctx, "SendChangeEvent", log.Fields{"device-id": deviceID, "flowId": xid})
+func (q *Manager) SendFlowChangeEvent(ctx context.Context, deviceID string, res []error, xid uint32, flowCookie uint64) {
+	logger.Debugw(ctx, "SendChangeEvent", log.Fields{"device-id": deviceID,
+		"flowId": xid, "flowCookie": flowCookie, "errors": res})
 	errorType := openflow_13.OfpErrorType_OFPET_FLOW_MOD_FAILED
+	//Manually creating the data payload for the flow error message
+	bs := make([]byte, 2)
+	//OF 1.3
+	bs[0] = byte(4)
+	//Flow Mod
+	bs[1] = byte(14)
+	//Length of the message
+	length := make([]byte, 2)
+	binary.BigEndian.PutUint16(length, 56)
+	bs = append(bs, length...)
+	emptyArr := []byte{0, 0, 0, 0}
+	bs = append(bs, emptyArr...)
+	//Cookie of the Flow
+	cookie := make([]byte, 52)
+	binary.BigEndian.PutUint64(cookie, flowCookie)
+	bs = append(bs, cookie...)
 	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: openflow_13.OfpType_OFPT_FLOW_MOD,
+					Xid:  xid,
 				},
 				Type: uint32(errorType),
 				Code: uint32(openflow_13.OfpFlowModFailedCode_OFPFMFC_UNKNOWN),
-				Data: []byte(fmt.Sprintf("%v", res[:])),
+				Data: bs,
 			},
 		},
 	}