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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">paging: pass struct osmo_mobile_identity, not encoded IE bytes<br><br>In get_paging_mi(), before this, an encoded buffer of Mobile Identity bytes is<br>returned. Code paths following this repeatedly decode the Mobile Identity<br>bytes, e.g. for logging. Also, in get_paging_mi(), since the TMSI is read in<br>from a different encoding than a typical Mobile Identity IE, the TMSI was<br>manually encoded into a typical Mobile Identity IE. This is essentially a code<br>dup of osmo_mobile_identity_encode(). Stop this madness.<br><br>Instead, in get_paging_mi(), return a decoded struct osmo_mobile_identity. Code<br>paths after this use the struct osmo_mobile_identity directly without repeated<br>decoding.<br><br>At the point of finally needing an encoded Mobile Identity IE (in<br>Encoding::write_paging_request()), do a proper osmo_mobile_identity_encode().<br><br>Since this may return errors, add an rc check for the caller of<br>write_paging_request(), gprs_rlcmac_paging_request().<br><br>A side effect is stricter validation of the Mobile Identity passing through the<br>Paging code path. Before, invalid MI might have passed through unnoticed.<br><br>Change-Id: Iad845acb0096b75dc453105c9c16b2252879b4ca<br>---<br>M src/bts.cpp<br>M src/bts.h<br>M src/encoding.cpp<br>M src/encoding.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/pdch.cpp<br>M src/pdch.h<br>10 files changed, 58 insertions(+), 40 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 c415dd4..76ca1b0 100644</span><br><span>--- a/src/bts.cpp</span><br><span>+++ b/src/bts.cpp</span><br><span>@@ -355,7 +355,7 @@</span><br><span>        m_pollController.expireTimedout(fn, max_delay);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int BTS::add_paging(uint8_t chan_needed, const uint8_t *mi, uint8_t mi_len)</span><br><span style="color: hsl(120, 100%, 40%);">+int BTS::add_paging(uint8_t chan_needed, const struct osmo_mobile_identity *mi)</span><br><span> {</span><br><span>    uint8_t l, trx, ts, any_tbf = 0;</span><br><span>     struct gprs_rlcmac_tbf *tbf;</span><br><span>@@ -370,10 +370,8 @@</span><br><span>  };</span><br><span> </span><br><span>       if (log_check_level(DRLCMAC, LOGL_INFO)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              struct osmo_mobile_identity omi = {};</span><br><span>                char str[64];</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_mobile_identity_decode(&omi, mi, mi_len, true);</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_mobile_identity_to_str_buf(str, sizeof(str), &omi);</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_mobile_identity_to_str_buf(str, sizeof(str), mi);</span><br><span>               LOGP(DRLCMAC, LOGL_INFO, "Add RR paging: chan-needed=%d MI=%s\n", chan_needed, str);</span><br><span>       }</span><br><span> </span><br><span>@@ -419,7 +417,7 @@</span><br><span>          for (ts = 0; ts < 8; ts++) {</span><br><span>                      if ((slot_mask[trx] & (1 << ts))) {</span><br><span>                                /* schedule */</span><br><span style="color: hsl(0, 100%, 40%);">-                          if (!m_bts.trx[trx].pdch[ts].add_paging(chan_needed, mi, mi_len))</span><br><span style="color: hsl(120, 100%, 40%);">+                             if (!m_bts.trx[trx].pdch[ts].add_paging(chan_needed, mi))</span><br><span>                                    return -ENOMEM;</span><br><span> </span><br><span>                          LOGP(DRLCMAC, LOGL_INFO, "Paging on PACCH of TRX=%d TS=%d\n", trx, ts);</span><br><span>diff --git a/src/bts.h b/src/bts.h</span><br><span>index edccc28..5a1b162 100644</span><br><span>--- a/src/bts.h</span><br><span>+++ b/src/bts.h</span><br><span>@@ -309,7 +309,7 @@</span><br><span>     int current_frame_number() const;</span><br><span> </span><br><span>        /** add paging to paging queue(s) */</span><br><span style="color: hsl(0, 100%, 40%);">-    int add_paging(uint8_t chan_needed, const uint8_t *mi, uint8_t mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+       int add_paging(uint8_t chan_needed, const struct osmo_mobile_identity *mi);</span><br><span> </span><br><span>      gprs_rlcmac_dl_tbf *dl_tbf_by_poll_fn(uint32_t fn, uint8_t trx, uint8_t ts);</span><br><span>         gprs_rlcmac_ul_tbf *ul_tbf_by_poll_fn(uint32_t fn, uint8_t trx, uint8_t ts);</span><br><span>diff --git a/src/encoding.cpp b/src/encoding.cpp</span><br><span>index 9dfd7c9..881dc61 100644</span><br><span>--- a/src/encoding.cpp</span><br><span>+++ b/src/encoding.cpp</span><br><span>@@ -30,6 +30,7 @@</span><br><span> extern "C" {</span><br><span> #include <osmocom/gprs/protocol/gsm_04_60.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm48.h></span><br><span> }</span><br><span> </span><br><span> #include <stdbool.h></span><br><span>@@ -720,8 +721,10 @@</span><br><span> }</span><br><span> </span><br><span> /* Generate paging request. See 44.018, sections 10 and 9.1.22 */</span><br><span style="color: hsl(0, 100%, 40%);">-int Encoding::write_paging_request(bitvec * dest, const uint8_t *mi, uint8_t mi_len)</span><br><span style="color: hsl(120, 100%, 40%);">+int Encoding::write_paging_request(bitvec * dest, const struct osmo_mobile_identity *mi)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t mi_buf[GSM48_MID_MAX_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+   int mi_len;</span><br><span>  unsigned wp = 0;</span><br><span>     int plen;</span><br><span> </span><br><span>@@ -732,8 +735,11 @@</span><br><span>         bitvec_write_field(dest, &wp,0x0,4);  // Page Mode</span><br><span>       bitvec_write_field(dest, &wp,0x0,4);  // Channel Needed</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       mi_len = osmo_mobile_identity_encode_buf(mi_buf, sizeof(mi_buf), mi, true);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (mi_len <= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return mi_len;</span><br><span>       bitvec_write_field(dest, &wp, mi_len, 8);  // Mobile Identity length</span><br><span style="color: hsl(0, 100%, 40%);">-        bitvec_set_bytes(dest, mi, mi_len);        // Mobile Identity</span><br><span style="color: hsl(120, 100%, 40%);">+ bitvec_set_bytes(dest, mi_buf, mi_len);    // Mobile Identity</span><br><span>        wp += mi_len * 8;</span><br><span> </span><br><span>        OSMO_ASSERT(wp % 8 == 0);</span><br><span>diff --git a/src/encoding.h b/src/encoding.h</span><br><span>index 5bdd4ef..2f6b273 100644</span><br><span>--- a/src/encoding.h</span><br><span>+++ b/src/encoding.h</span><br><span>@@ -78,7 +78,7 @@</span><br><span>                   bitvec * dest, struct gprs_rlcmac_ul_tbf *tbf, bool is_final,</span><br><span>                        uint8_t rrbp);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      static int write_paging_request(bitvec * dest, const uint8_t *mi, uint8_t mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+    static int write_paging_request(bitvec * dest, const struct osmo_mobile_identity *mi);</span><br><span> </span><br><span>   static unsigned write_repeated_page_info(bitvec * dest, unsigned& wp, uint8_t len,</span><br><span>                       uint8_t *identity, uint8_t chan_needed);</span><br><span>diff --git a/src/gprs_bssgp_pcu.cpp b/src/gprs_bssgp_pcu.cpp</span><br><span>index a46852a..14d1a9d 100644</span><br><span>--- a/src/gprs_bssgp_pcu.cpp</span><br><span>+++ b/src/gprs_bssgp_pcu.cpp</span><br><span>@@ -171,11 +171,8 @@</span><br><span> }</span><br><span> </span><br><span> /* Returns 0 on success, suggested BSSGP cause otherwise */</span><br><span style="color: hsl(0, 100%, 40%);">-static unsigned int get_paging_mi(const uint8_t **mi, uint8_t *mi_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                                const struct tlv_parsed *tp)</span><br><span style="color: hsl(120, 100%, 40%);">+static unsigned int get_paging_mi(struct osmo_mobile_identity *mi, const struct tlv_parsed *tp)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    static uint8_t tmsi_buf[GSM48_TMSI_LEN];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     /* Use TMSI (if present) or IMSI */</span><br><span>  if (TLVP_PRESENT(tp, BSSGP_IE_TMSI)) {</span><br><span>               /* Be safe against an evil SGSN - check the length */</span><br><span>@@ -185,14 +182,17 @@</span><br><span>                }</span><br><span> </span><br><span>                /* NOTE: TMSI (unlike IMSI) IE comes without MI type header */</span><br><span style="color: hsl(0, 100%, 40%);">-          memcpy(tmsi_buf + 1, TLVP_VAL(tp, BSSGP_IE_TMSI), GSM23003_TMSI_NUM_BYTES);</span><br><span style="color: hsl(0, 100%, 40%);">-             tmsi_buf[0] = 0xf0 | GSM_MI_TYPE_TMSI;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          *mi_len = GSM48_TMSI_LEN;</span><br><span style="color: hsl(0, 100%, 40%);">-               *mi = tmsi_buf;</span><br><span style="color: hsl(120, 100%, 40%);">+               *mi = (struct osmo_mobile_identity){</span><br><span style="color: hsl(120, 100%, 40%);">+                  .type = GSM_MI_TYPE_TMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+             };</span><br><span style="color: hsl(120, 100%, 40%);">+            mi->tmsi = osmo_load32be(TLVP_VAL(tp, BSSGP_IE_TMSI));</span><br><span>    } else if (TLVP_PRESENT(tp, BSSGP_IE_IMSI)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           *mi_len = TLVP_LEN(tp, BSSGP_IE_IMSI);</span><br><span style="color: hsl(0, 100%, 40%);">-          *mi = TLVP_VAL(tp, BSSGP_IE_IMSI);</span><br><span style="color: hsl(120, 100%, 40%);">+            int rc = osmo_mobile_identity_decode(mi, TLVP_VAL(tp, BSSGP_IE_IMSI), TLVP_LEN(tp, BSSGP_IE_IMSI),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 true);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (rc < 0 || mi->type != GSM_MI_TYPE_IMSI) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGP(DBSSGP, LOGL_ERROR, "Invalid IMSI Mobile Identity\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                 return BSSGP_CAUSE_COND_IE_ERR;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>    } else {</span><br><span>             LOGP(DBSSGP, LOGL_ERROR, "Neither TMSI IE nor IMSI IE is present\n");</span><br><span>              return BSSGP_CAUSE_MISSING_COND_IE;</span><br><span>@@ -203,23 +203,21 @@</span><br><span> </span><br><span> static int gprs_bssgp_pcu_rx_paging_cs(struct msgb *msg, struct tlv_parsed *tp)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t *mi;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t mi_len;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_mobile_identity mi;</span><br><span>      int rc;</span><br><span>      uint8_t *chan_needed = (uint8_t *)TLVP_VAL(tp, BSSGP_IE_CHAN_NEEDED);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if ((rc = get_paging_mi(&mi, &mi_len, tp)) > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    if ((rc = get_paging_mi(&mi, tp)) > 0)</span><br><span>                return bssgp_tx_status((enum gprs_bssgp_cause) rc, NULL, msg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      return BTS::main_bts()->add_paging(chan_needed ? *chan_needed : 0, mi, mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+    return BTS::main_bts()->add_paging(chan_needed ? *chan_needed : 0, &mi);</span><br><span> }</span><br><span> </span><br><span> static int gprs_bssgp_pcu_rx_paging_ps(struct msgb *msg, struct tlv_parsed *tp)</span><br><span> {</span><br><span>     struct osmo_mobile_identity mi_imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_mobile_identity paging_mi;</span><br><span>       uint16_t pgroup;</span><br><span style="color: hsl(0, 100%, 40%);">-        const uint8_t *mi;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t mi_len;</span><br><span>      int rc;</span><br><span> </span><br><span>  if (!TLVP_PRESENT(tp, BSSGP_IE_IMSI)) {</span><br><span>@@ -238,10 +236,10 @@</span><br><span>              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%);">-   if ((rc = get_paging_mi(&mi, &mi_len, tp)) > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    if ((rc = get_paging_mi(&paging_mi, tp)) > 0)</span><br><span>                 return bssgp_tx_status((enum gprs_bssgp_cause) rc, NULL, msg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      return gprs_rlcmac_paging_request(mi, mi_len, pgroup);</span><br><span style="color: hsl(120, 100%, 40%);">+        return gprs_rlcmac_paging_request(&paging_mi, 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 879ea85..4fb75f7 100644</span><br><span>--- a/src/gprs_rlcmac.cpp</span><br><span>+++ b/src/gprs_rlcmac.cpp</span><br><span>@@ -32,18 +32,20 @@</span><br><span> </span><br><span> extern void *tall_pcu_ctx;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int gprs_rlcmac_paging_request(const uint8_t *mi, uint8_t mi_len, uint16_t pgroup)</span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_rlcmac_paging_request(const struct osmo_mobile_identity *mi, uint16_t pgroup)</span><br><span> {</span><br><span>        if (log_check_level(DRLCMAC, LOGL_NOTICE)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            struct osmo_mobile_identity omi = {};</span><br><span>                char str[64];</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_mobile_identity_decode(&omi, mi, mi_len, true);</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_mobile_identity_to_str_buf(str, sizeof(str), &omi);</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_mobile_identity_to_str_buf(str, sizeof(str), mi);</span><br><span>               LOGP(DRLCMAC, LOGL_NOTICE, "TX: [PCU -> BTS] Paging Request (CCCH) MI=%s\n", str);</span><br><span>      }</span><br><span>    bitvec *paging_request = bitvec_alloc(22, tall_pcu_ctx);</span><br><span>     bitvec_unhex(paging_request, DUMMY_VEC);</span><br><span style="color: hsl(0, 100%, 40%);">-        int plen = Encoding::write_paging_request(paging_request, mi, mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+        int plen = Encoding::write_paging_request(paging_request, mi);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (plen <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DRLCMAC, LOGL_ERROR, "TX: [PCU -> BTS] Failed to encode Paging Request\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>    pcu_l1if_tx_pch(paging_request, plen, pgroup);</span><br><span>       bitvec_free(paging_request);</span><br><span> </span><br><span>diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h</span><br><span>index 789b8db..6587c40 100644</span><br><span>--- a/src/gprs_rlcmac.h</span><br><span>+++ b/src/gprs_rlcmac.h</span><br><span>@@ -93,7 +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(const uint8_t *mi, uint8_t mi_len, uint16_t pgroup);</span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_rlcmac_paging_request(const struct osmo_mobile_identity *mi, 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 7fa82fb..0712470 100644</span><br><span>--- a/src/pcu_l1_if.cpp</span><br><span>+++ b/src/pcu_l1_if.cpp</span><br><span>@@ -677,6 +677,9 @@</span><br><span> </span><br><span> static int pcu_rx_pag_req(struct gsm_pcu_if_pag_req *pag_req)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osmo_mobile_identity mi;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    LOGP(DL1IF, LOGL_DEBUG, "Paging request received: chan_needed=%d "</span><br><span>                 "length=%d\n", pag_req->chan_needed, pag_req->identity_lv[0]);</span><br><span> </span><br><span>@@ -687,8 +690,13 @@</span><br><span>            return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return BTS::main_bts()->add_paging(pag_req->chan_needed, &pag_req->identity_lv[1],</span><br><span style="color: hsl(0, 100%, 40%);">-                                    pag_req->identity_lv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = osmo_mobile_identity_decode(&mi, &pag_req->identity_lv[1], pag_req->identity_lv[0], true);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DL1IF, LOGL_ERROR, "Failed to decode Mobile Identity in Paging Request (rc=%d)\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                return -EINVAL;</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 BTS::main_bts()->add_paging(pag_req->chan_needed, &mi);</span><br><span> }</span><br><span> </span><br><span> static int pcu_rx_susp_req(struct gsm_pcu_if_susp_req *susp_req)</span><br><span>diff --git a/src/pdch.cpp b/src/pdch.cpp</span><br><span>index af84724..fbbeddc 100644</span><br><span>--- a/src/pdch.cpp</span><br><span>+++ b/src/pdch.cpp</span><br><span>@@ -266,15 +266,21 @@</span><br><span>   return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool gprs_rlcmac_pdch::add_paging(uint8_t chan_needed, const uint8_t *mi, uint8_t mi_len)</span><br><span style="color: hsl(120, 100%, 40%);">+bool gprs_rlcmac_pdch::add_paging(uint8_t chan_needed, const struct osmo_mobile_identity *mi)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc;</span><br><span>      struct gprs_rlcmac_paging *pag = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_paging);</span><br><span>       if (!pag)</span><br><span>            return false;</span><br><span> </span><br><span>    pag->chan_needed = chan_needed;</span><br><span style="color: hsl(0, 100%, 40%);">-      pag->identity_lv[0] = mi_len;</span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(&pag->identity_lv[1], mi, mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = osmo_mobile_identity_encode_buf(pag->identity_lv + 1, sizeof(pag->identity_lv) - 1, mi, true);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DRLCMAC, LOGL_ERROR, "Cannot encode Mobile Identity (rc=%d)\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+           talloc_free(pag);</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%);">+     pag->identity_lv[0] = rc;</span><br><span> </span><br><span>     llist_add(&pag->list, &paging_list);</span><br><span> </span><br><span>diff --git a/src/pdch.h b/src/pdch.h</span><br><span>index ec35174..e1e3688 100644</span><br><span>--- a/src/pdch.h</span><br><span>+++ b/src/pdch.h</span><br><span>@@ -48,7 +48,7 @@</span><br><span>         struct gprs_rlcmac_paging *dequeue_paging();</span><br><span>         struct msgb *packet_paging_request();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       bool add_paging(uint8_t chan_needed, const uint8_t *mi, uint8_t mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+      bool add_paging(uint8_t chan_needed, const struct osmo_mobile_identity *mi);</span><br><span> </span><br><span>     void free_resources();</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/19768">change 19768</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/+/19768"/><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: Iad845acb0096b75dc453105c9c16b2252879b4ca </div>
<div style="display:none"> Gerrit-Change-Number: 19768 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>