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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Pass paging group instead of imsi where later is not needed<br><br>Change-Id: Id0663a81f439f2d0b893b0d34f85a6db1927ef8e<br>---<br>M src/bts.cpp<br>M src/bts.h<br>M src/gprs_bssgp_pcu.cpp<br>M src/gprs_rlcmac.cpp<br>M src/gprs_rlcmac.h<br>M src/pcu_l1_if.cpp<br>M src/pcu_l1_if.h<br>M src/tbf.cpp<br>M src/tbf_dl.cpp<br>9 files changed, 54 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/bts.cpp b/src/bts.cpp</span><br><span>index 71a2f06..5e1725c 100644</span><br><span>--- a/src/bts.cpp</span><br><span>+++ b/src/bts.cpp</span><br><span>@@ -890,7 +890,7 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void BTS::snd_dl_ass(gprs_rlcmac_tbf *tbf, bool poll, const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+void BTS::snd_dl_ass(gprs_rlcmac_tbf *tbf, bool poll, uint16_t pgroup)</span><br><span> {</span><br><span>       int plen;</span><br><span>    unsigned int ts = tbf->first_ts;</span><br><span>@@ -910,7 +910,7 @@</span><br><span>                                                GSM_L1_BURST_TYPE_ACCESS_0);</span><br><span>     if (plen >= 0) {</span><br><span>          immediate_assignment_dl_tbf();</span><br><span style="color: hsl(0, 100%, 40%);">-          pcu_l1if_tx_pch(immediate_assignment, plen, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+            pcu_l1if_tx_pch(immediate_assignment, plen, pgroup);</span><br><span>         }</span><br><span> </span><br><span>        bitvec_free(immediate_assignment);</span><br><span>diff --git a/src/bts.h b/src/bts.h</span><br><span>index 0eaab85..823138b 100644</span><br><span>--- a/src/bts.h</span><br><span>+++ b/src/bts.h</span><br><span>@@ -306,7 +306,7 @@</span><br><span>            enum ph_burst_type burst_type);</span><br><span>      int rcv_ptcch_rach(uint8_t trx_nr, uint8_t ts_nr, uint32_t fn, int16_t qta);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        void snd_dl_ass(gprs_rlcmac_tbf *tbf, bool poll, const char *imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+   void snd_dl_ass(gprs_rlcmac_tbf *tbf, bool poll, uint16_t pgroup);</span><br><span> </span><br><span>       GprsMsStorage &ms_store();</span><br><span>       GprsMs *ms_by_tlli(uint32_t tlli, uint32_t old_tlli = 0);</span><br><span>diff --git a/src/gprs_bssgp_pcu.cpp b/src/gprs_bssgp_pcu.cpp</span><br><span>index 6435d99..54927f5 100644</span><br><span>--- a/src/gprs_bssgp_pcu.cpp</span><br><span>+++ b/src/gprs_bssgp_pcu.cpp</span><br><span>@@ -174,6 +174,7 @@</span><br><span> static int gprs_bssgp_pcu_rx_paging_ps(struct msgb *msg, struct tlv_parsed *tp)</span><br><span> {</span><br><span>         char imsi[16];</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t pgroup;</span><br><span>     uint8_t *ptmsi = (uint8_t *) TLVP_VAL(tp, BSSGP_IE_TMSI);</span><br><span>    uint16_t ptmsi_len = TLVP_LEN(tp, BSSGP_IE_TMSI);</span><br><span>    int rc;</span><br><span>@@ -195,10 +196,15 @@</span><br><span>                                                  TLVP_LEN(tp, BSSGP_IE_IMSI));</span><br><span>    if (rc != GSM23003_IMSI_MAX_DIGITS + 1) {</span><br><span>            LOGP(DBSSGP, LOGL_NOTICE, "Failed to parse IMSI IE (rc=%d)\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-           return bssgp_tx_status(BSSGP_CAUSE_COND_IE_ERR, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+           return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     pgroup = imsi2paging_group(imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (pgroup > 999) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DBSSGP, LOGL_NOTICE, "Failed to compute IMSI %s paging group\n", imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return gprs_rlcmac_paging_request(ptmsi, ptmsi_len, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    return gprs_rlcmac_paging_request(ptmsi, ptmsi_len, pgroup);</span><br><span> }</span><br><span> </span><br><span> /* Receive a BSSGP PDU from a BSS on a PTP BVCI */</span><br><span>diff --git a/src/gprs_rlcmac.cpp b/src/gprs_rlcmac.cpp</span><br><span>index e381b11..cbfc87f 100644</span><br><span>--- a/src/gprs_rlcmac.cpp</span><br><span>+++ b/src/gprs_rlcmac.cpp</span><br><span>@@ -29,13 +29,13 @@</span><br><span> extern void *tall_pcu_ctx;</span><br><span> </span><br><span> int gprs_rlcmac_paging_request(uint8_t *ptmsi, uint16_t ptmsi_len,</span><br><span style="color: hsl(0, 100%, 40%);">-      const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+                            uint16_t pgroup)</span><br><span> {</span><br><span>         LOGP(DRLCMAC, LOGL_NOTICE, "TX: [PCU -> BTS] Paging Request (CCCH)\n");</span><br><span>         bitvec *paging_request = bitvec_alloc(22, tall_pcu_ctx);</span><br><span>     bitvec_unhex(paging_request, DUMMY_VEC);</span><br><span>     int plen = Encoding::write_paging_request(paging_request, ptmsi, ptmsi_len);</span><br><span style="color: hsl(0, 100%, 40%);">-    pcu_l1if_tx_pch(paging_request, plen, (char *)imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+  pcu_l1if_tx_pch(paging_request, plen, pgroup);</span><br><span>       bitvec_free(paging_request);</span><br><span> </span><br><span>     return 0;</span><br><span>diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h</span><br><span>index 5361a1c..6f3418c 100644</span><br><span>--- a/src/gprs_rlcmac.h</span><br><span>+++ b/src/gprs_rlcmac.h</span><br><span>@@ -26,6 +26,7 @@</span><br><span> #ifdef __cplusplus</span><br><span> #include <gsm_rlcmac.h></span><br><span> #include <gsm_timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <pcu_l1_if.h></span><br><span> </span><br><span> extern "C" {</span><br><span> #include <osmocom/core/linuxlist.h></span><br><span>@@ -92,8 +93,7 @@</span><br><span> </span><br><span> int gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int gprs_rlcmac_paging_request(uint8_t *ptmsi, uint16_t ptmsi_len,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_rlcmac_paging_request(uint8_t *ptmsi, uint16_t ptmsi_len, uint16_t pgroup);</span><br><span> </span><br><span> struct msgb *gprs_rlcmac_app_info_msg(const struct gsm_pcu_if_app_info_req *req);</span><br><span> </span><br><span>diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp</span><br><span>index bac0e56..1f23c25 100644</span><br><span>--- a/src/pcu_l1_if.cpp</span><br><span>+++ b/src/pcu_l1_if.cpp</span><br><span>@@ -60,6 +60,28 @@</span><br><span> </span><br><span> extern void *tall_pcu_ctx;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define PAGING_GROUP_LEN 3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* returns [0,999] on success, > 999 on error */</span><br><span style="color: hsl(120, 100%, 40%);">+uint16_t imsi2paging_group(const char* imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t pgroup = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  size_t len = strlen(imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!imsi || len < PAGING_GROUP_LEN)</span><br><span style="color: hsl(120, 100%, 40%);">+               return 0xFFFF;</span><br><span style="color: hsl(120, 100%, 40%);">+        imsi += len - PAGING_GROUP_LEN;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     while (*imsi != '\0') {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!isdigit(*imsi))</span><br><span style="color: hsl(120, 100%, 40%);">+                  return 0xFFFF;</span><br><span style="color: hsl(120, 100%, 40%);">+                pgroup *= 10;</span><br><span style="color: hsl(120, 100%, 40%);">+         pgroup += *imsi - '0';</span><br><span style="color: hsl(120, 100%, 40%);">+                imsi++;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     return pgroup;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span>  * PCU messages</span><br><span>  */</span><br><span>@@ -218,19 +240,18 @@</span><br><span>  pcu_tx_data_req(0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, GSM_MACBLOCK_LEN);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define PAGING_GROUP_LEN 3</span><br><span style="color: hsl(0, 100%, 40%);">-void pcu_l1if_tx_pch(bitvec * block, int plen, const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_l1if_tx_pch(bitvec * block, int plen, uint16_t pgroup)</span><br><span> {</span><br><span>   struct gprs_rlcmac_bts *bts = bts_main_data();</span><br><span>       uint8_t data[PAGING_GROUP_LEN + GSM_MACBLOCK_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+    int i;</span><br><span> </span><br><span>   /* prepend paging group */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!imsi || strlen(imsi) < PAGING_GROUP_LEN)</span><br><span style="color: hsl(0, 100%, 40%);">-                return;</span><br><span style="color: hsl(0, 100%, 40%);">- imsi += strlen(imsi) - PAGING_GROUP_LEN;</span><br><span style="color: hsl(0, 100%, 40%);">-        data[0] = imsi[0];</span><br><span style="color: hsl(0, 100%, 40%);">-      data[1] = imsi[1];</span><br><span style="color: hsl(0, 100%, 40%);">-      data[2] = imsi[2];</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < PAGING_GROUP_LEN; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           data[PAGING_GROUP_LEN - 1 - i] = '0' + (char)(pgroup % 10);</span><br><span style="color: hsl(120, 100%, 40%);">+           pgroup = pgroup / 10;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(pgroup == 0);</span><br><span> </span><br><span>        /* block provided by upper layer comes without first byte (plen),</span><br><span>     * prepend it manually:</span><br><span>diff --git a/src/pcu_l1_if.h b/src/pcu_l1_if.h</span><br><span>index a77a6c8..35643da 100644</span><br><span>--- a/src/pcu_l1_if.h</span><br><span>+++ b/src/pcu_l1_if.h</span><br><span>@@ -159,7 +159,7 @@</span><br><span>                      uint8_t *data, size_t data_len);</span><br><span> void pcu_l1if_tx_agch(bitvec * block, int len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void pcu_l1if_tx_pch(bitvec * block, int plen, const char *imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_l1if_tx_pch(bitvec * block, int plen, uint16_t pgroup);</span><br><span> </span><br><span> int pcu_tx_txt_ind(enum gsm_pcu_if_text_type t, const char *fmt, ...);</span><br><span> </span><br><span>@@ -184,7 +184,7 @@</span><br><span> </span><br><span> void pcu_rx_block_time(uint16_t arfcn, uint32_t fn, uint8_t ts_no);</span><br><span> void pcu_rx_ra_time(uint16_t arfcn, uint32_t fn, uint8_t ts_no);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+uint16_t imsi2paging_group(const char* imsi);</span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span> #endif</span><br><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index 389b186..61d8d58 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -803,6 +803,7 @@</span><br><span> </span><br><span> void gprs_rlcmac_tbf::poll_timeout()</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t pgroup;</span><br><span>     gprs_rlcmac_ul_tbf *ul_tbf = as_ul_tbf(this);</span><br><span> </span><br><span>    LOGPTBF(this, LOGL_NOTICE, "poll timeout for FN=%d, TS=%d (curr FN %d)\n",</span><br><span>@@ -902,7 +903,9 @@</span><br><span>                   LOGPTBF(dl_tbf, LOGL_DEBUG, "Re-send dowlink assignment on PCH (IMSI=%s)\n",</span><br><span>                               imsi());</span><br><span>                     /* send immediate assignment */</span><br><span style="color: hsl(0, 100%, 40%);">-                 dl_tbf->bts->snd_dl_ass(dl_tbf, false, imsi());</span><br><span style="color: hsl(120, 100%, 40%);">+                 if ((pgroup = imsi2paging_group(imsi())) > 999)</span><br><span style="color: hsl(120, 100%, 40%);">+                            LOGPTBF(dl_tbf, LOGL_ERROR, "IMSI to paging group failed! (%s)\n", imsi());</span><br><span style="color: hsl(120, 100%, 40%);">+                 dl_tbf->bts->snd_dl_ass(dl_tbf, false, pgroup);</span><br><span>                        dl_tbf->m_wait_confirm = 1;</span><br><span>               }</span><br><span>    } else</span><br><span>diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp</span><br><span>index e3c1ff4..7113d65 100644</span><br><span>--- a/src/tbf_dl.cpp</span><br><span>+++ b/src/tbf_dl.cpp</span><br><span>@@ -507,6 +507,7 @@</span><br><span> /* depending on the current TBF, we assign on PACCH or AGCH */</span><br><span> void gprs_rlcmac_dl_tbf::trigger_ass(struct gprs_rlcmac_tbf *old_tbf)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t pgroup;</span><br><span>     /* stop pending timer */</span><br><span>     stop_timers("assignment (DL-TBF)");</span><br><span> </span><br><span>@@ -530,7 +531,9 @@</span><br><span>              TBF_SET_ASS_ON(this, GPRS_RLCMAC_FLAG_CCCH, false);</span><br><span> </span><br><span>              /* send immediate assignment */</span><br><span style="color: hsl(0, 100%, 40%);">-         bts->snd_dl_ass(this, false, imsi());</span><br><span style="color: hsl(120, 100%, 40%);">+              if ((pgroup = imsi2paging_group(imsi())) > 999)</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGPTBFDL(this, LOGL_ERROR, "IMSI to paging group failed! (%s)\n", imsi());</span><br><span style="color: hsl(120, 100%, 40%);">+         bts->snd_dl_ass(this, false, pgroup);</span><br><span>             m_wait_confirm = 1;</span><br><span>  }</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/16672">change 16672</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-pcu/+/16672"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id0663a81f439f2d0b893b0d34f85a6db1927ef8e </div>
<div style="display:none"> Gerrit-Change-Number: 16672 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </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>