jolly has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/33150 )
Change subject: Added BSC tests for terminating voice group calls
......................................................................
Added BSC tests for terminating voice group calls
fixes: I9b824a08d3948dc01e4748d4a4d61b889d31e5ff
Change-Id: I6762e8adfb7d5f77df837c698ff70cd7fd715ffe
---
M bsc/BSC_Tests_ASCI.ttcn
1 file changed, 442 insertions(+), 26 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/50/33150/1
diff --git a/bsc/BSC_Tests_ASCI.ttcn b/bsc/BSC_Tests_ASCI.ttcn
index 27538a7..448fbef 100644
--- a/bsc/BSC_Tests_ASCI.ttcn
+++ b/bsc/BSC_Tests_ASCI.ttcn
@@ -35,26 +35,233 @@
import from RAN_Adapter all;
import from RAN_Emulation all;
+const charstring VGCS_CALL_EST := "VGCS_CALL_EST";
+const charstring VGCS_CALL_REL := "VGCS_CALL_REL";
+const charstring VGCS_CHANNEL_REL := "VGCS_CHANNEL_REL";
+const charstring VGCS_UPLINK_FREE := "VGCS_UPLINK_FREE";
+const charstring VGCS_UPLINK_BUSY := "VGCS_UPLINK_BUSY";
+const charstring VGCS_ASSIGN_RES := "VGCS_ASSIGN_RES";
+const charstring VGCS_ASSIGN_FAIL := "VGCS_ASSIGN_FAIL";
+
+type component RSL_DchanHdlr {
+ /* port facing up towards dedicated channel handler */
+ port RSL_DCHAN_PT RSL;
+ port RSLEM_PROC_PT RSL_PROC;
+ var RslChannelNr g_chan_nr;
+ /* second BTS / DChan during hand-over */
+ port RSL_DCHAN_PT RSL1;
+ port RSLEM_PROC_PT RSL1_PROC;
+ port RSL_DCHAN_PT RSL2;
+ port RSLEM_PROC_PT RSL2_PROC;
+};
+
+template (value) DescriptiveGroupOrBroadcastCallReference_V
+ ts_BSSMAP_IE_GroupCallRef(integer cr, integer sf, integer af, integer prio, integer
ci) := {
+ binaryCodingOfGroupOrBroadcastCallReference := int2bit(cr, 27),
+ sF := int2bit(sf, 1),
+ aF := int2bit(af, 1),
+ callPriority := int2bit(prio, 3),
+ cipheringInformation := int2bit(ci, 4),
+ spare := '0000'B
+}
function f_gen_asci_ass_req(integer bssap_idx := 0,
template (value) BSSMAP_IE_ChannelType ch_type := ts_BSSMAP_IE_ChannelType,
template (value) OCT1 ass_requirement := '00'O,
- template (value) BSSMAP_IE_CellIdentifier cell_id := ts_CellID_LAC_CI(1, 0),
- template (value) GroupCallRef group_call_ref := '2342'O,
+ template (value) BSSMAP_IE_CellIdentifier cell_id := ts_CellId_CI(0),
+ template (value) GroupCallRef group_call_ref := '0000001000'O,
charstring aoip_tla :="1.2.3.4")
runs on MSC_ConnHdlr return template (value) PDU_BSSAP {
if (mp_bssap_cfg[bssap_idx].transport == BSSAP_TRANSPORT_AoIP) {
var template (value) BSSMAP_IE_AoIP_TransportLayerAddress tla :=
- f_ts_BSSMAP_IE_AoIP_TLA(aoip_tla, 2342);
+ f_ts_BSSMAP_IE_AoIP_TLA(aoip_tla, 2342);
+ var template (value) BSSMAP_IE_SpeechCodecList codec_list :=
+ ts_BSSMAP_IE_CodecList({ts_CodecFR});
return ts_BSSMAP_VGCS_VBS_AssignmentReq(ch_type, ass_requirement, cell_id,
- group_call_ref, omit, tla);
+ group_call_ref, omit, tla, omit, codec_list);
} else {
var template (value) BSSMAP_IE_CircuitIdentityCode cic := ts_BSSMAP_IE_CIC(0,1);
return ts_BSSMAP_VGCS_VBS_AssignmentReq(ch_type, ass_requirement, cell_id,
- group_call_ref, cic, omit);
+ group_call_ref, cic, omit, omit, omit);
}
}
+/*
+ * VGCS/VBS call controling connection
+ */
+
+private function f_tc_vgcs_vbs_setup(charstring id) runs on MSC_ConnHdlr {
+ var PDU_BSSAP rx_bssap;
+ var template (value) DescriptiveGroupOrBroadcastCallReference_V callref :=
+ ts_BSSMAP_IE_GroupCallRef(11, 1, 0, 0, 0);
+ var template (value) PDU_BSSAP setup_req :=
ts_BSSMAP_VGCS_VBS_Setup(bit2oct(encvalue(callref)), omit);
+ var boolean uplink_free := false;
+ var boolean uplink_busy := false;
+ var boolean uplink_req := false;
+ var boolean uplink_req_conf := false;
+ var boolean uplink_rel_ind := false;
+ var boolean assign_res := false;
+ var boolean assign_fail := false;
+ timer T := 0.2;
+ if (true) { /* VGCS/VBS ASS REQ in SCCP CR */
+ BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, setup_req));
+ BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
+ } else { /* VGCS/VBS ASS REQ in SCCP DT1 */
+ BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, omit));
+ BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
+ BSSAP.send(setup_req);
+ }
+
+ f_sleep(0.5);
+
+ alt {
+ [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_SetupAck) -> value rx_bssap {
+ log("VGCS: got setup ack");
+ if (not g_pars.vgcs_setup_only) {
+ COORD.send(VGCS_CALL_EST);
+ repeat;
+ }
+ BSSAP.send(ts_BSSMAP_ClearCommand(0));
+ BSSAP.receive(tr_BSSMAP_ClearComplete);
+ BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
+ setverdict(pass);
+ return;
+ }
+ [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_SetupRefuse) -> value rx_bssap {
+ log("VGCS: got setup refuse");
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Expected ASCI Setup to succeed, but got fail");
+ return;
+ }
+ [] BSSAP.receive(tr_BSSMAP_UplinkReq) -> value rx_bssap {
+ log("VGCS: received uplink req");
+ uplink_req := true;
+ BSSAP.send(ts_BSSMAP_UplinkReqAck(omit));
+ if (not g_pars.vgcs_talker_est) {
+ T.start;
+ }
+ repeat;
+ }
+ [] BSSAP.receive(tr_BSSMAP_UplinkReqConf(?, omit, '1234'O)) -> value rx_bssap
{
+ log("VGCS: received uplink req confirm");
+ uplink_req_conf := true;
+ if (not g_pars.vgcs_talker_rel) {
+ T.start;
+ }
+ repeat;
+ }
+ [] BSSAP.receive(tr_BSSMAP_UplinkRelInd(GSM0808_CAUSE_CALL_CONTROL)) -> value
rx_bssap {
+ log("VGCS: received uplink rel ind");
+ uplink_rel_ind := true;
+ T.start;
+ repeat;
+ }
+ [] COORD.receive(VGCS_ASSIGN_RES) {
+ log("VGCS: got assignment result at call control");
+ assign_res := true;
+ if (not g_pars.vgcs_talker_req) {
+ T.start;
+ }
+ repeat;
+ }
+ [] COORD.receive(VGCS_ASSIGN_FAIL) {
+ log("VGCS: got assignment failure at call control");
+ assign_fail := true;
+ if (g_pars.vgcs_assign_fail) {
+ T.start;
+ }
+ repeat;
+ }
+ [] COORD.receive(VGCS_UPLINK_FREE) {
+ log("VGCS: Got UPLINK FREE at call control");
+ uplink_busy := false;
+ uplink_free := true;
+ repeat;
+ }
+ [] COORD.receive(VGCS_UPLINK_BUSY) {
+ log("VGCS: Got UPLINK BUSY at call control");
+ uplink_busy := true;
+ uplink_free := false;
+ repeat;
+ }
+ [] T.timeout {
+ COORD.send(VGCS_CHANNEL_REL);
+ BSSAP.send(ts_BSSMAP_ClearCommand(0));
+ BSSAP.receive(tr_BSSMAP_ClearComplete);
+ BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
+ if (g_pars.vgcs_assign_fail) {
+ if (not assign_fail) {
+ setverdict(fail, "VGCS: Assignment did not fail as expected!");
+ return;
+ }
+ log("VGCS: Channel assignment failed as expected!");
+ setverdict(pass);
+ return;
+ }
+ if (not assign_res) {
+ setverdict(fail, "VGCS: Assignment did not pass as expected!");
+ return;
+ }
+ if (g_pars.vgcs_talker_rel) {
+ if (not uplink_rel_ind) {
+ setverdict(fail, "VGCS: No uplink release indication as expected!");
+ return;
+ }
+ if (not uplink_free) {
+ setverdict(fail, "VGCS: Uplink not free as expected!");
+ return;
+ }
+ log("VGCS: Uplink establised+telease and uplink marked free as expected!");
+ setverdict(pass);
+ return;
+ }
+ if (g_pars.vgcs_talker_est) {
+ if (not uplink_req_conf) {
+ setverdict(fail, "VGCS: No uplink request confirm as expected!");
+ return;
+ }
+ if (not uplink_busy) {
+ setverdict(fail, "VGCS: Uplink not busy as expected!");
+ return;
+ }
+ log("VGCS: Uplink established and uplink marked busy as expected!");
+ setverdict(pass);
+ return;
+ }
+ if (g_pars.vgcs_talker_req) {
+ if (not uplink_req) {
+ setverdict(fail, "VGCS: No uplink request as expected!");
+ return;
+ }
+ if (not uplink_busy) {
+ setverdict(fail, "VGCS: Uplink not busy as expected!");
+ return;
+ }
+ log("VGCS: Uplink requested and uplink marked busy as expected!");
+ setverdict(pass);
+ return;
+ }
+ if (not uplink_free) {
+ setverdict(fail, "VGCS: Uplink not free as expected!");
+ return;
+ }
+ log("VGCS: Channel established and uplink marked free as expected!");
+ setverdict(pass);
+ return;
+ }
+ }
+}
+
+/*
+ * VGCS/VBS resource controling connection
+ */
+
+private altstep as_eat_rsl_data() runs on MSC_ConnHdlr {
+ [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, ?)) {
+ log("VGCS: Got RSL DATA REQ on channel");
+ repeat;
+ }
+}
private function f_tc_asci_assignment(charstring id) runs on MSC_ConnHdlr {
var PDU_BSSAP rx_bssap;
@@ -67,17 +274,31 @@
f_rslem_register(0, new_chan_nr);
g_chan_nr := new_chan_nr;
var uint3_t expect_target_tsc := c_BtsParams[0].tsc;
+ var default eat_rsl_data;
+
f_sleep(1.0);
f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3",
FR_AMR);
var default as_media := activate(as_Media());
+ log("VGCS: wait for establishment of call controling connection");
+ COORD.receive(VGCS_CALL_EST);
+ log("VGCS: got establishment of call controling connection");
+
/* TODO: Encryption */
- var template (value) BSSMAP_IE_ChannelType ch_type := ts_BSSMAP_IE_ChannelType;
- var template (value) BSSMAP_IE_CellIdentifier cell_id := ts_CellID_LAC_CI(1, 0);
- var template (value) PDU_BSSAP ass_req := f_gen_asci_ass_req(ch_type := ch_type, cell_id
:= cell_id);
- if (false) { /* VGCS/VBS ASS REQ in SCCP CR */
+ var template (value) BSSMAP_IE_ChannelType req_ch_type := ts_BSSMAP_IE_ChannelType;
+ var template BSSMAP_IE_ChannelType res_ch_type :=
tr_BSSMAP_IE_ChannelType('0001'B, ChRate_TCHF, Spdi_TCHF_FR);
+ var template (value) BSSMAP_IE_CellIdentifier req_cell_id := ts_CellId_CI(0);
+ var template BSSMAP_IE_CellIdentifier res_cell_id := tr_CellId_CI(0);
+ var template (value) DescriptiveGroupOrBroadcastCallReference_V callref :=
+ ts_BSSMAP_IE_GroupCallRef(11, 1, 0, 0, 0);
+ if (g_pars.vgcs_assign_fail) {
+ callref := ts_BSSMAP_IE_GroupCallRef(10, 1, 0, 0, 0);
+ }
+ var template (value) PDU_BSSAP ass_req := f_gen_asci_ass_req(ch_type := req_ch_type,
cell_id := req_cell_id,
+ group_call_ref := bit2oct(encvalue(callref)));
+ if (true) { /* VGCS/VBS ASS REQ in SCCP CR */
BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, ass_req));
BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
} else { /* VGCS/VBS ASS REQ in SCCP DT1 */
@@ -87,22 +308,50 @@
}
alt {
- [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentRes(ch_type, cell_id)) -> value
rx_bssap {
- if (g_pars.expect_ho_fail) {
- Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
- "Expected ASCI Assignment to fail, but got success");
+ [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentRes(res_ch_type, res_cell_id)) -> value
rx_bssap {
+ log("VGCS: got assignment result on channel");
+ COORD.send(VGCS_ASSIGN_RES);
+ if (g_pars.vgcs_talker_req) {
+ log("VGCS: sending talker det");
+ RSL.send(ts_RSL_TALKER_DET(g_chan_nr));
}
+ if (g_pars.vgcs_talker_est) {
+ log("VGCS: sending RSL etabish ind");
+ RSL.send(ts_RSL_EST_IND(g_chan_nr, ts_RslLinkID_DCCH(0), '1234'O));
+ }
+ if (g_pars.vgcs_talker_rel) {
+ log("VGCS: sending RSL release ind");
+ RSL.send(ts_RSL_REL_IND(g_chan_nr, ts_RslLinkID_DCCH(0)));
+ }
+ repeat;
}
[] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentFail) -> value rx_bssap {
- if (not g_pars.expect_ho_fail) {
- Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
- "Expected ASCI Assignment to succeed, but got fail");
- }
- /* TOOD: evaluate correct cause value. But osmo-bsc doesn't seem to send meaningful
causes * yet! */
- BSSAP.receive(tr_BSSMAP_ClearRequest);
- setverdict(pass);
+ log("VGCS: got assignment failure on channel");
+ COORD.send(VGCS_ASSIGN_FAIL);
+ log("VGCS: got release order after assignment failure");
+ COORD.receive(VGCS_CHANNEL_REL);
+ BSSAP.send(ts_BSSMAP_ClearCommand(0));
+ BSSAP.receive(tr_BSSMAP_ClearComplete);
+ BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
return;
}
+ [] COORD.receive(VGCS_CHANNEL_REL) {
+ log("VGCS: got release order of resource controling connection");
+ eat_rsl_data := activate(as_eat_rsl_data());
+ f_perform_clear_no_rr_rel();
+ deactivate(eat_rsl_data);
+ return;
+ }
+ [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?,
'082B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O)) {
+ log("VGCS: Got UPLINK FREE on channel");
+ COORD.send(VGCS_UPLINK_FREE);
+ repeat;
+ }
+ [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, '062A'O)) {
+ log("VGCS: Got UPLINK BUSY on channel");
+ COORD.send(VGCS_UPLINK_BUSY);
+ repeat;
+ }
}
/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
@@ -126,22 +375,178 @@
}
-testcase TC_vbs_assignment() runs on test_CT {
- var MSC_ConnHdlr vc_conn;
+testcase TC_vgcs_vbs_setup_only() runs on test_CT {
+ var MSC_ConnHdlr call_conn;
var TestHdlrParams pars := f_gen_test_hdlr_pars();
+ f_sleep(2.0);
+
f_init(1, true);
f_sleep(1.0);
- vc_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
- vc_conn.done;
+ pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+ pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+ pars.vgcs_setup_only := true;
+ pars.vgcs_talker_req := false;
+ pars.vgcs_talker_est := false;
+ pars.vgcs_talker_rel := false;
+ pars.vgcs_assign_fail := false;
+
+ call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+
+ call_conn.done;
+
+ f_shutdown_helper();
+}
+
+testcase TC_vgcs_vbs_assignment() runs on test_CT {
+ var MSC_ConnHdlr call_conn, chan_conn;
+ var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+ f_sleep(2.0);
+
+ f_init(1, true);
+ f_sleep(1.0);
+
+ pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+ pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+ pars.vgcs_setup_only := false;
+ pars.vgcs_talker_req := false;
+ pars.vgcs_talker_est := false;
+ pars.vgcs_talker_rel := false;
+ pars.vgcs_assign_fail := false;
+
+ call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+ chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+ connect(call_conn:COORD, chan_conn:COORD);
+
+ call_conn.done;
+ chan_conn.done;
+
+ f_shutdown_helper();
+}
+
+testcase TC_vgcs_vbs_assignment_fail() runs on test_CT {
+ var MSC_ConnHdlr call_conn, chan_conn;
+ var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+ f_sleep(2.0);
+
+ f_init(1, true);
+ f_sleep(1.0);
+
+ pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+ pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+ pars.vgcs_setup_only := false;
+ pars.vgcs_talker_req := false;
+ pars.vgcs_talker_est := false;
+ pars.vgcs_talker_rel := false;
+ pars.vgcs_assign_fail := true;
+
+ call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+ chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+ connect(call_conn:COORD, chan_conn:COORD);
+
+ call_conn.done;
+ chan_conn.done;
+
+ f_shutdown_helper();
+}
+
+testcase TC_vgcs_vbs_talker_req() runs on test_CT {
+ var MSC_ConnHdlr call_conn, chan_conn;
+ var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+ f_sleep(2.0);
+
+ f_init(1, true);
+ f_sleep(1.0);
+
+ pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+ pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+ pars.vgcs_setup_only := false;
+ pars.vgcs_talker_req := true;
+ pars.vgcs_talker_est := false;
+ pars.vgcs_talker_rel := false;
+ pars.vgcs_assign_fail := false;
+
+ call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+ chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+ connect(call_conn:COORD, chan_conn:COORD);
+
+ call_conn.done;
+ chan_conn.done;
+
+ f_shutdown_helper();
+}
+
+testcase TC_vgcs_vbs_talker_est() runs on test_CT {
+ var MSC_ConnHdlr call_conn, chan_conn;
+ var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+ f_sleep(2.0);
+
+ f_init(1, true);
+ f_sleep(1.0);
+
+ pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+ pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+ pars.vgcs_setup_only := false;
+ pars.vgcs_talker_req := true;
+ pars.vgcs_talker_est := true;
+ pars.vgcs_talker_rel := false;
+ pars.vgcs_assign_fail := false;
+
+ call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+ chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+ connect(call_conn:COORD, chan_conn:COORD);
+
+ call_conn.done;
+ chan_conn.done;
+
+ f_shutdown_helper();
+}
+
+testcase TC_vgcs_vbs_talker_rel() runs on test_CT {
+ var MSC_ConnHdlr call_conn, chan_conn;
+ var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+ f_sleep(2.0);
+
+ f_init(1, true);
+ f_sleep(1.0);
+
+ pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+ pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+ pars.vgcs_setup_only := false;
+ pars.vgcs_talker_req := true;
+ pars.vgcs_talker_est := true;
+ pars.vgcs_talker_rel := true;
+ pars.vgcs_assign_fail := false;
+
+ call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+ chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+ connect(call_conn:COORD, chan_conn:COORD);
+
+ call_conn.done;
+ chan_conn.done;
f_shutdown_helper();
}
control {
- execute( TC_vbs_assignment() );
-
+ execute( TC_vgcs_vbs_setup_only() );
+ execute( TC_vgcs_vbs_assignment() );
+ execute( TC_vgcs_vbs_assignment_fail() );
+ execute( TC_vgcs_vbs_talker_req() );
+ execute( TC_vgcs_vbs_talker_est() );
+ execute( TC_vgcs_vbs_talker_rel() );
}
--
To view, visit
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/33150
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I6762e8adfb7d5f77df837c698ff70cd7fd715ffe
Gerrit-Change-Number: 33150
Gerrit-PatchSet: 1
Gerrit-Owner: jolly <andreas(a)eversberg.eu>
Gerrit-MessageType: newchange