BSSGP_Emulation: Support multiple PTP-BVC within one Entity

The existing BSSGP_Emulation is built around the assumption that every
instance of BSSGP_Emulation only servers one signaling-BVC and one
PTP-BVC.  While this is true for osmo-pcu at this point (BTS-colocated
PCU), other BSS/PCU implementations differ.

In general, there can always be any number of PTP BVC (one per cell)
next to the signaling BVC (one per BSS).  Let's represent this in
BSSGP_Emulation so we can create more comprehensive tests.

Change-Id: I7e30b4c4e188518a574e082962fba457b3a97ce3
diff --git a/library/Osmocom_Gb_Types.ttcn b/library/Osmocom_Gb_Types.ttcn
index c5b0953..8101712 100644
--- a/library/Osmocom_Gb_Types.ttcn
+++ b/library/Osmocom_Gb_Types.ttcn
@@ -1555,6 +1555,74 @@
 	}
 
 
+/* extract the BVCI IE of given PDU + return it */
+function f_BSSGP_BVCI_IE_get(PDU_BSSGP pdu) return template (omit) BVCI {
+	select (pdu) {
+	case (PDU_BSSGP:{pDU_BSSGP_FLUSH_LL:=?}) {
+		return pdu.pDU_BSSGP_FLUSH_LL.bVCI_old;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_FLUSH_LL_ACK:=?}) {
+		return pdu.pDU_BSSGP_FLUSH_LL_ACK.bVCI_new;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_LLC_DISCARDED:=?}) {
+		return pdu.pDU_BSSGP_LLC_DISCARDED.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_BVC_BLOCK:=?}) {
+		return pdu.pDU_BSSGP_BVC_BLOCK.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_BVC_BLOCK_ACK:=?}) {
+		return pdu.pDU_BSSGP_BVC_BLOCK_ACK.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_BVC_UNBLOCK:=?}) {
+		return pdu.pDU_BSSGP_BVC_UNBLOCK.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_BVC_UNBLOCK_ACK:=?}) {
+		return pdu.pDU_BSSGP_BVC_UNBLOCK_ACK.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_BVC_RESET:=?}) {
+		return pdu.pDU_BSSGP_BVC_RESET.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_BVC_RESET_ACK:=?}) {
+		return pdu.pDU_BSSGP_BVC_RESET_ACK.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_STATUS:=?}) {
+		return pdu.pDU_BSSGP_STATUS.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_REQUEST:=?}) {
+		return pdu.pDU_BSSGP_PERFORM_LOCATION_REQUEST.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_RESPONSE:=?}) {
+		return pdu.pDU_BSSGP_PERFORM_LOCATION_RESPONSE.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_ABORT:=?}) {
+		return pdu.pDU_BSSGP_PERFORM_LOCATION_ABORT.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_POSITION_COMMAND:=?}) {
+		return pdu.pDU_BSSGP_POSITION_COMMAND.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_POSITION_RESPONSE:=?}) {
+		return pdu.pDU_BSSGP_POSITION_RESPONSE.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_PAGING_PS:={?,?,*,{bVCI:=?},*,*,?,*,*}}) {
+		return pdu.pDU_BSSGP_PAGING_PS.paging_Field4.bVCI;
+		}
+	case (PDU_BSSGP:{pDU_BSSGP_PAGING_CS:={?,?,?,{bVCI:=?},*,*,*,*,*}}) {
+		return pdu.pDU_BSSGP_PAGING_CS.paging_Field4.bVCI;
+		}
+	case else {
+		return omit;
+		}
+	}
+}
+
+/* extract the BVCI IE of given PDU + convert it to integer value */
+function f_BSSGP_BVCI_get(PDU_BSSGP pdu) return template (omit) BssgpBvci {
+	var template (omit) BVCI bvci_raw := f_BSSGP_BVCI_IE_get(pdu);
+	if (istemplatekind(bvci_raw, "omit")) {
+		return omit;
+	}
+	return oct2int(valueof(bvci_raw.unstructured_value));
+}
 
 
 } with { encode "RAW" };