[VOL-5461] Duplicate MAC Bridge Port Numbers Cause Parameter Error in MBPCD ME Configuration in PonAniConfig

Signed-off-by: bseeniva <balaji.seenivasan@radisys.com>
Change-Id: I709a83ad9379721eef01c8a12b9067782aafba0e
diff --git a/VERSION b/VERSION
index 03aa22f..b221cd1 100755
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.12.25
+2.12.26
diff --git a/internal/pkg/avcfg/omci_ani_config.go b/internal/pkg/avcfg/omci_ani_config.go
index 4968d78..c58b18f 100755
--- a/internal/pkg/avcfg/omci_ani_config.go
+++ b/internal/pkg/avcfg/omci_ani_config.go
@@ -586,15 +586,26 @@
 		"TPPtr":     strconv.FormatInt(int64(oFsm.mapperSP0ID), 16),
 		"device-id": oFsm.deviceID, "uni-id": oFsm.pOnuUniPort.UniID})
 	bridgePtr := cmn.MacBridgeServiceProfileEID + uint16(oFsm.pOnuUniPort.MacBpNo) //cmp also omci_cc.go::sendCreateMBServiceProfile
+	// generate unique MacBpNo from tech profile ID for ANI side
+	macBpNo, macBpNoErr := cmn.GenerateANISideMBPCDPortNo(uint16(oFsm.techProfileID))
+	if macBpNoErr != nil {
+		logger.Warn(ctx, "Failed to generate MAC bridge port number, Will set the port-number to 0xFF", log.Fields{
+			"device-id": oFsm.deviceID,
+			"uni-id":    oFsm.pOnuUniPort.UniID,
+			"error":     macBpNoErr,
+		})
+		macBpNo = 0xFF
+	}
 	meParams := me.ParamData{
 		EntityID: oFsm.macBPCD0ID,
 		Attributes: me.AttributeValueMap{
 			me.MacBridgePortConfigurationData_BridgeIdPointer: bridgePtr,
-			me.MacBridgePortConfigurationData_PortNum:         0xFF, //fixed unique ANI side indication
-			me.MacBridgePortConfigurationData_TpType:          3,    //for .1PMapper
+			me.MacBridgePortConfigurationData_PortNum:         uint8(macBpNo), //fixed unique ANI side indication
+			me.MacBridgePortConfigurationData_TpType:          3,              //for .1PMapper
 			me.MacBridgePortConfigurationData_TpPointer:       oFsm.mapperSP0ID,
 		},
 	}
+
 	oFsm.mutexPLastTxMeInstance.Lock()
 	meInstance, err := oFsm.pOmciCC.SendCreateMBPConfigDataVar(log.WithSpanFromContext(context.TODO(), ctx), oFsm.pDeviceHandler.GetOmciTimeout(), true,
 		oFsm.PAdaptFsm.CommChan, meParams)
diff --git a/internal/pkg/avcfg/omci_vlan_config.go b/internal/pkg/avcfg/omci_vlan_config.go
index 30aa96a..bc927c1 100755
--- a/internal/pkg/avcfg/omci_vlan_config.go
+++ b/internal/pkg/avcfg/omci_vlan_config.go
@@ -2336,7 +2336,8 @@
 			if uint32(oFsm.actualUniFlowParam.VlanRuleParams.InnerCvlan) == uint32(of.OfpVlanId_OFPVID_NONE) {
 				// this defines VID translation scenario: singletagged->singletagged (if not transparent)
 				logger.Debugw(ctx, "UniVlanConfigFsm Tx Set::EVTOCD single tagged translation rule", log.Fields{
-					"match-pcp": matchPcp, "match-vid": matchVid, "set-pcp": setPcp, "set-vid:": setVid, "device-id": oFsm.deviceID})
+					"match-pcp": matchPcp, "match-vid": matchVid, "set-pcp": setPcp, "set-vid:": setVid, "device-id": oFsm.deviceID,
+					"tags-to-remove": oFsm.actualUniFlowParam.VlanRuleParams.TagsToRemove})
 				// fill vlan tagging operation table bit fields using network=bigEndian order and using slice offset 0 as highest 'word'
 				binary.BigEndian.PutUint32(sliceEvtocdRule[cFilterOuterOffset:],
 					cPrioIgnoreTag<<cFilterPrioOffset| // Not an outer-tag rule
diff --git a/internal/pkg/common/utils.go b/internal/pkg/common/utils.go
index f96a58a..8b0ee21 100755
--- a/internal/pkg/common/utils.go
+++ b/internal/pkg/common/utils.go
@@ -182,3 +182,11 @@
 		return false
 	}
 }
+
+// GenerateANISideMBPCDPortNo returns ANISideMacBridgePortConfigurationDataPortNo
+func GenerateANISideMBPCDPortNo(tpID uint16) (uint16, error) {
+	if tpID < tpIDStart || tpID >= tpIDEnd {
+		return 0, fmt.Errorf("tech profile id out of range - %d", tpID)
+	}
+	return tpID - tpIDStart, nil
+}