gbproxy: Check SGSN-orignated BVC RESET if BSS BVC is gone
IF the BSS-BVC is gone gbproxy blocks the BVC towards the SGSN (this is
the only thing it can do since there is no BVC-REMOVE). If the SGSN ever
decides to reset that BVC the gbproxy should not ACK it, but instead
consider the BVCI unknown.
Change-Id: Ic57b39a77adf71abda99ef8af7da1592e2225a0d
Related: SYS#5628, OS#5236
diff --git a/gbproxy/GBProxy_Tests.ttcn b/gbproxy/GBProxy_Tests.ttcn
index 035a47d..f569eaf 100644
--- a/gbproxy/GBProxy_Tests.ttcn
+++ b/gbproxy/GBProxy_Tests.ttcn
@@ -1158,6 +1158,21 @@
setverdict(pass);
}
+private function f_disable_ns_pcu(integer pcu_idx) runs on test_CT
+{
+ var integer i;
+
+ connect(self:NS_CTRL, g_pcu[pcu_idx].vc_NS:NS_CTRL);
+ for (i := 0; i < lengthof(mp_nsconfig_pcu[pcu_idx].nsvc); i := i + 1) {
+ var uint16_t nsvci := mp_nsconfig_pcu[pcu_idx].nsvc[i].nsvci;
+ var NsDisableVcRequest tx_disar;
+ tx_disar.nsvci := nsvci;
+ log(tx_disar);
+ NS_CTRL.send(tx_disar);
+ }
+ disconnect(self:NS_CTRL, g_pcu[pcu_idx].vc_NS:NS_CTRL);
+}
+
testcase TC_ul_unitdata_pool_failure() runs on test_CT
{
var integer i;
@@ -2707,6 +2722,7 @@
deactivate(d);
setverdict(pass);
}
+
/* Send a BVC-RESET for a PTP BVC from the SGSN side: expect it to propagate */
testcase TC_bvc_reset_ptp_from_sgsn() runs on test_CT
{
@@ -2716,6 +2732,41 @@
f_cleanup();
}
+/* Send a BVC-RESET for a blocked PTP BVC from the SGSN side: expect NS-STATUS with cause BVCI unknown */
+testcase TC_bvc_reset_blocked_ptp_from_sgsn() runs on GlobalTest_CT
+{
+ f_init();
+ f_global_init();
+ f_sleep(3.0);
+ /* Make sure NS for BVC is down and try again */
+ f_disable_ns_pcu(0);
+ f_sleep(10.0);
+
+ var BssgpBvcConfig bvc_cfg := g_pcu[0].cfg.bvc[0];
+ SGSN_MGMT.send(BssgpResetRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to f_get_sgsn_bvc_ct(0, bvc_cfg.bvci);
+
+ /* Check for NS-STATUS with BVCI unknown, ignore other messages */
+ var template (present) PDU_BSSGP exp_rx :=
+ tr_BSSGP_STATUS(bvc_cfg.bvci, BSSGP_CAUSE_BVCI_UNKNOWN, ?);
+
+ alt {
+ [] G_SGSN[0].receive(exp_rx) {
+ setverdict(pass);
+ }
+ [] SGSN_MGMT.receive(BssgpStatusIndication:{*, bvc_cfg.bvci, BVC_S_UNBLOCKED}) {
+ setverdict(fail, "BVC unblocked that should be gone on BSS side");
+ }
+ [] SGSN_MGMT.receive {
+ repeat;
+ }
+ [] G_SGSN[0].receive {
+ repeat;
+ }
+ }
+
+ f_cleanup();
+}
+
private altstep as_ignore_mgmt(BSSGP_BVC_MGMT_PT pt) {
[] pt.receive {repeat; }
}
@@ -3531,6 +3582,7 @@
execute( TC_bvc_reset_ptp_from_bss() );
execute( TC_bvc_reset_sig_from_bss() );
execute( TC_bvc_reset_ptp_from_sgsn() );
+ execute( TC_bvc_reset_blocked_ptp_from_sgsn() );
execute( TC_bvc_reset_sig_from_sgsn() );
if (mp_enable_bss_load_sharing) {
/* don't enable this by default, as we don't yet have any automatic test setup for FR with 4 NS-VC */