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/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn
index f68485a..b2f8b75 100644
--- a/pcu/PCU_Tests.ttcn
+++ b/pcu/PCU_Tests.ttcn
@@ -83,7 +83,7 @@
 	cell_id := 20960,
 	repeat_time := 5 * 50,
 	repeat_count := 3,
-	bvci := mp_gb_cfg.bvci,
+	bvci := mp_gb_cfg.bvc[0].bvci,
 	t3142 := 20,
 	t3169 := 5,
 	t3191 := 5,
@@ -215,12 +215,12 @@
 	activate(as_Tguard_RAW());
 
 	/* Init PCU interface component */
-	vc_PCUIF := RAW_PCUIF_CT.create("PCUIF-" & id);
+	vc_PCUIF := RAW_PCUIF_CT.create("PCUIF");
 	connect(vc_PCUIF:MTC, self:PCUIF);
 	map(vc_PCUIF:PCU, system:PCU);
 
 	/* Create one BTS component (we may want more some day) */
-	vc_BTS := RAW_PCU_BTS_CT.create("BTS-" & id);
+	vc_BTS := RAW_PCU_BTS_CT.create("BTS");
 	connect(vc_BTS:PCUIF, vc_PCUIF:BTS);
 	connect(vc_BTS:TC, self:BTS);
 
@@ -239,7 +239,7 @@
 }
 
 testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {
-	var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.cell_id.ra_id);
+	var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
 	var GprsTlli tlli := 'FFFFFFFF'O;
 	timer T;
 
@@ -256,7 +256,7 @@
 
 	T.start(2.0);
 	alt {
-	[] BSSGP_SIG[0].receive(tr_BSSGP_SUSPEND(tlli, mp_gb_cfg.cell_id.ra_id)) {
+	[] BSSGP_SIG[0].receive(tr_BSSGP_SUSPEND(tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
 		setverdict(pass);
 		}
 	[] T.timeout {
@@ -890,7 +890,7 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
 
 	/* receive one message on BSSGP with all aggregated data in payload: */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, total_payload));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, total_payload));
 }
 
 /* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
@@ -936,7 +936,7 @@
 	/* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
 	/* receive one message on BSSGP with all aggregated data in payload: */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, payload));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, payload));
 
 	/* Test sending LLC PDUS of incrementing size */
 	var integer max_size := 49;
@@ -962,7 +962,7 @@
 		f_ms_tx_ul_block(ms, ul_data);
 
 		/* receive one message on BSSGP with all aggregated data in payload: */
-		BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, payload));
+		BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, payload));
 
 		/* we will receive UL ACK/NACK from time to time, handle it. */
 		f_rx_rlcmac_dl_block(dl_block, dl_fn);
@@ -1007,7 +1007,7 @@
 
 	T.start(0.5);
 	alt {
-	[] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, ?)) {
+	[] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
 		setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
 		f_shutdown(__BFILE__, __LINE__);
 	}
@@ -1082,7 +1082,7 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
 
 	/* UL block should be received in SGSN */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
 
 	/* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
 	BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
@@ -1172,7 +1172,7 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
 
 	/* UL block should be received in SGSN */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
 
 	/* Now SGSN sends some DL data, PCU will page on PACCH */
 	BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
@@ -1287,7 +1287,7 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
 
 	/* UL block should be received in SGSN */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
 
 	f_shutdown(__BFILE__, __LINE__, final := true);
 }
@@ -1383,7 +1383,7 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
 
 	/* receive one message on BSSGP with all aggregated data in payload: */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, total_payload));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, total_payload));
 }
 
 /* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
@@ -1581,7 +1581,7 @@
 	f_ms_tx_ul_block(ms, ul_data);
 
 	/* UL block dataA should be received in SGSN */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, dataA));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataA));
 
 	/* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
 	ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,
@@ -1598,8 +1598,8 @@
 	f_ms_tx_ul_block(ms, ul_data);
 
 	/* UL block dataB and dataC should be received in SGSN */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, dataB));
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, dataC));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataC));
 
 	/* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
 	ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,
@@ -1613,7 +1613,7 @@
 	f_ms_tx_ul_block(ms, ul_data);
 
 	/* UL block dataB and dataD should be received in SGSN */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, dataD));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataD));
 
 	f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
 	/* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
@@ -1656,7 +1656,7 @@
 	f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
 
 	/* UL block should be received in SGSN */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
 
 	acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
 						   tr_UlAckNackGprs(ms.tlli,
@@ -1677,7 +1677,7 @@
 	f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false);  /* TODO: send using cs_mcs */
 
 	/* UL block should be received in SGSN */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
 
 	f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
 	/* ACK the ACK */
@@ -1811,7 +1811,7 @@
 }
 
 testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
-	f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvci);
+	f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
 }
 
 /* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
@@ -1858,7 +1858,7 @@
 }
 
 testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
-	f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvci);
+	f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
 }
 
 /* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
@@ -1894,7 +1894,7 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
 
 	/* UL block should be received in SGSN */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
 
 	/* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
 	BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
@@ -1953,7 +1953,7 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
 
 	/* UL block should be received in SGSN */
-	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id));
+	BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
 
 	/* Now SGSN sends some DL data with an invalid IMSI */
 	BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));