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" };