<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21007">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">GPRS_Components: generalize both f_pkt_paging_match_{imsi,tmsi}()<br><br>Change-Id: Ie0578fa299cdac18e942350b2e879839c9bd9dba<br>---<br>M pcu/GPRS_Components.ttcn<br>M pcu/PCU_Tests.ttcn<br>2 files changed, 62 insertions(+), 37 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pcu/GPRS_Components.ttcn b/pcu/GPRS_Components.ttcn</span><br><span>index d6abf6d..7364476 100644</span><br><span>--- a/pcu/GPRS_Components.ttcn</span><br><span>+++ b/pcu/GPRS_Components.ttcn</span><br><span>@@ -934,8 +934,10 @@</span><br><span>    return f_rrbp_ack_fn(dl_fn, rrbp);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_pkt_paging_match_tmsi(in PacketPagingReq req, template GsmTmsi tmsi)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on MS_BTS_IFACE_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+/* Return true if a given Packet Paging Request contains the given IMSI, false otherwise */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_pkt_paging_match_imsi(in PacketPagingReq req, template hexstring imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                            boolean cs_domain := true, boolean ps_domain := true)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return boolean {</span><br><span>     if (not ispresent(req.repeated_pageinfo)) {</span><br><span>          setverdict(fail, "Packet Paging Request without MIs?!?");</span><br><span>          f_shutdown(__BFILE__, __LINE__);</span><br><span>@@ -943,18 +945,57 @@</span><br><span> </span><br><span>         for (var integer i := 0; i < lengthof(req.repeated_pageinfo); i := i + 1) {</span><br><span>               var PageInfo info := req.repeated_pageinfo[i].item;</span><br><span style="color: hsl(0, 100%, 40%);">-             if (not ischosen(info.cs))</span><br><span style="color: hsl(0, 100%, 40%);">-                      { continue; }</span><br><span style="color: hsl(120, 100%, 40%);">+         var MobileIdentityLV_Paging mi_lv;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          if (match(info.cs.tmsi, tmsi)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-                       return;</span><br><span style="color: hsl(120, 100%, 40%);">+               if (ischosen(info.cs)) { /* CS domain */</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (not ispresent(info.cs.mobile_identity))</span><br><span style="color: hsl(120, 100%, 40%);">+                           { continue; }</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (not cs_domain)</span><br><span style="color: hsl(120, 100%, 40%);">+                            { continue; }</span><br><span style="color: hsl(120, 100%, 40%);">+                 mi_lv := info.cs.mobile_identity;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else { /* PS domain */</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (not ispresent(info.ps.mobile_identity))</span><br><span style="color: hsl(120, 100%, 40%);">+                           { continue; }</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (not ps_domain)</span><br><span style="color: hsl(120, 100%, 40%);">+                            { continue; }</span><br><span style="color: hsl(120, 100%, 40%);">+                 mi_lv := info.ps.mobile_identity;</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%);">+           /* Make sure MI contains IMSI before referencing it */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (match(mi_lv.mobile_id, decmatch tr_MI_IMSI(imsi))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return true;</span><br><span>                 }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   setverdict(fail, "Mobile Identity (TMSI/P-TMSI) ", tmsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                 " is not present in ", req.repeated_pageinfo);</span><br><span style="color: hsl(0, 100%, 40%);">-     f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+      return false;</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%);">+/* Return true if a given Packet Paging Request contains the given P-TMSI, false otherwise */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_pkt_paging_match_tmsi(in PacketPagingReq req, template GsmTmsi tmsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                             boolean cs_domain := true, boolean ps_domain := true)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (not ispresent(req.repeated_pageinfo)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Packet Paging Request without MIs?!?");</span><br><span style="color: hsl(120, 100%, 40%);">+           f_shutdown(__BFILE__, __LINE__);</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%);">+   for (var integer i := 0; i < lengthof(req.repeated_pageinfo); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var PageInfo info := req.repeated_pageinfo[i].item;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         if (cs_domain and ischosen(info.cs)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (not ispresent(info.cs.tmsi))</span><br><span style="color: hsl(120, 100%, 40%);">+                              { continue; }</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (match(info.cs.tmsi, tmsi))</span><br><span style="color: hsl(120, 100%, 40%);">+                                { return true; }</span><br><span style="color: hsl(120, 100%, 40%);">+              } else if (ps_domain) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (not ispresent(info.ps.ptmsi))</span><br><span style="color: hsl(120, 100%, 40%);">+                             { continue; }</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (match(info.ps.ptmsi, tmsi))</span><br><span style="color: hsl(120, 100%, 40%);">+                               { return true; }</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%);">+   return false;</span><br><span> }</span><br><span> </span><br><span> }</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index dffbc4d..5e61d85 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -1700,30 +1700,6 @@</span><br><span>    f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pkt_paging_match_imsi(in PacketPagingReq req, hexstring imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       var PageInfo info := req.repeated_pageinfo[0].item;</span><br><span style="color: hsl(0, 100%, 40%);">-     var MobileIdentityLV_Paging mi_lv := info.cs.mobile_identity;</span><br><span style="color: hsl(0, 100%, 40%);">-   var MobileIdentityV mi := dec_MobileIdentityV(mi_lv.mobile_id);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (mi_lv.len != 8) { /* 8 octets: type of ID (3 bits) + even/odd flag (1 bit) + 15 BCD-encoded digits (60 bits) */</span><br><span style="color: hsl(0, 100%, 40%);">-             setverdict(fail, "Mobile Identity length mismatch: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                    "expected: 8, got: ", mi_lv.len);</span><br><span style="color: hsl(0, 100%, 40%);">-          f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Make sure MI contains IMSI before referencing it */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mi.typeOfIdentity != '001'B) {</span><br><span style="color: hsl(0, 100%, 40%);">-              setverdict(fail, "Mobile Identity must be of type IMSI ('001'B), ",</span><br><span style="color: hsl(0, 100%, 40%);">-                      "got: ", mi.typeOfIdentity);</span><br><span style="color: hsl(0, 100%, 40%);">-               f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (mi.oddEvenInd_identity.imsi.digits != imsi) {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(fail, "Mobile Identity contains unexpected IMSI, ",</span><br><span style="color: hsl(0, 100%, 40%);">-                           "expected: ", imsi, " got: ", mi.oddEvenInd_identity.imsi.digits);</span><br><span style="color: hsl(0, 100%, 40%);">-               f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Test CS paging over the BTS<->PCU socket.</span><br><span>  * When a (class B or C, not A) MS has an active TBF (or is on the PDCH), the MS can not react on CS paging over CCCH.</span><br><span>  * Paging should be send on the PACCH.</span><br><span>@@ -1766,7 +1742,10 @@</span><br><span>        f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);</span><br><span> </span><br><span>  /* Make sure that Packet Paging Request contains the same IMSI */</span><br><span style="color: hsl(0, 100%, 40%);">-       f_pkt_paging_match_imsi(dl_block.ctrl.payload.u.paging, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+        var PacketPagingReq req := dl_block.ctrl.payload.u.paging;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span>@@ -1808,10 +1787,15 @@</span><br><span>       f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);</span><br><span> </span><br><span>  /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+      var PacketPagingReq req := dl_block.ctrl.payload.u.paging;</span><br><span>   if (use_ptmsi) {</span><br><span style="color: hsl(0, 100%, 40%);">-                f_pkt_paging_match_tmsi(dl_block.ctrl.payload.u.paging, tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span>    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                f_pkt_paging_match_imsi(dl_block.ctrl.payload.u.paging, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>    }</span><br><span> </span><br><span>        f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21007">change 21007</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/c/osmo-ttcn3-hacks/+/21007"/><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-Change-Id: Ie0578fa299cdac18e942350b2e879839c9bd9dba </div>
<div style="display:none"> Gerrit-Change-Number: 21007 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>