VOL-1715 Free flow_id from resource manager pool if the flow failed ...
Change-Id: I6340576ca61f99818596829c1cb66f1ff574d8ee
diff --git a/adaptercore/openolt_flowmgr.go b/adaptercore/openolt_flowmgr.go
index 1d96d2c..cdda5d8 100644
--- a/adaptercore/openolt_flowmgr.go
+++ b/adaptercore/openolt_flowmgr.go
@@ -33,6 +33,8 @@
"github.com/opencord/voltha-protos/go/voltha"
"math/big"
//deepcopy "github.com/getlantern/deepcopy"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
)
const (
@@ -812,13 +814,31 @@
}
func (f *OpenOltFlowMgr) addFlowToDevice(logicalFlow *ofp.OfpFlowStats, deviceFlow *openoltpb2.Flow) bool {
+
+ var intfID uint32
+ /* For flows which trap out of the NNI, the AccessIntfId is invalid
+ (set to -1). In such cases, we need to refer to the NetworkIntfId .
+ */
+ if deviceFlow.AccessIntfId != -1 {
+ intfID = uint32(deviceFlow.AccessIntfId)
+ } else {
+ intfID = uint32(deviceFlow.NetworkIntfId)
+ }
+
log.Debugw("Sending flow to device via grpc", log.Fields{"flow": *deviceFlow})
_, err := f.deviceHandler.Client.FlowAdd(context.Background(), deviceFlow)
- if err != nil {
- log.Errorw("Failed to Add flow to device", log.Fields{"err": err, "deviceFlow": deviceFlow})
+
+ st, _ := status.FromError(err)
+ if st.Code() == codes.AlreadyExists {
+ log.Debug("Flow already exixts", log.Fields{"err": err, "deviceFlow": deviceFlow})
return false
}
- log.Debugw("Flow added to device successfully ", log.Fields{"flow": *deviceFlow})
+
+ if err != nil {
+ log.Errorw("Failed to Add flow to device", log.Fields{"err": err, "deviceFlow": deviceFlow})
+ f.resourceMgr.FreeFlowID(intfID, uint32(deviceFlow.OnuId), uint32(deviceFlow.UniId), deviceFlow.FlowId)
+ return false
+ }
log.Debugw("Flow added to device successfully ", log.Fields{"flow": *deviceFlow})
f.registerFlow(logicalFlow, deviceFlow)
return true