aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@espeweb.net>2021-02-10 18:40:46 +0100
committerpespin <pespin@sysmocom.de>2021-02-12 14:40:54 +0000
commit6a71548d47c06deebd4460926d238ec81c6662b8 (patch)
tree1ecdf9c92935b4752d98965942bef9b255b0f701
parentc879f3416f4afb28444596ed3f7332fc82d7174f (diff)
pcu: Introduce tests checking Pkt Cell Chg Notif dup retrans
Tests verify dup retrans triggered by MS timer are ignored if the target cell is still the same (and hence no logic/behavior change is required, current process can proceed onwards). Related: SYS#4909 Change-Id: I00e8c1a63392bf8753f58f7d9d2d0e903ac5c529
-rw-r--r--pcu/PCU_Tests.ttcn242
1 files changed, 219 insertions, 23 deletions
diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn
index 0b887db7..f7687f5e 100644
--- a/pcu/PCU_Tests.ttcn
+++ b/pcu/PCU_Tests.ttcn
@@ -57,6 +57,7 @@ import from StatsD_CodecPort_CtrlFunct all;
import from StatsD_Checker all;
import from IPA_Emulation all;
+import from Osmocom_CTRL_Types all;
import from Osmocom_CTRL_Adapter all;
import from Osmocom_CTRL_Functions all;
@@ -3611,6 +3612,55 @@ runs on RAW_PCU_Test_CT {
return;
}
+private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
+runs on RAW_PCU_Test_CT {
+ var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(f_enc_BcdMccMnc(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1),
+ info_ind.lac),
+ info_ind.rac),
+ info_ind.cell_id));
+ var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
+ 423),
+ 2),
+ 5));
+ var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
+ var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
+ var template (value) RAN_Information_RIM_Container res_cont :=
+ ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
+ ts_RIM_Sequence_Number(2),
+ ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
+ ts_RIM_Protocol_Version_Number(1),
+ tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
+ omit);
+ RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
+ ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
+ res_cont));
+}
+
+altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
+runs on RAW_PCU_Test_CT {
+ /* RIM procedure: */
+ var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(f_enc_BcdMccMnc(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1),
+ info_ind.lac),
+ info_ind.rac),
+ info_ind.cell_id));
+ var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
+ 423),
+ 2),
+ 5));
+ var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
+ var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
+ [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
+ tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
+ tr_RAN_Information_Request_RIM_Container)) {
+ if (do_answer) {
+ f_outbound_nacc_rim_tx_resp(info_ind);
+ }
+ if (do_repeat) {
+ repeat;
+ }
+ }
+}
+
/* Start NACC from MS side */
private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
boolean exp_rac_ci_query := true, boolean exp_si_query := true,
@@ -3639,29 +3689,7 @@ runs on RAW_PCU_Test_CT {
if (exp_si_query == true) {
/* RIM procedure: */
- var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(f_enc_BcdMccMnc(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1), /* '262F42'H */
- info_ind.lac),
- info_ind.rac),
- info_ind.cell_id));
- var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
- 423),
- 2),
- 5));
- var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
- var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
- var template (value) RAN_Information_RIM_Container res_cont;
- res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
- ts_RIM_Sequence_Number(2),
- ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
- ts_RIM_Protocol_Version_Number(1),
- tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
- omit);
- RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
- tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
- tr_RAN_Information_Request_RIM_Container));
- RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
- ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
- res_cont));
+ as_outbound_nacc_rim_resolve(info_ind);
}
/* Announce SI back to MS, continue NACC procedure */
@@ -4119,6 +4147,172 @@ testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
f_shutdown(__BFILE__, __LINE__, final := true);
}
+/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
+testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
+ var PollFnCtx pollctx;
+ var GprsMS ms;
+ var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
+ var template (value) RlcmacUlCtrlMsg cell_chf_notif;
+ var RlcmacDlBlock dl_block;
+ var uint32_t sched_fn;
+ var CtrlMessage rx_ctrl;
+ var GsmArfcn req_arfcn := 862;
+ var uint6_t req_bsic := 43;
+
+ /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
+ f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
+
+ /* Initialize NS/BSSGP side */
+ f_init_bssgp();
+ /* Initialize GPRS MS side */
+ f_init_gprs_ms();
+ ms := g_ms[0]; /* We only use first MS in this test */
+
+ /* Initialize the PCU interface abstraction */
+ f_init_raw(testcasename(), info_ind);
+
+ /* Make sure we are not affected by full cache from previous tests */
+ f_pcuvty_flush_neigh_caches();
+
+ /* Establish BSSGP connection to the PCU */
+ f_bssgp_establish();
+ f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
+
+ /* Send PACKET RESOURCE REQUEST */
+ pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
+ /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
+
+ /* Start NACC from MS side */
+ cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
+ f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
+
+ /* osmo-pcu should now ask for resolution: */
+ f_ipa_ctrl_wait_link_up();
+ var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
+ int2str(info_ind.lac) & "." &
+ int2str(info_ind.cell_id) & "." &
+ int2str(req_arfcn) & "." &
+ int2str(req_bsic);
+ IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
+ /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
+ f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
+ f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
+ IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
+ timer T := 2.0;
+ T.start;
+ alt {
+ [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
+ [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
+ setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
+ f_shutdown(__BFILE__, __LINE__);
+ }
+ [] T.timeout {
+ setverdict(pass);
+ }
+ }
+
+ /* Announce SI back to MS, continue NACC procedure */
+ f_handle_pkt_neighbor_cell_data(ms, si_default);
+
+ /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
+ f_rx_rlcmac_dl_block(dl_block, sched_fn);
+ if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
+ setverdict(fail, "Rx unexpected DL block: ", dl_block);
+ f_shutdown(__BFILE__, __LINE__);
+ }
+ /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
+ if (dl_block.ctrl.mac_hdr.rrbp_valid) {
+ sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
+ }
+
+ f_shutdown(__BFILE__, __LINE__, final := true);
+}
+
+/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
+testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
+ var PollFnCtx pollctx;
+ var GprsMS ms;
+ var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
+ var template (value) RlcmacUlCtrlMsg cell_chf_notif;
+ var RlcmacDlBlock dl_block;
+ var uint32_t sched_fn;
+ var CtrlMessage rx_ctrl;
+ var GsmArfcn req_arfcn := 862;
+ var uint6_t req_bsic := 43;
+
+ /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
+ f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
+
+ /* Initialize NS/BSSGP side */
+ f_init_bssgp();
+ /* Initialize GPRS MS side */
+ f_init_gprs_ms();
+ ms := g_ms[0]; /* We only use first MS in this test */
+
+ /* Initialize the PCU interface abstraction */
+ f_init_raw(testcasename(), info_ind);
+
+ /* Make sure we are not affected by full cache from previous tests */
+ f_pcuvty_flush_neigh_caches();
+
+ /* Establish BSSGP connection to the PCU */
+ f_bssgp_establish();
+ f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
+
+ /* Send PACKET RESOURCE REQUEST */
+ pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
+ /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
+
+ /* Start NACC from MS side */
+ cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
+ f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
+
+ /* osmo-pcu should now ask for resolution: */
+ f_ipa_ctrl_wait_link_up();
+ var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
+ int2str(info_ind.lac) & "." &
+ int2str(info_ind.cell_id) & "." &
+ int2str(req_arfcn) & "." &
+ int2str(req_bsic);
+ f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
+ as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
+ /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
+ f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
+ f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
+ f_outbound_nacc_rim_tx_resp(info_ind);
+ timer T := 1.0;
+ T.start;
+ alt {
+ [] RIM.receive {
+ setverdict(fail, "Received unexpected RIM message");
+ f_shutdown(__BFILE__, __LINE__);
+ }
+ [] T.timeout {
+ setverdict(pass);
+ }
+ }
+
+ /* Announce SI back to MS, continue NACC procedure */
+ f_handle_pkt_neighbor_cell_data(ms, si_default);
+
+ /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
+ f_rx_rlcmac_dl_block(dl_block, sched_fn);
+ if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
+ setverdict(fail, "Rx unexpected DL block: ", dl_block);
+ f_shutdown(__BFILE__, __LINE__);
+ }
+ /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
+ if (dl_block.ctrl.mac_hdr.rrbp_valid) {
+ sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
+ }
+
+ f_shutdown(__BFILE__, __LINE__, final := true);
+}
+
/* Send a RIM RAN info request to the PCU and verify the response, we expect
* getting the system information back which we have transfered to the PCU via
* PCUIF on startup. */
@@ -4346,6 +4540,8 @@ control {
execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
execute( TC_nacc_outbound_si_resolve_timeout() );
+ execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
+ execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
execute( TC_rim_ran_info_req_single_rep() );
execute( TC_rim_ran_info_req_single_rep_no_si() );