<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/14262">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sgsn: Add tests to check GTP retransmit queue<br><br>Change-Id: I3c4a3573482bb1fa1549c732a0f78c2d00eadd86<br>---<br>M sgsn/SGSN_Tests.ttcn<br>M sgsn/expected-results.xml<br>2 files changed, 121 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/62/14262/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn</span><br><span>index 5633183..1f63dfa 100644</span><br><span>--- a/sgsn/SGSN_Tests.ttcn</span><br><span>+++ b/sgsn/SGSN_Tests.ttcn</span><br><span>@@ -1536,6 +1536,123 @@</span><br><span>    vc_conn.done;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* ATTACH + PDP CTX ACT dropped + retrans */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_attach_pdp_act_deact_gtp_retrans(charstring id) runs on BSSGP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));</span><br><span style="color: hsl(120, 100%, 40%);">+    var Gtp1cUnitdata g_ud_first, g_ud_second;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* first perform regular attach */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_attach(id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* then activate PDP context on the Gb side */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     apars.apn, apars.pco), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}</span><br><span style="color: hsl(120, 100%, 40%);">+ log("First createPDPContextRequest received, dropping & waiting for retransmission");</span><br><span style="color: hsl(120, 100%, 40%);">+   GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (g_ud_first != g_ud_second) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "Retransmitted GTP message createPDPContextRequest is different from original one!");</span><br><span style="color: hsl(120, 100%, 40%);">+                      mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_process_gtp_ctx_act_req(apars, g_ud_second.gtpc);</span><br><span style="color: hsl(120, 100%, 40%);">+           var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);</span><br><span style="color: hsl(120, 100%, 40%);">+              GTP.send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              apars.sgsn_tei_c, apars.gtp_resp_cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               apars.ggsn_tei_c, apars.ggsn_tei_u,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           apars.nsapi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               omit, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Now the same with Deact */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, '00'O, false, omit), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}</span><br><span style="color: hsl(120, 100%, 40%);">+  log("First deletePDPContextRequest received, dropping & waiting for retransmission");</span><br><span style="color: hsl(120, 100%, 40%);">+   GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (g_ud_first != g_ud_second) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "Retransmitted GTP message deletePDPContextRequest is different from original one!");</span><br><span style="color: hsl(120, 100%, 40%);">+                      mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);</span><br><span style="color: hsl(120, 100%, 40%);">+              BSSGP[0].clear;</span><br><span style="color: hsl(120, 100%, 40%);">+               GTP.send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_xid(apars, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_attach_pdp_act_deact_gtp_retrans() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans), testcasename(), g_gb, 27);</span><br><span style="color: hsl(120, 100%, 40%);">+  vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test that SGSN GTP response retransmit queue works fine */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_attach_pdp_act_deact_gtp_retrans_resp(charstring id) runs on BSSGP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));</span><br><span style="color: hsl(120, 100%, 40%);">+    var integer seq_nr := 23;</span><br><span style="color: hsl(120, 100%, 40%);">+     var Gtp1cUnitdata g_ud_first, g_ud_second;</span><br><span style="color: hsl(120, 100%, 40%);">+    var template Gtp1cUnitdata g_delete_req;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* first perform regular attach + PDP context act */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_TC_attach(id);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_pdp_ctx_act(apars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Now perform an MT DeleteCtxReq and emulate GGSN didn't receive response and sends a duplicated DeleteCtxReq */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP[0].clear;</span><br><span style="color: hsl(120, 100%, 40%);">+       var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));</span><br><span style="color: hsl(120, 100%, 40%);">+    g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP.send(g_delete_req);</span><br><span style="color: hsl(120, 100%, 40%);">+       alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_xid(apars, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (g_ud_first.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != '80'O) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "Received deletePDPContextResponse cause is not 'Request accepted'");</span><br><span style="color: hsl(120, 100%, 40%);">+                      mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Send duplicate DeleteCtxReq */</span><br><span style="color: hsl(120, 100%, 40%);">+     log("First deletePDPContextResponse received, dropping & retransmitting retransmission of deletePDPContextRequest");</span><br><span style="color: hsl(120, 100%, 40%);">+    GTP.send(g_delete_req);</span><br><span style="color: hsl(120, 100%, 40%);">+       GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (g_ud_first != g_ud_second) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "Retransmitted GTP message deletePDPContextResponse is different from original one!");</span><br><span style="color: hsl(120, 100%, 40%);">+                     mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Let's send now a new DeleteCtxReq (increased seq_nr) to make sure it</span><br><span style="color: hsl(120, 100%, 40%);">+    * is handled differently by SGSN (expect "non-existent" cause) */</span><br><span style="color: hsl(120, 100%, 40%);">+  g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr + 1, apars.sgsn_tei_c, apars.nsapi, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+     GTP.send(g_delete_req);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Response with cause "non-existent" must be sent with TEID 0 according to specs */</span><br><span style="color: hsl(120, 100%, 40%);">+        GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (g_ud_second.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != 'C0'O) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Received deletePDPContextResponse cause is not 'Non-existent'");</span><br><span style="color: hsl(120, 100%, 40%);">+                  mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_attach_pdp_act_deact_gtp_retrans_resp() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans_resp), testcasename(), g_gb, 28);</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {</span><br><span>       /* MS: perform regular attach */</span><br><span>     f_TC_attach(id);</span><br><span>@@ -2369,6 +2486,8 @@</span><br><span>     execute( TC_attach_restart_ctr_echo() );</span><br><span>     execute( TC_attach_restart_ctr_create() );</span><br><span>   execute( TC_attach_pdp_act_deact_mt_t3395_expire() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_attach_pdp_act_deact_gtp_retrans() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_attach_pdp_act_deact_gtp_retrans_resp() );</span><br><span>       execute( TC_attach_pdp_act_user_error_ind_ggsn() );</span><br><span>  execute( TC_attach_pdp_act_gmm_detach() );</span><br><span>   execute( TC_attach_gmm_attach_req_while_gmm_attach() );</span><br><span>diff --git a/sgsn/expected-results.xml b/sgsn/expected-results.xml</span><br><span>index b53a6f3..0b477d1 100644</span><br><span>--- a/sgsn/expected-results.xml</span><br><span>+++ b/sgsn/expected-results.xml</span><br><span>@@ -56,6 +56,8 @@</span><br><span>   <testcase classname='SGSN_Tests' name='TC_attach_restart_ctr_echo' time='MASKED'/></span><br><span>   <testcase classname='SGSN_Tests' name='TC_attach_restart_ctr_create' time='MASKED'/></span><br><span>   <testcase classname='SGSN_Tests' name='TC_attach_pdp_act_deact_mt_t3395_expire' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='SGSN_Tests' name='TC_attach_pdp_act_deact_gtp_retrans' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='SGSN_Tests' name='TC_attach_pdp_act_deact_gtp_retrans_resp' time='MASKED'/></span><br><span>   <testcase classname='SGSN_Tests' name='TC_attach_pdp_act_user_error_ind_ggsn' time='MASKED'/></span><br><span>   <testcase classname='SGSN_Tests' name='TC_attach_gmm_attach_req_while_gmm_attach' time='MASKED'/></span><br><span> </testsuite></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14262">change 14262</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/14262"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I3c4a3573482bb1fa1549c732a0f78c2d00eadd86 </div>
<div style="display:none"> Gerrit-Change-Number: 14262 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>