diff --git a/VERSION b/VERSION
index 4d0dcda..de197cc 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-4.1.2
+4.1.3
diff --git a/internal/pkg/core/openolt_flowmgr.go b/internal/pkg/core/openolt_flowmgr.go
index 57833fa..3f09ba4 100644
--- a/internal/pkg/core/openolt_flowmgr.go
+++ b/internal/pkg/core/openolt_flowmgr.go
@@ -384,9 +384,7 @@
 	/* Flows can be added specific to gemport if p-bits are received.
 	 * If no pbit mentioned then adding flows for all gemports
 	 */
-	f.checkAndAddFlow(ctx, args, classifierInfo, actionInfo, flow, TpInst, gemPorts, TpID, uni)
-
-	return nil
+	return f.checkAndAddFlow(ctx, args, classifierInfo, actionInfo, flow, TpInst, gemPorts, TpID, uni)
 }
 
 // CreateSchedulerQueues creates traffic schedulers on the device with the given scheduler configuration and traffic shaping info
@@ -2834,7 +2832,7 @@
 // nolint: gocyclo
 func (f *OpenOltFlowMgr) checkAndAddFlow(ctx context.Context, args map[string]uint32, classifierInfo map[string]interface{},
 	actionInfo map[string]interface{}, flow *ofp.OfpFlowStats, TpInst interface{}, gemPorts []uint32,
-	tpID uint32, uni string) {
+	tpID uint32, uni string) error {
 	var gemPortID uint32
 	intfID := args[IntfID]
 	onuID := args[OnuID]
@@ -2856,7 +2854,7 @@
 		}
 	default:
 		logger.Errorw(ctx, "unsupported-tech", log.Fields{"tpInst": TpInst})
-		return
+		return olterrors.NewErrInvalidValue(log.Fields{"tpInst": TpInst}, nil)
 	}
 
 	if len(gemPorts) == 1 {
@@ -2900,6 +2898,7 @@
 			//Adding DHCP upstream flow
 			if err := f.addDHCPTrapFlow(ctx, flowContext); err != nil {
 				logger.Warn(ctx, err)
+				return err
 			}
 
 		} else if ipProto.(uint32) == IgmpProto {
@@ -2911,10 +2910,11 @@
 					"classifier-info:": classifierInfo})
 			if err := f.addIGMPTrapFlow(ctx, flowContext); err != nil {
 				logger.Warn(ctx, err)
+				return err
 			}
 		} else {
 			logger.Errorw(ctx, "invalid-classifier-to-handle", log.Fields{"classifier": classifierInfo, "action": actionInfo})
-			return
+			return olterrors.NewErrInvalidValue(log.Fields{"classifier": classifierInfo, "action": actionInfo}, nil)
 		}
 	} else if ethType, ok := classifierInfo[EthType]; ok {
 		if ethType.(uint32) == EapEthType {
@@ -2932,6 +2932,7 @@
 			}
 			if err := f.addEthTypeBasedFlow(ctx, flowContext, vlanID, ethType.(uint32)); err != nil {
 				logger.Warn(ctx, err)
+				return err
 			}
 		} else if ethType.(uint32) == PPPoEDEthType {
 			logger.Infow(ctx, "adding-pppoed-flow", log.Fields{
@@ -2944,6 +2945,7 @@
 			//Adding PPPOED upstream flow
 			if err := f.addUpstreamTrapFlow(ctx, flowContext); err != nil {
 				logger.Warn(ctx, err)
+				return err
 			}
 		}
 	} else if direction == tp_pb.Direction_UPSTREAM {
@@ -2955,6 +2957,7 @@
 		//Adding HSIA upstream flow
 		if err := f.addUpstreamDataPathFlow(ctx, flowContext); err != nil {
 			logger.Warn(ctx, err)
+			return err
 		}
 	} else if direction == tp_pb.Direction_DOWNSTREAM {
 		logger.Infow(ctx, "adding-downstream-data-rule", log.Fields{
@@ -2965,17 +2968,17 @@
 		//Adding HSIA downstream flow
 		if err := f.addDownstreamDataPathFlow(ctx, flowContext); err != nil {
 			logger.Warn(ctx, err)
+			return err
 		}
 	} else {
-		logger.Errorw(ctx, "invalid-flow-type-to-handle",
-			log.Fields{
-				"intf-id":    intfID,
-				"onu-id":     onuID,
-				"uni-id":     uniID,
-				"classifier": classifierInfo,
-				"action":     actionInfo,
-				"flow":       flow})
-		return
+		return olterrors.NewErrInvalidValue(log.Fields{
+			"intf-id":    intfID,
+			"onu-id":     onuID,
+			"uni-id":     uniID,
+			"classifier": classifierInfo,
+			"action":     actionInfo,
+			"flow":       flow},
+			nil).Log()
 	}
 	// Send Techprofile download event to child device in go routine as it takes time
 	go func() {
@@ -2983,6 +2986,7 @@
 			logger.Warn(ctx, err)
 		}
 	}()
+	return nil
 }
 
 func (f *OpenOltFlowMgr) isGemPortUsedByAnotherFlow(gemPortID uint32) bool {
diff --git a/internal/pkg/core/openolt_flowmgr_test.go b/internal/pkg/core/openolt_flowmgr_test.go
index 45cd79e..7154225 100644
--- a/internal/pkg/core/openolt_flowmgr_test.go
+++ b/internal/pkg/core/openolt_flowmgr_test.go
@@ -1212,8 +1212,12 @@
 	defer cancel()
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			flowMgr[tt.args.intfID].checkAndAddFlow(ctx, tt.args.args, tt.args.classifierInfo, tt.args.actionInfo, tt.args.flow,
+			err := flowMgr[tt.args.intfID].checkAndAddFlow(ctx, tt.args.args, tt.args.classifierInfo, tt.args.actionInfo, tt.args.flow,
 				tt.args.TpInst, tt.args.gemPorts, tt.args.TpID, tt.args.uni)
+			if err != nil {
+				t.Error("check-and-add-flow failed", err)
+				return
+			}
 		})
 	}
 }
