msc: Introduce tests to verify BSSAP and MGCP handling with IPv6

It tests IPv6 Transport Address are passed correctly through BSSAP, and
forwards handles them correctly as an MGCP client too.

Change-Id: Id616926dd4a9febc4268eea2ee1e377b2d22753a
This commit is contained in:
Pau Espin 2020-09-03 16:46:02 +02:00
parent 078666329d
commit 833174e7fb
2 changed files with 91 additions and 11 deletions

View File

@ -108,6 +108,7 @@ type record BSC_ConnHdlrPars {
boolean use_umts_aka,
boolean ran_is_geran,
boolean use_osmux,
boolean use_ipv6,
boolean verify_cell_id
};
@ -932,7 +933,7 @@ runs on BSC_ConnHdlr {
if (g_pars.ran_is_geran) {
var template BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=
tr_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_conn_1.mgw_rtp_ip), ?);
f_tr_BSSMAP_IE_AoIP_TLA(cpars.mgw_conn_1.mgw_rtp_ip, ?);
interleave {
/* Second MGCP CRCX (this time for MSS/CN side) */
@ -954,8 +955,7 @@ runs on BSC_ConnHdlr {
var BSSMAP_IE_SpeechCodec codec;
var BSSMAP_IE_Osmo_OsmuxCID osmuxCID;
log("f_mt_call_complete 6");
tla := valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.bss_rtp_ip), cpars.bss_rtp_port));
tla := f_ts_BSSMAP_IE_AoIP_TLA(cpars.bss_rtp_ip, cpars.bss_rtp_port);
codec := valueof(ts_BSSMAP_IE_SpeechCodec({ts_CodecFR}));
if (cpars.use_osmux) {
@ -1325,7 +1325,7 @@ runs on BSC_ConnHdlr {
}
var template BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=
tr_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_conn_1.mgw_rtp_ip), ?);
f_tr_BSSMAP_IE_AoIP_TLA(cpars.mgw_conn_1.mgw_rtp_ip, ?);
var default mdcx := activate(as_optional_mgcp_mdcx(cpars.mgw_conn_2.mgw_rtp_ip, cpars.mgw_conn_2.mgw_rtp_port));
var boolean got_mncc_setup_compl_ind := false;
@ -1378,7 +1378,7 @@ runs on BSC_ConnHdlr {
mtc.stop;
}
tla := valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.bss_rtp_ip), cpars.bss_rtp_port));
tla := valueof(f_ts_BSSMAP_IE_AoIP_TLA(cpars.bss_rtp_ip, cpars.bss_rtp_port));
codec := valueof(ts_BSSMAP_IE_SpeechCodec({ts_CodecFR}));
if (cpars.use_osmux) {
if (not ispresent(bssap.pdu.bssmap.assignmentRequest.osmuxCID)) {

View File

@ -408,6 +408,7 @@ runs on MTC_CT return BSC_ConnHdlrPars {
use_umts_aka := false,
ran_is_geran := ran_is_geran,
use_osmux := use_osmux,
use_ipv6 := false,
verify_cell_id := mp_enable_cell_id_test and verify_cell_id
};
if (not ran_is_geran) {
@ -767,6 +768,22 @@ testcase TC_lu_and_mo_call() runs on MTC_CT {
vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), 7);
vc_conn.done;
}
friend function f_tc_lu_and_mo_call_ipv6(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
f_init_handler(pars);
var CallParameters cpars := valueof(t_CallParams);
cpars.mgw_conn_1.mgw_rtp_ip := "::1";
cpars.mgw_conn_2.mgw_rtp_ip := "::2";
cpars.bss_rtp_ip := "::3";
f_perform_lu();
f_mo_call(cpars);
}
testcase TC_lu_and_mo_call_ipv6() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init();
vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call_ipv6), 7);
vc_conn.done;
}
/* Verify T(iar) triggers and releases the channel */
friend function f_lu_and_mo_call_sccp_tiar_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
@ -1960,6 +1977,24 @@ testcase TC_lu_and_mt_call_osmux() runs on MTC_CT {
vc_conn.done;
}
/* LU followed by MT call (including paging) */
friend function f_tc_lu_and_mt_call_ipv6(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
f_init_handler(pars);
var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
cpars.mgw_conn_1.mgw_rtp_ip := "::1";
cpars.mgw_conn_2.mgw_rtp_ip := "::2";
cpars.bss_rtp_ip := "::3";
f_perform_lu();
f_mt_call(cpars);
}
testcase TC_lu_and_mt_call_ipv6() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init();
vc_conn := f_start_handler(refers(f_tc_lu_and_mt_call_ipv6), 39);
vc_conn.done;
}
/* MT call while already Paging */
friend function f_tc_lu_and_mt_call_already_paging(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
@ -5492,7 +5527,14 @@ private altstep as_mgcp_ack_all_mdcx(CallParameters cpars) runs on BSC_ConnHdlr
}
private function f_tc_ho_inter_bsc0(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
var CallParameters cpars;
cpars := valueof(t_CallParams('12345'H, 0));
if (pars.use_ipv6) {
cpars.mgw_conn_1.mgw_rtp_ip := "::1";
cpars.mgw_conn_2.mgw_rtp_ip := "::2";
cpars.bss_rtp_ip := "::3";
}
f_init_handler(pars);
@ -5547,7 +5589,8 @@ private function f_tc_ho_inter_bsc0(charstring id, BSC_ConnHdlrPars pars) runs o
/* new BSS composes a RR Handover Command */
var PDU_ML3_NW_MS rr_ho_cmd := valueof(ts_RR_HandoverCommand);
var octetstring rr_ho_cmd_enc := enc_PDU_ML3_NW_MS(rr_ho_cmd);
var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
var BSSMAP_IE_AoIP_TransportLayerAddress tla tla :=
valueof(f_ts_BSSMAP_IE_AoIP_TLA(cpars.bss_rtp_ip, cpars.bss_rtp_port));
BSSAP.send(ts_BSSMAP_HandoverRequestAcknowledge(rr_ho_cmd_enc, lengthof(rr_ho_cmd_enc),
tla, ts_BSSMAP_IE_SpeechCodec({ts_CodecFR})));
@ -5579,6 +5622,12 @@ private function f_tc_ho_inter_bsc0(charstring id, BSC_ConnHdlrPars pars) runs o
setverdict(pass);
}
private function f_tc_ho_inter_bsc1(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
var charstring bss_rtp_ip;
if (pars.use_ipv6) {
bss_rtp_ip := "::8";
} else {
bss_rtp_ip := "1.2.3.4";
}
f_init_handler(pars);
f_create_bssmap_exp_handoverRequest(194);
@ -5588,7 +5637,8 @@ private function f_tc_ho_inter_bsc1(charstring id, BSC_ConnHdlrPars pars) runs o
/* new BSS composes a RR Handover Command */
var PDU_ML3_NW_MS rr_ho_cmd := valueof(ts_RR_HandoverCommand);
var octetstring rr_ho_cmd_enc := enc_PDU_ML3_NW_MS(rr_ho_cmd);
var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
var BSSMAP_IE_AoIP_TransportLayerAddress tla :=
valueof(f_ts_BSSMAP_IE_AoIP_TLA(bss_rtp_ip, 2342));
BSSAP.send(ts_BSSMAP_HandoverRequestAcknowledge(rr_ho_cmd_enc, lengthof(rr_ho_cmd_enc),
tla, ts_BSSMAP_IE_SpeechCodec({ts_CodecFR})));
@ -5630,19 +5680,27 @@ private function f_tc_ho_inter_bsc1(charstring id, BSC_ConnHdlrPars pars) runs o
f_expect_clear();
setverdict(pass);
}
testcase TC_ho_inter_bsc() runs on MTC_CT {
function f_tc_ho_inter_bsc_main(boolean use_ipv6 := false) runs on MTC_CT {
var BSC_ConnHdlr vc_conn0;
var BSC_ConnHdlr vc_conn1;
f_init(2);
var BSC_ConnHdlrPars pars0 := f_init_pars(53);
pars0.use_ipv6 := use_ipv6;
var BSC_ConnHdlrPars pars1 := f_init_pars(53);
pars1.use_ipv6 := use_ipv6;
vc_conn0 := f_start_handler_with_pars(refers(f_tc_ho_inter_bsc0), pars0, 0);
vc_conn1 := f_start_handler_with_pars(refers(f_tc_ho_inter_bsc1), pars1, 1);
vc_conn0.done;
vc_conn1.done;
}
testcase TC_ho_inter_bsc() runs on MTC_CT {
f_tc_ho_inter_bsc_main(false);
}
testcase TC_ho_inter_bsc_ipv6() runs on MTC_CT {
f_tc_ho_inter_bsc_main(true);
}
function f_ML3_patch_seq_nr_MS_NW(in uint2_t seq_nr, inout octetstring enc_l3) {
log("MS_NW patching N(SD)=", seq_nr, " into dtap ", enc_l3);
@ -5651,7 +5709,14 @@ function f_ML3_patch_seq_nr_MS_NW(in uint2_t seq_nr, inout octetstring enc_l3) {
}
private function f_tc_ho_inter_msc_out(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
var CallParameters cpars;
cpars := valueof(t_CallParams('12345'H, 0));
if (pars.use_ipv6) {
cpars.mgw_conn_1.mgw_rtp_ip := "::1";
cpars.mgw_conn_2.mgw_rtp_ip := "::2";
cpars.bss_rtp_ip := "::3";
}
var hexstring ho_number := f_gen_msisdn(99999);
f_init_handler(pars);
@ -5841,7 +5906,8 @@ private function f_tc_ho_inter_msc_out(charstring id, BSC_ConnHdlrPars pars) run
/* new BSS composes a RR Handover Command */
rr_ho_cmd := valueof(ts_RR_HandoverCommand);
rr_ho_cmd_enc := enc_PDU_ML3_NW_MS(rr_ho_cmd);
var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
var BSSMAP_IE_AoIP_TransportLayerAddress tla :=
valueof(f_ts_BSSMAP_IE_AoIP_TLA(cpars.bss_rtp_ip, cpars.bss_rtp_port));
BSSAP.send(ts_BSSMAP_HandoverRequestAcknowledge(rr_ho_cmd_enc, lengthof(rr_ho_cmd_enc),
tla, ts_BSSMAP_IE_SpeechCodec({ts_CodecFR})));
@ -5889,6 +5955,16 @@ testcase TC_ho_inter_msc_out() runs on MTC_CT {
vc_conn := f_start_handler_with_pars(refers(f_tc_ho_inter_msc_out), pars, 0);
vc_conn.done;
}
testcase TC_ho_inter_msc_out_ipv6() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1);
var BSC_ConnHdlrPars pars := f_init_pars(54);
pars.use_ipv6 := true;
vc_conn := f_start_handler_with_pars(refers(f_tc_ho_inter_msc_out), pars, 0);
vc_conn.done;
}
private function f_tc_lu_imsi_auth_tmsi_check_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
pars.net.expect_auth := true;
@ -6242,6 +6318,7 @@ control {
execute( TC_cmserv_imsi_unknown() );
execute( TC_cmserv_tmsi_unknown() );
execute( TC_lu_and_mo_call() );
execute( TC_lu_and_mo_call_ipv6() );
execute( TC_lu_and_mo_call_sccp_tiar_timeout() );
execute( TC_lu_auth_sai_timeout() );
execute( TC_lu_auth_sai_err() );
@ -6282,6 +6359,7 @@ control {
execute( TC_reset_two() );
execute( TC_lu_and_mt_call() );
execute( TC_lu_and_mt_call_ipv6() );
execute( TC_lu_and_mt_call_already_paging() );
execute( TC_lu_and_mo_sms() );
@ -6348,8 +6426,10 @@ control {
execute( TC_ho_inter_bsc_unknown_cell() );
execute( TC_ho_inter_bsc() );
execute( TC_ho_inter_bsc_ipv6() );
execute( TC_ho_inter_msc_out() );
execute( TC_ho_inter_msc_out_ipv6() );
execute( TC_lu_imsi_auth_tmsi_check_imei() );
execute( TC_lu_imsi_auth3g_tmsi_check_imei() );