VOL-3847: Support FEC Performance Monitoring History Data L2 PM Counter
VOL-3848: Support GEM Port Network Ctp Performance Monitoring History Data L2 PM Counter

- also re-org code to group common functionality into utility functions

Change-Id: I087125ed4992415dac7b1a6cf84bfe9c1177b469
diff --git a/internal/pkg/onuadaptercore/onu_uni_tp.go b/internal/pkg/onuadaptercore/onu_uni_tp.go
index 6e91450..0ab368e 100644
--- a/internal/pkg/onuadaptercore/onu_uni_tp.go
+++ b/internal/pkg/onuadaptercore/onu_uni_tp.go
@@ -104,7 +104,7 @@
 	mapPonAniConfig          map[uniTP]*tcontGemList           //per UNI: use pointer values to ease assignments to the map
 	pAniConfigFsm            map[uniTP]*uniPonAniConfigFsm
 	procResult               map[uniTP]error //error indication of processing
-	mutexTPState             sync.Mutex
+	mutexTPState             sync.RWMutex
 	tpProfileExists          map[uniTP]bool
 	mapRemoveGemEntry        map[uniTP]*gemPortParamStruct //per UNI: pointer to GemEntry to be removed
 }
@@ -876,3 +876,17 @@
 	} //else: the state is just ignored (does not exist)
 	return gemPortIds
 }
+
+func (onuTP *onuUniTechProf) GetAllBidirectionalGemPortIDsForOnu() []uint16 {
+	var gemPortInstIDs []uint16
+	onuTP.mutexTPState.RLock()
+	defer onuTP.mutexTPState.RUnlock()
+	for _, tcontGemList := range onuTP.mapPonAniConfig {
+		for gemPortID, gemPortData := range tcontGemList.mapGemPortParams {
+			if gemPortData != nil && !gemPortData.isMulticast { // only if not multicast gem port
+				gemPortInstIDs = append(gemPortInstIDs, gemPortID)
+			}
+		}
+	}
+	return gemPortInstIDs
+}