@ -115,8 +115,6 @@ private const BtsParams c_BtsParams[NUM_BTS_CFG] := {
private const RSL_IE_Body c_mr_conf_5_90 :=
valueof(RSL_IE_Body:{multirate_cfg := ts_RSL_MultirateCfg(true, 0, '00000100'B /* 5,90k */)});
friend const octetstring c_l3_payload := '00010203040506'O;
/* per-BTS state which we keep */
type record BTS_State {
/* component reference to the IPA_Client component used for RSL */
@ -609,6 +607,15 @@ function f_sysinfo_dec_raw(inout SystemInformationConfig si, RSL_Message rsl)
}
}
friend function gen_l3_valid_payload(hexstring imsi := ''H) return octetstring {
var octetstring l3_payload;
if (lengthof(imsi) == 0) {
imsi := f_rnd_imsi('00101'H);
}
l3_payload := enc_PDU_ML3_MS_NW(valueof(ts_LU_REQ(LU_Type_IMSI_Attach, ts_MI_LV(ts_MI_IMSI(imsi)))));
return l3_payload;
}
type component test_CT extends CTRL_Adapter_CT {
/* Array of per-BTS/TRX state */
var BTS_State bts[NUM_BTS][NUM_TRX];
@ -1517,15 +1524,16 @@ testcase TC_chan_act_ack_est_ind_noreply() runs on test_CT {
var IpaStreamId sid := IPAC_PROTO_RSL_TRX0;
var RSL_Message rx_rsl;
var ASP_RSL_Unitdata rx_rsl_ud;
var octetstring l3_payload := gen_l3_valid_payload();
f_init(1);
/* Send CHAN RQD and wait for allocation; acknowledge it */
var RslChannelNr chan_nr := f_chreq_act_ack();
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3_payload));
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload)));
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload)));
/* expect BSC to disable the channel again if there's no response from MSC */
/* MS waits 20s (T3210) at LU; 10s (T3230) at CM SERV REQ and 5s (T3220) AT detach */
@ -1537,15 +1545,16 @@ testcase TC_chan_act_ack_est_ind_noreply() runs on test_CT {
testcase TC_chan_act_ack_est_ind_refused() runs on test_CT {
var BSSAP_N_CONNECT_ind rx_c_ind;
var RSL_Message rx_rsl;
var octetstring l3_payload := gen_l3_valid_payload();
f_init(1);
/* Send CHAN RQD and wait for allocation; acknowledge it */
var RslChannelNr chan_nr := f_chreq_act_ack();
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3_payload));
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) -> value rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) -> value rx_c_ind;
BSSAP.send(ts_BSSAP_DISC_req(rx_c_ind.connectionId, 0));
/* expect BSC to disable the channel */
@ -1680,7 +1689,7 @@ testcase TC_assignment_cic_only(integer bssap_idx := 0) runs on test_CT {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
if (mp_bssap_cfg[bssap_idx].transport == BSSAP_TRANSPORT_AoIP) {
/* send assignment without AoIP IEs */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_AssignmentReq(ts_BSSMAP_IE_CIC(0, 1))));
@ -1806,7 +1815,7 @@ runs on test_CT return DchanTuple {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* send assignment without AoIP IEs */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ass_cmd));
alt {
@ -1946,7 +1955,7 @@ testcase TC_chan_rel_rll_rel_ind() runs on test_CT {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* simulate RLL REL IND */
f_ipa_tx(ts_RSL_REL_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0))));
@ -1974,7 +1983,7 @@ testcase TC_chan_rel_conn_fail() runs on test_CT {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* Sending CONN FAIL IND immediately may trigger a race condition.
* Give the BSC some time to process a new SCCP connection (OS#5823). */
@ -2031,7 +2040,7 @@ testcase TC_late_conn_fail() runs on test_CT {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* BSC<-MSC: Instruct BSC to clear connection */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(0)));
@ -2198,7 +2207,7 @@ testcase TC_chan_rel_hard_clear() runs on test_CT {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* Instruct BSC to clear channel */
var BssmapCause cause := 0;
@ -2220,7 +2229,7 @@ function f_TC_chan_rel_last_eutran_plmn_hard_clear(boolean tx_csfb_ind) runs on
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* Send CommonID with some random PLMN (BSC doesn't take it into account
/* yet when generating the EUTRAN neigh list in RR CHannel Release) */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_CommonId('001019876543210'H, '323454'O)));
@ -2276,7 +2285,7 @@ testcase TC_chan_rel_hard_clear_csfb() runs on test_CT {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* Instruct BSC to clear channel */
var BssmapCause cause := 0;
@ -2298,7 +2307,7 @@ testcase TC_chan_rel_hard_rlsd() runs on test_CT {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* release the SCCP connection */
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
@ -2313,7 +2322,7 @@ testcase TC_chan_rel_hard_rlsd_ms_dead() runs on test_CT {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* release the SCCP connection */
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
@ -2328,7 +2337,7 @@ testcase TC_chan_rel_a_reset() runs on test_CT {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* Clear the queue, it might still contain stuff like IMMEDIATE ASSIGN */
IPA_RSL[0][0].clear;
@ -2356,7 +2365,7 @@ testcase TC_chan_rel_sccp_tiar_timeout() runs on test_CT {
f_init(1);
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
f_expect_chan_rel(dt.rsl_chan_nr, expect_rll_rel_req := false);
f_shutdown_helper();
}
@ -2367,7 +2376,7 @@ runs on test_CT
{
var DchanTuple dt;
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
var BssmapCause cause := 0;
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(enum2int(clear_cmd_cause))));
BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete)) {
@ -2398,11 +2407,12 @@ testcase TC_rll_est_ind_inact_lchan() runs on test_CT {
f_init(1);
var RslChannelNr chan_nr := valueof(t_RslChanNr_Bm(6));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), c_l3_payload));
var octetstring l3_payload := gen_l3_valid_payload();
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3_payload));
T.start;
alt {
[] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) {
[] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) {
setverdict(fail, "MSC received COMPL L3 for non-active lchan");
}
[] BSSAP.receive {}
@ -2416,17 +2426,19 @@ testcase TC_rll_est_ind_inact_lchan() runs on test_CT {
/* Test behavior if RSL EST IND for invalid SAPI */
testcase TC_rll_est_ind_inval_sapi1() runs on test_CT {
var RslChannelNr chan_nr;
var octetstring l3_payload;
f_init(1);
chan_nr := f_chreq_act_ack()
chan_nr := f_chreq_act_ack();
l3_payload := gen_l3_valid_payload();
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(1)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(1)), l3_payload));
timer T := 2.0;
T.start;
alt {
[] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) {
[] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) {
setverdict(fail, "MSC received COMPL L3 for invalid SAPI 1");
}
[] BSSAP.receive { repeat; }
@ -2444,12 +2456,13 @@ testcase TC_rll_est_ind_inval_sapi3() runs on test_CT {
f_init(1);
var RslChannelNr chan_nr := f_chreq_act_ack();
var octetstring l3_payload := gen_l3_valid_payload();
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(3)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(3)), l3_payload));
T.start;
alt {
[] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) {
[] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) {
setverdict(fail, "MSC received COMPL L3 for invalid SAPI 3");
}
[] BSSAP.receive { repeat; }
@ -2467,12 +2480,13 @@ testcase TC_rll_est_ind_inval_sacch() runs on test_CT {
f_init(1);
var RslChannelNr chan_nr := f_chreq_act_ack();
var octetstring l3_payload := gen_l3_valid_payload();
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_SACCH(0)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_SACCH(0)), l3_payload));
T.start;
alt {
[] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) {
[] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) {
setverdict(fail, "MSC received COMPL L3 for invalid Link SACCH");
}
[] BSSAP.receive { repeat; }
@ -2587,10 +2601,10 @@ testcase TC_rll_rel_ind_sapi_n_reject() runs on test_CT {
f_init(1);
/* MS establishes a SAPI=0 link on DCCH */
dt := f_est_dchan(f_rnd_ra_cs(), 23, c_l3_payload );
dt := f_est_dchan(f_rnd_ra_cs(), 23, gen_l3_valid_payload() );
/* MSC sends some data on (not yet established) SAPI=3 link */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(c_l3_payload , '03'O)));
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(gen_l3_valid_payload() , '03'O)));
/* BSC attempts to establish a SAPI=3 link on DCCH */
rx_rsl := f_exp_ipa_rx(tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
@ -2614,10 +2628,10 @@ testcase TC_rll_err_ind_sapi_n_reject() runs on test_CT {
f_init(1);
/* MS establishes a SAPI=0 link on DCCH */
dt := f_est_dchan(f_rnd_ra_cs(), 23, c_l3_payload );
dt := f_est_dchan(f_rnd_ra_cs(), 23, gen_l3_valid_payload() );
/* MSC sends some data on (not yet established) SAPI=3 link */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(c_l3_payload , '03'O)));
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(gen_l3_valid_payload() , '03'O)));
/* BSC attempts to establish a SAPI=3 link on DCCH */
rx_rsl := f_exp_ipa_rx(tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
@ -2641,10 +2655,10 @@ testcase TC_rll_timeout_sapi_n_reject() runs on test_CT {
f_init(1);
/* MS establishes a SAPI=0 link on DCCH */
dt := f_est_dchan(f_rnd_ra_cs(), 23, c_l3_payload );
dt := f_est_dchan(f_rnd_ra_cs(), 23, gen_l3_valid_payload() );
/* MSC sends some data on (not yet established) SAPI=3 link */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(c_l3_payload , '03'O)));
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(gen_l3_valid_payload() , '03'O)));
/* BSC attempts to establish a SAPI=3 link on DCCH */
rx_rsl := f_exp_ipa_rx(tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
@ -2666,10 +2680,10 @@ testcase TC_rll_sapi_n_reject_dlci_cc() runs on test_CT {
f_init(1);
/* MS establishes a SAPI=0 link on DCCH */
dt := f_est_dchan(f_rnd_ra_cs(), 23, c_l3_payload );
dt := f_est_dchan(f_rnd_ra_cs(), 23, gen_l3_valid_payload() );
/* MSC sends some data on (not yet established) SAPI=3 link */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(c_l3_payload , '03'O)));
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSAP_DTAP(gen_l3_valid_payload() , '03'O)));
/* BSC attempts to establish a SAPI=3 link on DCCH */
rx_rsl := f_exp_ipa_rx(tr_RSL_EST_REQ(dt.rsl_chan_nr, tr_RslLinkID_DCCH(3)));
@ -2733,7 +2747,7 @@ function f_test_si2quater(integer total_earfcns, template SystemInformationConfi
var BSSAP_N_DATA_ind rx_di;
var DchanTuple dt;
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* Send CommonID with some random PLMN (BSC doesn't take it into account
* yet when generating the EUTRAN neigh list in RR CHannel Release) */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_CommonId('001019876543210'H, '323454'O)));
@ -7547,7 +7561,7 @@ testcase TC_bssap_rlsd_does_not_cause_bssmap_reset() runs on test_CT {
/* Setup a BSSAP connection and clear it right away. This is
* the MSC telling the BSC about a planned release, it's not an
* erratic loss of a connection. */
dt := f_est_dchan(int2oct(i,1), 23+i, c_l3_payload );
dt := f_est_dchan(int2oct(i,1), 23+i, gen_l3_valid_payload() );
/* MSC disconnects (RLSD). */
BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
@ -7591,7 +7605,7 @@ testcase TC_bssmap_clear_does_not_cause_bssmap_reset() runs on test_CT {
/* Setup a BSSAP connection and clear it right away. This is
* the MSC telling the BSC about a planned release, it's not an
* erratic loss of a connection. */
dt := f_est_dchan(int2oct(i,1), 23+i, c_l3_payload );
dt := f_est_dchan(int2oct(i,1), 23+i, gen_l3_valid_payload() );
/* Instruct BSC to clear channel */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
@ -7637,7 +7651,7 @@ testcase TC_ms_rel_ind_does_not_cause_bssmap_reset() runs on test_CT {
/* Setup a BSSAP connection and clear it right away. This is
* the MSC telling the BSC about a planned release, it's not an
* erratic loss of a connection. */
dt := f_est_dchan('23'O, 23, c_l3_payload );
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() );
/* simulate RLL REL IND */
f_ipa_tx(ts_RSL_REL_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0))));
@ -7951,7 +7965,7 @@ testcase TC_dyn_ts_sdcch8_act_deact() runs on test_CT {
var DchanTuples sdcch_cleanup := {};
var integer i;
for (i := 0; i < NUM_SDCCH_PER_BTS; i := i + 1) {
dt := f_est_dchan('23'O, i, c_l3_payload );
dt := f_est_dchan('23'O, i, gen_l3_valid_payload() );
sdcch_cleanup := sdcch_cleanup & { dt };
}
@ -8028,14 +8042,14 @@ testcase TC_dyn_ts_sdcch8_all_subslots_used() runs on test_CT {
*/
var DchanTuples chan_cleanup := {};
for (i := 0; i < NUM_SDCCH_PER_BTS; i := i+1) {
chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, c_l3_payload ) };
chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, gen_l3_valid_payload() ) };
}
/* Only the dyn TS is still available. Its first lchan gets converted to SDCCH8 */
chan_cleanup := chan_cleanup & { f_est_dchan_dyn('33'O, NUM_SDCCH_PER_BTS + i, c_l3_payload ) };
chan_cleanup := chan_cleanup & { f_est_dchan_dyn('33'O, NUM_SDCCH_PER_BTS + i, gen_l3_valid_payload() ) };
/* Also occupy the seven other SDCCH of the dyn TS */
for (i := 0; i < 7; i := i+1) {
chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, c_l3_payload ) };
chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, gen_l3_valid_payload() ) };
}
/* Clean up SDCCH lchans */
@ -8089,7 +8103,7 @@ testcase TC_dyn_ts_sdcch8_tch_call_act_deact() runs on test_CT {
var DchanTuples chan_cleanup := {};
var OCT1 ra := '43'O; /* RA containing reason=originating speech call*/
for (i := 0; i < NUM_SDCCH_PER_BTS; i := i + 1) {
dt := f_est_dchan(ra, i, c_l3_payload );
dt := f_est_dchan(ra, i, gen_l3_valid_payload() );
chan_cleanup := chan_cleanup & { dt };
}
@ -8167,7 +8181,7 @@ testcase TC_dyn_ts_sdcch8_act_nack() runs on test_CT {
var DchanTuples chan_cleanup := {};
var integer i;
for (i := 0; i < NUM_SDCCH_PER_BTS; i := i + 1) {
dt := f_est_dchan('23'O, i, c_l3_payload );
dt := f_est_dchan('23'O, i, gen_l3_valid_payload() );
chan_cleanup := chan_cleanup & { dt };
}
@ -9207,6 +9221,7 @@ testcase TC_emerg_premption() runs on test_CT {
var integer i;
var integer chreq_total, chreq_nochan;
var RSL_Message rx_rsl;
var octetstring l3_payload := gen_l3_valid_payload();
f_init(1);
f_sleep(1.0);
@ -9226,11 +9241,11 @@ testcase TC_emerg_premption() runs on test_CT {
/* Send EST IND for the first TCH, so we get to test the RR release cause */
var RslChannelNr first_tch := valueof(t_RslChanNr_Bm(1));
f_ipa_tx(ts_RSL_EST_IND(first_tch, valueof(ts_RslLinkID_DCCH(0)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(first_tch, valueof(ts_RslLinkID_DCCH(0)), l3_payload));
/* Accept BSSAP conn, so we get to test the Clear Request cause */
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) -> value rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) -> value rx_c_ind;
var integer sccp_conn_id := rx_c_ind.connectionId;
BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));
@ -9615,7 +9630,7 @@ testcase TC_fh_params_assignment_cmd() runs on test_CT {
* NOTE: only 3 SDCCH/4 channels are available on CCCH+SDCCH4+CBCH */
for (var integer i := 0; i < 3; i := i + 1) {
/* Establish a dedicated channel, so we can trigger (late) TCH assignment */
var DchanTuple dt := f_est_dchan(f_rnd_ra_cs(), 23, c_l3_payload );
var DchanTuple dt := f_est_dchan(f_rnd_ra_cs(), 23, gen_l3_valid_payload() );
/* Send a BSSMAP Assignment Command, expect CHANnel ACTIVation */
BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ass_cmd));
@ -9681,7 +9696,7 @@ runs on test_CT {
var DchanTuple dt;
/* Establish a dedicated channel, so we can trigger handover */
dt := f_est_dchan(f_rnd_ra_cs(), 23, c_l3_payload );
dt := f_est_dchan(f_rnd_ra_cs(), 23, gen_l3_valid_payload() );
f_sleep(0.5);
/* Trigger handover from BTS0 to BTS1 */
@ -11022,6 +11037,7 @@ private function f_verify_imm_ass(RSL_Message imm_ass, template uint8_t ra := ?,
testcase TC_imm_ass_post_chan_ack() runs on test_CT {
var RSL_Message chan_act;
var RSL_Message imm_ass;
var octetstring l3_payload := gen_l3_valid_payload();
f_init(1, false);
f_sleep(1.0);
@ -11054,10 +11070,10 @@ testcase TC_imm_ass_post_chan_ack() runs on test_CT {
chan_ident_ie.chan_ident.ch_desc.v.tsc);
/* Check that the lchan is working */
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3_payload));
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) -> value rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) -> value rx_c_ind;
dt.sccp_conn_id := rx_c_ind.connectionId;
BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));
@ -11069,6 +11085,7 @@ testcase TC_imm_ass_post_chan_ack() runs on test_CT {
testcase TC_imm_ass_pre_chan_ack() runs on test_CT {
var RSL_Message chan_act;
var RSL_Message imm_ass;
var octetstring l3_payload := gen_l3_valid_payload();
f_init(1, false);
f_sleep(1.0);
@ -11101,10 +11118,10 @@ testcase TC_imm_ass_pre_chan_ack() runs on test_CT {
f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
/* Check that the lchan is working */
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3_payload));
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) -> value rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) -> value rx_c_ind;
dt.sccp_conn_id := rx_c_ind.connectionId;
BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));
@ -11116,6 +11133,7 @@ testcase TC_imm_ass_pre_chan_ack() runs on test_CT {
testcase TC_imm_ass_pre_ts_ack() runs on test_CT {
var RSL_Message chan_act;
var RSL_Message imm_ass;
var octetstring l3_payload := gen_l3_valid_payload();
f_init(1, false);
f_sleep(1.0);
@ -11148,10 +11166,10 @@ testcase TC_imm_ass_pre_ts_ack() runs on test_CT {
f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
/* Check that the lchan is working */
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3_payload));
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) -> value rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) -> value rx_c_ind;
dt.sccp_conn_id := rx_c_ind.connectionId;
BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));
@ -11169,6 +11187,7 @@ testcase TC_imm_ass_pre_chan_ack_dyn_ts() runs on test_CT {
f_init(1, false);
f_sleep(1.0);
var octetstring l3_payload := gen_l3_valid_payload();
var RslChannelNr chan_nr := valueof(t_RslChanNr_PDCH(6));
/* The BSC will activate the dynamic PDCH by default, so confirm that */
f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(chan_nr));
@ -11216,10 +11235,10 @@ testcase TC_imm_ass_pre_chan_ack_dyn_ts() runs on test_CT {
f_ipa_tx(ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
/* Check that the lchan is working */
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3_payload));
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) -> value rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) -> value rx_c_ind;
dt.sccp_conn_id := rx_c_ind.connectionId;
BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));
@ -11240,6 +11259,7 @@ testcase TC_imm_ass_pre_ts_ack_dyn_ts() runs on test_CT {
f_init(1, false);
f_sleep(1.0);
var octetstring l3_payload := gen_l3_valid_payload();
var RslChannelNr chan_nr := valueof(t_RslChanNr_PDCH(6));
/* The BSC will activate the dynamic PDCH by default, so confirm that */
f_exp_ipa_rx(tr_RSL_CHAN_ACT_PDCH(chan_nr));
@ -11288,10 +11308,10 @@ testcase TC_imm_ass_pre_ts_ack_dyn_ts() runs on test_CT {
chan_ident_ie.chan_ident.ch_desc.v.tsc);
/* Check that the lchan is working */
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), c_ l3_payload));
f_ipa_tx(ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3_payload));
var BSSAP_N_CONNECT_ind rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(c_ l3_payload))) -> value rx_c_ind;
BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3_payload))) -> value rx_c_ind;
dt.sccp_conn_id := rx_c_ind.connectionId;
BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));
@ -11567,7 +11587,7 @@ testcase TC_ratectr_all_available_allocated() runs on test_CT {
*/
var DchanTuples chan_cleanup := {};
for (i := 0; i < NUM_SDCCH_PER_BTS; i := i+1) {
chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, c_l3_payload ) };
chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, gen_l3_valid_payload() ) };
}
/* Since only bts 0 is connected, expecting all_allocated to become true for both bts 0 and the "global" bsc
@ -11577,7 +11597,7 @@ testcase TC_ratectr_all_available_allocated() runs on test_CT {
/* Also fill up all remaining (TCH) channels */
for (i := 0; i < NUM_TCHF_PER_BTS + NUM_TCHH_PER_BTS; i := i+1) {
chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, c_l3_payload ) };
chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, gen_l3_valid_payload() ) };
}
/* All TCH are now also occupied */
@ -11617,7 +11637,7 @@ testcase TC_ratectr_all_available_allocated_dyn() runs on test_CT {
*/
var DchanTuples chan_cleanup := {};
for (i := 0; i < NUM_SDCCH_PER_BTS; i := i+1) {
chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, c_l3_payload ) };
chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, gen_l3_valid_payload() ) };
}
/* The static SDCCH should now be occupied, while still 3x8 dynamic SDCCH potentially remain. So only
@ -11627,11 +11647,11 @@ testcase TC_ratectr_all_available_allocated_dyn() runs on test_CT {
/* Request more SDCCH, hence convert the first dyn TS to SDCCH8.
* Will release them later, so remember all the DchanTuples. */
var DchanTuples dyn_sddch := {};
dyn_sddch := dyn_sddch & { f_est_dchan_dyn('33'O, NUM_SDCCH_PER_BTS + i, c_l3_payload ) };
dyn_sddch := dyn_sddch & { f_est_dchan_dyn('33'O, NUM_SDCCH_PER_BTS + i, gen_l3_valid_payload() ) };
/* Also occupy the seven other SDCCH of the dyn TS */
for (i := 0; i < 7; i := i+1) {
dyn_sddch := dyn_sddch & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, c_l3_payload ) };
dyn_sddch := dyn_sddch & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, gen_l3_valid_payload() ) };
}
/* Now all dynamic SDCCH are also occupied, so for the first time all_allocated:sdcch will trigger... */
@ -11639,7 +11659,7 @@ testcase TC_ratectr_all_available_allocated_dyn() runs on test_CT {
/* occupy the remaining TCH, three TCH/F and two TCH/H lchans */
for (i := 0; i < 5; i := i+1) {
chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, c_l3_payload ) };
chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, gen_l3_valid_payload() ) };
}
/* All TCH lchans are now also occupied, both static and dynamic */
@ -11713,7 +11733,7 @@ testcase TC_chan_alloc_algo_ascending() runs on test_CT {
/* Expect the BSC to allocate 4 x TCH/F channels on BTS2/TRX0 */
for (var integer i := 0; i < 4; i := i + 1) {
var DchanTuple dt := f_est_dchan('23'O, 23, c_l3_payload , {2, 0});
var DchanTuple dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() , {2, 0});
f_TC_chan_alloc_algo(dt, {2, 0});
f_perform_clear_test_ct(dt);
}
@ -11736,7 +11756,7 @@ testcase TC_chan_alloc_algo_descending() runs on test_CT {
/* Expect the BSC to allocate 5 x TCH/F channels on BTS2/TRX3 */
for (var integer i := 0; i < 5; i := i + 1) {
var DchanTuple dt := f_est_dchan('23'O, 23, c_l3_payload , {2, 0});
var DchanTuple dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() , {2, 0});
f_TC_chan_alloc_algo(dt, {2, 3});
f_perform_clear_test_ct(dt);
}
@ -11765,12 +11785,12 @@ testcase TC_chan_alloc_algo_ass_dynamic() runs on test_CT {
var DchanTuple dt;
f_logp(BSCVTY, "Case a) Unknown Uplink RxLev, fall-back to ascending");
dt := f_est_dchan('23'O, 23, c_l3_payload , TRX0);
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() , TRX0);
f_TC_chan_alloc_algo(dt, TRX0);
f_perform_clear_test_ct(dt);
f_logp(BSCVTY, "Case b) Not enough RxLev samples, use ascending");
dt := f_est_dchan('23'O, 23, c_l3_payload , TRX0);
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() , TRX0);
f_ipa_tx(ts_RSL_MEAS_RES_EMPTY(dt.rsl_chan_nr, 0,
ts_RSL_IE_UplinkMeas(30, 0),
ts_RSL_IE_BS_Power(0)), TRX0);
@ -11779,7 +11799,7 @@ testcase TC_chan_alloc_algo_ass_dynamic() runs on test_CT {
f_perform_clear_test_ct(dt);
f_logp(BSCVTY, "Case c) Uplink RxLev below the threshold, use ascending");
dt := f_est_dchan('23'O, 23, c_l3_payload , TRX0);
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() , TRX0);
f_ipa_tx(ts_RSL_MEAS_RES_EMPTY(dt.rsl_chan_nr, 0,
ts_RSL_IE_UplinkMeas(45, 0),
ts_RSL_IE_BS_Power(0)), TRX0);
@ -11791,7 +11811,7 @@ testcase TC_chan_alloc_algo_ass_dynamic() runs on test_CT {
f_perform_clear_test_ct(dt);
f_logp(BSCVTY, "Case d) Uplink RxLev above the threshold, use descending");
dt := f_est_dchan('23'O, 23, c_l3_payload , TRX0);
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() , TRX0);
f_ipa_tx(ts_RSL_MEAS_RES_EMPTY(dt.rsl_chan_nr, 0,
ts_RSL_IE_UplinkMeas(50, 0),
ts_RSL_IE_BS_Power(0)), TRX0);
@ -11807,7 +11827,7 @@ testcase TC_chan_alloc_algo_ass_dynamic() runs on test_CT {
f_vty_transceive(BSCVTY, "end");
f_logp(BSCVTY, "Case e) Uplink RxLev above the threshold, but C0 load is not");
dt := f_est_dchan('23'O, 23, c_l3_payload , TRX0);
dt := f_est_dchan('23'O, 23, gen_l3_valid_payload() , TRX0);
f_ipa_tx(ts_RSL_MEAS_RES_EMPTY(dt.rsl_chan_nr, 0,
ts_RSL_IE_UplinkMeas(50, 0),
ts_RSL_IE_BS_Power(0)), TRX0);