pespin submitted this change.
sgsn: Introduce test TC_attach_pdp_act_user
Related: SYS#5435
Change-Id: I5f0cb51457395d95bde22732b032786211cb7b61
---
M sgsn/BSSGP_ConnHdlr.ttcn
M sgsn/SGSN_Tests_Iu.ttcn
M sgsn/expected-results.xml
3 files changed, 247 insertions(+), 53 deletions(-)
diff --git a/sgsn/BSSGP_ConnHdlr.ttcn b/sgsn/BSSGP_ConnHdlr.ttcn
index 5847ac0..fcadffc 100644
--- a/sgsn/BSSGP_ConnHdlr.ttcn
+++ b/sgsn/BSSGP_ConnHdlr.ttcn
@@ -4,6 +4,7 @@
import from Osmocom_Types all;
import from GSM_Types all;
import from Native_Functions all;
+import from Misc_Helpers all;
import from NS_Types all;
import from NS_Emulation all;
import from BSSGP_Types all;
@@ -23,10 +24,12 @@
import from IPA_Emulation all;
import from RAN_Adapter all;
+import from RANAP_Constants all;
+import from RANAP_PDU_Descriptions all;
+import from RANAP_PDU_Contents all;
+import from RANAP_IEs all;
import from RAN_Emulation all;
import from RANAP_Templates all;
-import from RANAP_PDU_Descriptions all;
-import from RANAP_IEs all;
import from GTPv1C_CodecPort all;
import from GTPv1U_CodecPort all;
@@ -51,6 +54,9 @@
/* Emulated GGSN is at GTP_ConnHdlr.GTP[0] */
const integer GTP_GGSN_IDX := 0;
+private function ran2gtp_idx(integer ran_index) return integer {
+ return ran_index + 1 - NUM_GB;
+}
type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr, RAN_ConnHdlr {
var BSSGP_ConnHdlrPars g_pars;
@@ -145,7 +151,7 @@
/* tell GSUP dispatcher to send this IMSI to us */
f_create_gsup_expect(hex2str(g_pars.imsi));
/* tell GTP dispatcher to send this IMSI to us */
- f_gtp_register_imsi(g_pars.imsi);
+ f_gtp_register_imsi(g_pars.imsi, GTP_GGSN_IDX);
g_Tguard.start(pars.t_guard);
activate(as_Tguard());
@@ -489,6 +495,8 @@
/* IuPS case: Expect Iu Release */
if (is_iu(ran_index)) {
as_iu_release_compl_disc();
+ /* Next message will be an InitialUE since conn was torn down */
+ g_pars.rnc_send_initial_ue := true;
}
/* Race condition
@@ -603,6 +611,51 @@
}
}
+/* Iu only */
+altstep as_service_request(integer ran_index := 0) runs on BSSGP_ConnHdlr {
+ var PDU_DTAP_PS_MT mt;
+
+ [] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_SERVICE_ACC)) -> value mt {
+ setverdict(pass);
+ }
+ [] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_SERVICE_REJ)) {
+ setverdict(fail, "Unexpected Service Reject");
+ mtc.stop;
+ }
+ [] BSSAP.receive(tr_RANAP_SecurityModeCmd(uia_algs := ?,
+ uia_key := oct2bit(g_pars.vec.ik),
+ key_sts := ?)) {
+ var IntegrityProtectionAlgorithm uia_chosen := 0; /* 0 = standard_UMTS_integrity_algorithm_UIA1 */
+ BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
+ BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)))
+ repeat;
+ }
+}
+
+function f_service_request(ServiceType service_type := SERVICE_TYPE_Signalling,
+ integer ran_index := 0,
+ float Tval := 2.0) runs on BSSGP_ConnHdlr {
+ timer T := Tval;
+
+ if (not is_iu(ran_index)) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "GMM Service Request called on non-Iu RAN index");
+ }
+
+
+ f_send_l3(ts_GMM_SERVICE_REQ(service_type, p_tmsi := g_pars.p_tmsi), ran_index);
+
+ T.start;
+ alt {
+ [] as_service_request(ran_index) { setverdict(pass); }
+ [] BSSAP.receive { repeat; }
+ [] T.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Timeout completing the RAU procedure");
+ }
+ }
+}
+
type record PdpActPars {
BIT3 tid, /* L3 Transaction ID */
BIT4 nsapi, /* SNDCP NSAPI */
@@ -621,6 +674,9 @@
octetstring ggsn_ip_u, /* GGSN IP User */
OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
+ OCT4 rnc_tei_u, /* SGSN TEI User */
+ octetstring rnc_ip_u, /* SGSN IP USer */
+
OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
OCT4 sgsn_tei_u optional, /* SGSN TEI User */
octetstring sgsn_ip_c optional, /* SGSN IP Control */
@@ -634,33 +690,26 @@
apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
- f_gtp_register_teid(apars.ggsn_tei_c);
- f_gtp_register_teid(apars.ggsn_tei_u);
+ f_gtp_register_teid(apars.ggsn_tei_c, GTP_GGSN_IDX);
+ f_gtp_register_teid(apars.ggsn_tei_u, GTP_GGSN_IDX);
}
-function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false, integer ran_index := 0)
-runs on BSSGP_ConnHdlr {
+function f_process_gtp_ctx_upd_req(inout PdpActPars apars, PDU_GTPC gtpc, integer ran_index := 0) runs on BSSGP_ConnHdlr {
+ var UpdatePDPContextRequestSGSN upd := gtpc.gtpc_pdu.updatePDPContextRequest.updatePDPContextRequestSGSN;
+ if (ispresent(upd.teidControlPlane.teidControlPlane)) {
+ apars.sgsn_tei_c := upd.teidControlPlane.teidControlPlane;
+ }
+ apars.sgsn_tei_u := upd.teidDataI.teidDataI;
+ apars.sgsn_ip_c := upd.sgsn_addr_controlPlane.addressf;
+ apars.sgsn_ip_u := upd.sgsn_addr_traffic.addressf;
+ f_gtp_register_teid(apars.rnc_tei_u, ran2gtp_idx(ran_index));
+ /* TODO: If "Direct Tunnel" flag, update apars.rnc_{tei,ip}_u instead,
+ * and store "direct_tunnel" in ggsn state */
+}
+
+altstep as_pdp_ctx_act_gb(inout PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
var boolean exp_rej := ispresent(apars.exp_rej_cause);
- var Gtp1cUnitdata g_ud;
- var template Recovery_gtpc recovery := omit;
- if (send_recovery) {
- recovery := ts_Recovery(apars.ggsn_restart_ctr);
- }
-
- f_send_l3(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
- apars.apn, apars.pco), ran_index);
- GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
- f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
- var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
- GTP[GTP_GGSN_IDX].send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
- apars.sgsn_tei_c, apars.gtp_resp_cause,
- apars.ggsn_tei_c, apars.ggsn_tei_u,
- apars.nsapi,
- apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
- omit, recovery));
- }
- alt {
[exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause)) {
setverdict(pass);
}
@@ -680,6 +729,92 @@
setverdict(pass);
}
[] as_xid(apars, ran_index);
+}
+altstep as_pdp_ctx_act_iu(inout PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
+ var boolean exp_rej := ispresent(apars.exp_rej_cause);
+
+ [exp_rej] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause))) {
+ setverdict(pass);
+ }
+ [exp_rej] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_SM_ACT_PDP_ACCEPT)) {
+ setverdict(fail, "Unexpected PDP CTX ACT ACC");
+ mtc.stop;
+ }
+ [not exp_rej] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
+ setverdict(fail, "Unexpected PDP CTX ACT FAIL");
+ mtc.stop;
+ }
+ [not exp_rej] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
+ setverdict(fail, "Unexpected PDP CTX ACT FAIL");
+ mtc.stop;
+ }
+ [not exp_rej] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi))) {
+ setverdict(pass);
+ }
+}
+altstep as_pdp_ctx_act(inout PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
+ [is_gb(ran_index)] as_pdp_ctx_act_gb(apars, ran_index);
+ [is_iu(ran_index)] as_pdp_ctx_act_iu(apars, ran_index);
+}
+
+function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false, integer ran_index := 0, float Tval := 5.0)
+runs on BSSGP_ConnHdlr {
+ var Gtp1cUnitdata g_ud;
+ var template Recovery_gtpc recovery := omit;
+ timer T := Tval;
+
+ f_send_l3(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
+ apars.apn, apars.pco), ran_index);
+
+ if (send_recovery) {
+ recovery := ts_Recovery(apars.ggsn_restart_ctr);
+ }
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
+ f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
+ var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
+ apars.sgsn_tei_c, apars.gtp_resp_cause,
+ apars.ggsn_tei_c, apars.ggsn_tei_u,
+ apars.nsapi,
+ apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
+ omit, recovery));
+ }
+
+ T.start;
+ if (is_iu(ran_index)) {
+ var RANAP_PDU ranap;
+ alt {
+ [] BSSAP.receive(tr_RANAP_RabAssReq(?)) -> value ranap {
+ var RAB_ID rab_id := f_ranap_rab_ass_req_extract_rab_id(ranap);
+ var template (value) RAB_SetupOrModifiedList l;
+ l := ts_RAB_SMdL_ps(rab_id, oct2bit(apars.rnc_ip_u), apars.rnc_tei_u);
+ BSSAP.send(ts_RANAP_RabAssResp(l));
+
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, updatePDPContextRequest, ?)) -> value g_ud {
+ f_process_gtp_ctx_upd_req(apars, g_ud.gtpc, ran_index);
+ var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_UpdatePdpRespGGSN(g_ud.peer, seq_nr,
+ apars.sgsn_tei_c, apars.gtp_resp_cause,
+ apars.ggsn_tei_c, apars.ggsn_tei_u,
+ apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
+ omit, recovery));
+ }
+ }
+ [] T.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Timeout waiting for RANAP RAB AssReq");
+ }
+ }
+ }
+
+ alt {
+ [] as_pdp_ctx_act(apars, ran_index) { setverdict(pass); }
+ [is_gb(ran_index)] BSSGP[ran_index].receive { repeat; }
+ [is_iu(ran_index)] BSSAP.receive { repeat; }
+ [] T.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Timeout completing the PDP ACT");
+ }
}
}
@@ -691,15 +826,17 @@
f_send_l3(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit), ran_index);
GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
- BSSGP[ran_index].clear;
+ if (is_gb(ran_index)) {
+ BSSGP[ran_index].clear;
+ }
GTP[GTP_GGSN_IDX].send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
}
alt {
- [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
- setverdict(pass);
- }
- [] as_xid(apars, ran_index);
+ [is_gb(ran_index)] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid));
+ [is_gb(ran_index)] as_xid(apars, ran_index);
+ [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)));
}
+ setverdict(pass);
}
function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false, integer ran_index := 0)
@@ -720,7 +857,10 @@
T.start;
alt {
- [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
+ [is_gb(ran_index)] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
+ f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), ran_index);
+ }
+ [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), ran_index);
}
[not error_ind] GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
@@ -782,7 +922,8 @@
addressInfo := omit
}
-template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
+template (value) PdpActPars t_PdpActPars(charstring ggsn_ip,
+ charstring rnc_ip := "127.0.0.1") := {
tid := '000'B,
nsapi := '0101'B, /* < 5 are reserved */
sapi := '0011'B, /* 3/5/9/11 */
@@ -801,6 +942,9 @@
ggsn_ip_u := f_inet_addr(ggsn_ip),
ggsn_restart_ctr := int2oct(2, 1),
+ rnc_tei_u := f_rnd_octstring(4),
+ rnc_ip_u := f_inet_addr(rnc_ip),
+
sgsn_tei_c := omit,
sgsn_tei_u := omit,
sgsn_ip_c := omit,
@@ -863,40 +1007,52 @@
}
}
-/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
+/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> {Gb,Iu} */
function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload, integer ran_index := 0, boolean expect_fwd := true)
runs on BSSGP_ConnHdlr {
timer T := 5.0;
/* Send PDU via GTP from our simulated GGSN to the SGSN */
f_gtpu_send(apars, payload);
T.start;
- /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
+
alt {
- [] as_xid(apars, ran_index);
+ /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN: */
+ [is_gb(ran_index)] as_xid(apars, ran_index);
//[] BSSGP[ran_index].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
- [expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload));
- [expect_fwd] T.timeout {
- setverdict(fail, "Timeout waiting for GTP-U to appear on BSSGP");
- mtc.stop;
+ [is_gb(ran_index) and expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload));
+ [is_gb(ran_index) and not expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload)) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "GTP-U forwarded to BSSGP but not expected");
}
- [not expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload)) {
- setverdict(fail, "GTP-U forwarded to BSSGP but not expected")
- mtc.stop;
+ /* Expect PDU directly from RNC (Direct Tunnel): */
+ [is_iu(ran_index) and expect_fwd] GTP[ran2gtp_idx(ran_index)].receive(tr_GTPU_GPDU(valueof(ts_GtpPeerU(apars.ggsn_ip_u)), apars.rnc_tei_u, payload));
+ [is_iu(ran_index) and not expect_fwd] GTP[ran2gtp_idx(ran_index)].receive(tr_GTPU_GPDU(valueof(ts_GtpPeerU(apars.ggsn_ip_u)), apars.rnc_tei_u, payload)) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "GTP-U forwarded to BSSGP but not expected")
+ }
+ [expect_fwd] T.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for GTP-U to appear on Gb/Iu");
}
[not expect_fwd] T.timeout {}
}
}
-/* Transceive given 'payload' as MO message from Gb -> OsmoSGSN -> GTP */
+/* Transceive given 'payload' as MO message from {Gb,Iu} -> OsmoSGSN -> GTP */
function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload, integer ran_index := 0, uint9_t n_u := 0)
runs on BSSGP_ConnHdlr {
- /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
- var Gtp1uPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
- var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
- BSSGP[ran_index].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, n_u));
- /* Expect PDU via GTP from SGSN on simulated GGSN */
+ var Gtp1uPeer rx_peer;
+
+ if (is_gb(ran_index)) {
+ /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN: */
+ rx_peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
+ var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
+ BSSGP[ran_index].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, n_u));
+ } else if (is_iu(ran_index)) {
+ /* Send PDU via GTPv1U from simulated MS/RNC directly to the simulated GGSN: */
+ rx_peer := valueof(ts_GtpPeerU(apars.rnc_ip_u));
+ GTP[ran2gtp_idx(ran_index)].send(ts_GTP1U_GPDU(valueof(ts_GtpPeerU(apars.ggsn_ip_u)), 0 /*seq*/, apars.ggsn_tei_u, payload));
+ }
+ /* Expect PDU via GTP from RNC/SGSN on simulated GGSN */
alt {
- [] GTP[GTP_GGSN_IDX].receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPU_GPDU(rx_peer, apars.ggsn_tei_u, payload));
}
}
diff --git a/sgsn/SGSN_Tests_Iu.ttcn b/sgsn/SGSN_Tests_Iu.ttcn
index 84679cd..7ee4c51 100644
--- a/sgsn/SGSN_Tests_Iu.ttcn
+++ b/sgsn/SGSN_Tests_Iu.ttcn
@@ -23,7 +23,7 @@
}
private function f_TC_iu_attach(charstring id) runs on BSSGP_ConnHdlr {
- var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
+ var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip, mp_ranap_cfg[0].sctp_addr.local_ip_addr));
/* first perform regular attach */
f_gmm_attach(umts_aka_challenge := true, force_gsm_sres := false, ran_index := 3);
@@ -69,7 +69,7 @@
}
private function f_TC_iu_attach_geran_rau(charstring id) runs on BSSGP_ConnHdlr {
- var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
+ var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip, mp_ranap_cfg[0].sctp_addr.local_ip_addr));
/* first perform regular attach */
f_gmm_attach(umts_aka_challenge := true, force_gsm_sres := false, ran_index := 3);
@@ -95,7 +95,7 @@
}
private function f_TC_geran_attach_iu_rau(charstring id) runs on BSSGP_ConnHdlr {
- var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
+ var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip, mp_ranap_cfg[0].sctp_addr.local_ip_addr));
/* first perform regular attach */
f_gmm_attach(umts_aka_challenge := true, force_gsm_sres := false, ran_index := 0);
@@ -117,11 +117,38 @@
f_cleanup();
}
+private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
+ var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip, mp_ranap_cfg[0].sctp_addr.local_ip_addr));
+
+ /* first perform regular attach */
+ f_gmm_attach(umts_aka_challenge := true, force_gsm_sres := false, ran_index := 3);
+
+ f_service_request(ran_index := 3);
+
+ f_pdp_ctx_act(apars, ran_index := 3);
+
+ /* then transceive a downlink PDU */
+ f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 3);
+ f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 3);
+
+ f_pdp_ctx_deact_mo(apars, '00'O, ran_index := 3);
+ setverdict(pass);
+}
+testcase TC_attach_pdp_act_user() runs on test_CT {
+ var BSSGP_ConnHdlr vc_conn;
+ f_init();
+ f_sleep(1.0);
+ vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 1001);
+ vc_conn.done;
+ f_cleanup();
+}
+
control {
execute( TC_iu_attach() );
execute( TC_iu_attach_encr() );
execute( TC_iu_attach_geran_rau() );
execute( TC_geran_attach_iu_rau() );
+ execute( TC_attach_pdp_act_user() );
}
diff --git a/sgsn/expected-results.xml b/sgsn/expected-results.xml
index 4dde651..1e7367d 100644
--- a/sgsn/expected-results.xml
+++ b/sgsn/expected-results.xml
@@ -92,6 +92,7 @@
<testcase classname='SGSN_Tests_Iu' name='TC_iu_attach_encr' time='MASKED'/>
<testcase classname='SGSN_Tests_Iu' name='TC_iu_attach_geran_rau' time='MASKED'/>
<testcase classname='SGSN_Tests_Iu' name='TC_geran_attach_iu_rau' time='MASKED'/>
+ <testcase classname='SGSN_Tests_Iu' name='TC_attach_pdp_act_user' time='MASKED'/>
<!-- SGSN_Tests_NS (handle_sns == true) testcases start here -->
<testcase classname='SGSN_Tests_NS' name='TC_SNS_size' time='MASKED'/>
<testcase classname='SGSN_Tests_NS' name='TC_SNS_size_too_big' time='MASKED'/>
To view, visit change 37593. To unsubscribe, or for help writing mail filters, visit settings.