<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20347">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">refactor paging: introduce bsc_paging_params<br><br>For LCS, I would like to add an enum indicating the paging reason. Instead of<br>modifying extremely many function signatures to pass the reason across all<br>levels of paging, introduce a struct combining these.<br><br>Change-Id: I27ca78fc6ff8ef1101554c0a8429e34945ca6f3c<br>---<br>M include/osmocom/bsc/paging.h<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>M src/osmo-bsc/paging.c<br>3 files changed, 111 insertions(+), 109 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/47/20347/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/paging.h b/include/osmocom/bsc/paging.h</span><br><span>index 449a2eb..82dea1b 100644</span><br><span>--- a/include/osmocom/bsc/paging.h</span><br><span>+++ b/include/osmocom/bsc/paging.h</span><br><span>@@ -28,9 +28,28 @@</span><br><span> </span><br><span> #include <osmocom/bsc/gsm_data.h></span><br><span> #include <osmocom/bsc/bsc_subscriber.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_msc_data.h></span><br><span> </span><br><span> struct bsc_msc_data;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define LOG_PAGING(PARAMS, SUBSYS, LEVEL, fmt, args...) \</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(SUBSYS, LEVEL, "Paging: msc%d %s TMSI-0x%08x: " fmt, \</span><br><span style="color: hsl(120, 100%, 40%);">+      (PARAMS)->msc ? (PARAMS)->msc->nr : -1, \</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_mobile_identity_to_str_c(OTC_SELECT, &(PARAMS)->imsi), \</span><br><span style="color: hsl(120, 100%, 40%);">+          (PARAMS)->tmsi, \</span><br><span style="color: hsl(120, 100%, 40%);">+          ##args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define LOG_PAGING_BTS(PARAMS, BTS, SUBSYS, LEVEL, fmt, args...) \</span><br><span style="color: hsl(120, 100%, 40%);">+    LOG_PAGING(PARAMS, SUBSYS, LEVEL, "(bts%u) " fmt, (BTS) ? (BTS)->nr : 255, ##args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct bsc_paging_params {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_msc_data *msc;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t tmsi;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_mobile_identity imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t chan_needed;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm0808_cell_id_list2 cil;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /**</span><br><span>  * A pending paging request</span><br><span>  */</span><br><span>@@ -56,8 +75,7 @@</span><br><span> };</span><br><span> </span><br><span> /* schedule paging request */</span><br><span style="color: hsl(0, 100%, 40%);">-int paging_request_bts(struct gsm_bts *bts, struct bsc_subscr *bsub, int type,</span><br><span style="color: hsl(0, 100%, 40%);">-                       struct bsc_msc_data *msc);</span><br><span style="color: hsl(120, 100%, 40%);">+int paging_request_bts(const struct bsc_paging_params *params, struct bsc_subscr *bsub, struct gsm_bts *bts);</span><br><span> </span><br><span> struct bsc_msc_data *paging_request_stop(struct gsm_bts *bts, struct bsc_subscr *bsub);</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index 65fee04..3c00d68 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>@@ -115,37 +115,34 @@</span><br><span>  * The msc parameter is the MSC which issued the corresponding paging request.</span><br><span>  * Log an error if paging failed. */</span><br><span> static void</span><br><span style="color: hsl(0, 100%, 40%);">-page_subscriber(struct bsc_msc_data *msc, struct gsm_bts *bts,</span><br><span style="color: hsl(0, 100%, 40%);">-    uint32_t tmsi, uint32_t lac, const char *mi_string, uint8_t chan_needed)</span><br><span style="color: hsl(120, 100%, 40%);">+page_subscriber(const struct bsc_paging_params *params, struct gsm_bts *bts, uint32_t lac)</span><br><span> {</span><br><span>    struct bsc_subscr *subscr;</span><br><span>   int ret;</span><br><span> </span><br><span>         if (!bsc_grace_allow_new_connection(bsc_gsmnet, bts)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DMSC, LOGL_DEBUG, "RF-locked: not paging on BTS %u\n", bts->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOG_PAGING_BTS(params, bts, DMSC, LOGL_DEBUG, "RF-locked: not paging on this BTS\n");</span><br><span>              return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   subscr = bsc_subscr_find_or_create_by_imsi(msc->network->bsc_subscribers,</span><br><span style="color: hsl(0, 100%, 40%);">-                                            mi_string);</span><br><span style="color: hsl(120, 100%, 40%);">+        subscr = bsc_subscr_find_or_create_by_mi(bsc_gsmnet->bsc_subscribers, &params->imsi);</span><br><span> </span><br><span>  if (subscr)</span><br><span>          log_set_context(LOG_CTX_BSC_SUBSCR, subscr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        LOGP(DMSC, LOGL_INFO, "Paging request from MSC BTS: %d IMSI: '%s' TMSI: '0x%x/%u' LAC: 0x%x\n",</span><br><span style="color: hsl(0, 100%, 40%);">-           bts->nr, mi_string, tmsi, tmsi, lac);</span><br><span style="color: hsl(120, 100%, 40%);">+  LOG_PAGING_BTS(params, bts, DMSC, LOGL_INFO, "Paging on LAC %u\n", lac);</span><br><span> </span><br><span>       if (!subscr) {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGP(DMSC, LOGL_ERROR, "Paging request failed: Could not allocate subscriber for %s\n", mi_string);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DMSC, LOGL_ERROR, "Paging request failed: Could not allocate subscriber for %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  osmo_mobile_identity_to_str_c(OTC_SELECT, &params->imsi));</span><br><span>               return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   subscr->tmsi = tmsi;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ret = paging_request_bts(bts, subscr, chan_needed, msc);</span><br><span style="color: hsl(120, 100%, 40%);">+      subscr->tmsi = params->tmsi;</span><br><span style="color: hsl(120, 100%, 40%);">+    ret = paging_request_bts(params, subscr, bts);</span><br><span>       if (ret == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DMSC, LOGL_INFO, "Paging request failed or repeated paging: BTS: %d IMSI: '%s' TMSI: '0x%x/%u' LAC: 0x%x\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                  bts->nr, mi_string, tmsi, tmsi, lac);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOG_PAGING_BTS(params, bts, DMSC, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+                         "Paging request failed, or repeated paging on LAC %u\n", lac);</span><br><span> </span><br><span>  /* the paging code has grabbed its own references */</span><br><span>         bsc_subscr_put(subscr);</span><br><span>@@ -154,141 +151,132 @@</span><br><span> }</span><br><span> </span><br><span> static void</span><br><span style="color: hsl(0, 100%, 40%);">-page_all_bts(struct bsc_msc_data *msc, uint32_t tmsi, const char *mi_string, uint8_t chan_needed)</span><br><span style="color: hsl(120, 100%, 40%);">+page_all_bts(const struct bsc_paging_params *params)</span><br><span> {</span><br><span>        struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(bts, &msc->network->bts_list, list)</span><br><span style="color: hsl(0, 100%, 40%);">-              page_subscriber(msc, bts, tmsi, GSM_LAC_RESERVED_ALL_BTS, mi_string, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list)</span><br><span style="color: hsl(120, 100%, 40%);">+         page_subscriber(params, bts, GSM_LAC_RESERVED_ALL_BTS);</span><br><span> }</span><br><span> </span><br><span> static void</span><br><span style="color: hsl(0, 100%, 40%);">-page_cgi(struct bsc_msc_data *msc, struct gsm0808_cell_id_list2 *cil,</span><br><span style="color: hsl(0, 100%, 40%);">-     uint32_t tmsi, const char *mi_string, uint8_t chan_needed)</span><br><span style="color: hsl(120, 100%, 40%);">+page_cgi(const struct bsc_paging_params *params)</span><br><span> {</span><br><span>   int i;</span><br><span style="color: hsl(0, 100%, 40%);">-  for (i = 0; i < cil->id_list_len; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          struct osmo_cell_global_id *id = &cil->id_list[i].global;</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!osmo_plmn_cmp(&id->lai.plmn, &msc->network->plmn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < params->cil.id_list_len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         const struct osmo_cell_global_id *id = &params->cil.id_list[i].global;</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!osmo_plmn_cmp(&id->lai.plmn, &bsc_gsmnet->plmn)) {</span><br><span>                        int paged = 0;</span><br><span>                       struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-                    llist_for_each_entry(bts, &msc->network->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {</span><br><span>                              if (bts->location_area_code != id->lai.lac)</span><br><span>                                    continue;</span><br><span>                            if (bts->cell_identity != id->cell_identity)</span><br><span>                                   continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                               page_subscriber(msc, bts, tmsi, id->lai.lac, mi_string, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+                              page_subscriber(params, bts, id->lai.lac);</span><br><span>                                paged = 1;</span><br><span>                   }</span><br><span>                    if (!paged) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           LOGP(DMSC, LOGL_NOTICE, "Paging IMSI %s: BTS with LAC %d and CI %d not found\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                   mi_string, id->lai.lac, id->cell_identity);</span><br><span style="color: hsl(120, 100%, 40%);">+                                LOG_PAGING(params, DMSC, LOGL_NOTICE, "BTS with LAC %u and CI %u not found\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                         id->lai.lac, id->cell_identity);</span><br><span>                    }</span><br><span>            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGP(DMSC, LOGL_DEBUG, "Paging IMSI %s: MCC-MNC in Cell Identifier List "</span><br><span style="color: hsl(0, 100%, 40%);">-                          "(%s) do not match our network (%s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                       mi_string, osmo_plmn_name(&id->lai.plmn),</span><br><span style="color: hsl(0, 100%, 40%);">-                        osmo_plmn_name2(&msc->network->plmn));</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOG_PAGING(params, DMSC, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                             "MCC-MNC in Cell Identifier List (%s) do not match our network (%s)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                             osmo_plmn_name_c(OTC_SELECT, &id->lai.plmn),</span><br><span style="color: hsl(120, 100%, 40%);">+                                   osmo_plmn_name_c(OTC_SELECT, &bsc_gsmnet->plmn));</span><br><span>          }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span> static void</span><br><span style="color: hsl(0, 100%, 40%);">-page_lac_and_ci(struct bsc_msc_data *msc, struct gsm0808_cell_id_list2 *cil,</span><br><span style="color: hsl(0, 100%, 40%);">-    uint32_t tmsi, const char *mi_string, uint8_t chan_needed)</span><br><span style="color: hsl(120, 100%, 40%);">+page_lac_and_ci(const struct bsc_paging_params *params)</span><br><span> {</span><br><span>    int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < cil->id_list_len; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          struct osmo_lac_and_ci_id *id = &cil->id_list[i].lac_and_ci;</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < params->cil.id_list_len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         const struct osmo_lac_and_ci_id *id = &params->cil.id_list[i].lac_and_ci;</span><br><span>             int paged = 0;</span><br><span>               struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-            llist_for_each_entry(bts, &msc->network->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {</span><br><span>                      if (bts->location_area_code != id->lac)</span><br><span>                                continue;</span><br><span>                    if (bts->cell_identity != id->ci)</span><br><span>                              continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       page_subscriber(msc, bts, tmsi, id->lac, mi_string, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+                  page_subscriber(params, bts, id->lac);</span><br><span>                    paged = 1;</span><br><span>           }</span><br><span>            if (!paged) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGP(DMSC, LOGL_NOTICE, "Paging IMSI %s: BTS with LAC %d and CI %d not found\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                           mi_string, id->lac, id->ci);</span><br><span style="color: hsl(120, 100%, 40%);">+                       LOG_PAGING(params, DMSC, LOGL_NOTICE, "BTS with LAC %u and CI %u not found\n", id->lac, id->ci);</span><br><span>             }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span> static void</span><br><span style="color: hsl(0, 100%, 40%);">-page_ci(struct bsc_msc_data *msc, struct gsm0808_cell_id_list2 *cil,</span><br><span style="color: hsl(0, 100%, 40%);">-    uint32_t tmsi, const char *mi_string, uint8_t chan_needed)</span><br><span style="color: hsl(120, 100%, 40%);">+page_ci(const struct bsc_paging_params *params)</span><br><span> {</span><br><span>    int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < cil->id_list_len; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          uint16_t ci = cil->id_list[i].ci;</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = 0; i < params->cil.id_list_len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         uint16_t ci = params->cil.id_list[i].ci;</span><br><span>          int paged = 0;</span><br><span>               struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-            llist_for_each_entry(bts, &msc->network->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {</span><br><span>                      if (bts->cell_identity != ci)</span><br><span>                             continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       page_subscriber(msc, bts, tmsi, GSM_LAC_RESERVED_ALL_BTS, mi_string, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+                    page_subscriber(params, bts, GSM_LAC_RESERVED_ALL_BTS);</span><br><span>                      paged = 1;</span><br><span>           }</span><br><span>            if (!paged) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGP(DMSC, LOGL_NOTICE, "Paging IMSI %s: BTS with CI %d not found\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      mi_string, ci);</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOG_PAGING(params, DMSC, LOGL_NOTICE, "BTS with CI %u not found\n", ci);</span><br><span>           }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span> static void</span><br><span style="color: hsl(0, 100%, 40%);">-page_lai_and_lac(struct bsc_msc_data *msc, struct gsm0808_cell_id_list2 *cil,</span><br><span style="color: hsl(0, 100%, 40%);">-   uint32_t tmsi, const char *mi_string, uint8_t chan_needed)</span><br><span style="color: hsl(120, 100%, 40%);">+page_lai_and_lac(const struct bsc_paging_params *params)</span><br><span> {</span><br><span>   int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < cil->id_list_len; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          struct osmo_location_area_id *id = &cil->id_list[i].lai_and_lac;</span><br><span style="color: hsl(0, 100%, 40%);">-         if (!osmo_plmn_cmp(&id->plmn, &msc->network->plmn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < params->cil.id_list_len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         const struct osmo_location_area_id *id = &params->cil.id_list[i].lai_and_lac;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!osmo_plmn_cmp(&id->plmn, &bsc_gsmnet->plmn)) {</span><br><span>                    int paged = 0;</span><br><span>                       struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-                    llist_for_each_entry(bts, &msc->network->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {</span><br><span>                              if (bts->location_area_code != id->lac)</span><br><span>                                        continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                               page_subscriber(msc, bts, tmsi, id->lac, mi_string, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+                          page_subscriber(params, bts, id->lac);</span><br><span>                            paged = 1;</span><br><span>                   }</span><br><span>                    if (!paged) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           LOGP(DMSC, LOGL_NOTICE, "Paging IMSI %s: BTS with LAC %d not found\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     mi_string, id->lac);</span><br><span style="color: hsl(120, 100%, 40%);">+                          LOG_PAGING(params, DMSC, LOGL_NOTICE, "BTS with LAC %u not found\n", id->lac);</span><br><span>                  }</span><br><span>            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGP(DMSC, LOGL_DEBUG, "Paging IMSI %s: MCC-MNC in Cell Identifier List "</span><br><span style="color: hsl(0, 100%, 40%);">-                          "(%s) do not match our network (%s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                       mi_string, osmo_plmn_name(&id->plmn),</span><br><span style="color: hsl(0, 100%, 40%);">-                            osmo_plmn_name2(&msc->network->plmn));</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOG_PAGING(params, DMSC, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                             "MCC-MNC in Cell Identifier List (%s) do not match our network (%s)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                             osmo_plmn_name_c(OTC_SELECT, &id->plmn),</span><br><span style="color: hsl(120, 100%, 40%);">+                               osmo_plmn_name_c(OTC_SELECT, &bsc_gsmnet->plmn));</span><br><span>          }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span> static void</span><br><span style="color: hsl(0, 100%, 40%);">-page_lac(struct bsc_msc_data *msc, struct gsm0808_cell_id_list2 *cil,</span><br><span style="color: hsl(0, 100%, 40%);">-   uint32_t tmsi, const char *mi_string, uint8_t chan_needed)</span><br><span style="color: hsl(120, 100%, 40%);">+page_lac(const struct bsc_paging_params *params)</span><br><span> {</span><br><span>   int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < cil->id_list_len; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          uint16_t lac = cil->id_list[i].lac;</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < params->cil.id_list_len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         uint16_t lac = params->cil.id_list[i].lac;</span><br><span>                int paged = 0;</span><br><span>               struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-            llist_for_each_entry(bts, &msc->network->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {</span><br><span>                      if (bts->location_area_code != lac)</span><br><span>                               continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       page_subscriber(msc, bts, tmsi, lac, mi_string, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+                 page_subscriber(params, bts, lac);</span><br><span>                   paged = 1;</span><br><span>           }</span><br><span>            if (!paged) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGP(DMSC, LOGL_NOTICE, "Paging IMSI %s: BTS with LAC %d not found\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                             mi_string, lac);</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOG_PAGING(params, DMSC, LOGL_NOTICE, "BTS with LAC %u not found\n", lac);</span><br><span>                 }</span><br><span>    }</span><br><span> }</span><br><span>@@ -298,13 +286,14 @@</span><br><span>                               struct msgb *msg, unsigned int payload_length)</span><br><span> {</span><br><span>  struct tlv_parsed tp;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_mobile_identity mi_imsi;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint32_t tmsi = GSM_RESERVED_TMSI;</span><br><span>   uint8_t data_length;</span><br><span>         int remain;</span><br><span>  const uint8_t *data;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t chan_needed = RSL_CHANNEED_ANY;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm0808_cell_id_list2 cil;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct bsc_paging_params paging = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .msc = msc,</span><br><span style="color: hsl(120, 100%, 40%);">+           .tmsi = GSM_RESERVED_TMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+    };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct bsc_paging_params *params; // (tmp cosmetic shim, dropped in subsequent patch)</span><br><span> </span><br><span>    tlv_parse(&tp, gsm0808_att_tlvdef(), msg->l4h + 1, payload_length - 1, 0, 0);</span><br><span>         remain = payload_length - 1;</span><br><span>@@ -325,7 +314,7 @@</span><br><span> </span><br><span>       if (TLVP_PRESENT(&tp, GSM0808_IE_TMSI) &&</span><br><span>            TLVP_LEN(&tp, GSM0808_IE_TMSI) == 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-          tmsi = ntohl(tlvp_val32_unal(&tp, GSM0808_IE_TMSI));</span><br><span style="color: hsl(120, 100%, 40%);">+              paging.tmsi = ntohl(tlvp_val32_unal(&tp, GSM0808_IE_TMSI));</span><br><span>              remain -= TLVP_LEN(&tp, GSM0808_IE_TMSI);</span><br><span>        }</span><br><span> </span><br><span>@@ -337,8 +326,8 @@</span><br><span>  /*</span><br><span>    * parse the IMSI</span><br><span>     */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (osmo_mobile_identity_decode(&mi_imsi, TLVP_VAL(&tp, GSM0808_IE_IMSI), TLVP_LEN(&tp, GSM0808_IE_IMSI), false)</span><br><span style="color: hsl(0, 100%, 40%);">-        || mi_imsi.type != GSM_MI_TYPE_IMSI) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (osmo_mobile_identity_decode(&paging.imsi, TLVP_VAL(&tp, GSM0808_IE_IMSI), TLVP_LEN(&tp, GSM0808_IE_IMSI), false)</span><br><span style="color: hsl(120, 100%, 40%);">+          || paging.imsi.type != GSM_MI_TYPE_IMSI) {</span><br><span>               LOGP(DMSC, LOGL_ERROR, "Paging: could not parse IMSI\n");</span><br><span>          return -1;</span><br><span>   }</span><br><span>@@ -350,63 +339,61 @@</span><br><span>     */</span><br><span>  data_length = TLVP_LEN(&tp, GSM0808_IE_CELL_IDENTIFIER_LIST);</span><br><span>    data = TLVP_VAL(&tp, GSM0808_IE_CELL_IDENTIFIER_LIST);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (gsm0808_dec_cell_id_list2(&cil, data, data_length) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGP(DMSC, LOGL_ERROR, "Paging %s: Could not parse Cell Identifier List\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_mobile_identity_to_str_c(OTC_SELECT, &mi_imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+        if (gsm0808_dec_cell_id_list2(&paging.cil, data, data_length) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOG_PAGING(&paging, DMSC, LOGL_ERROR, "Could not parse Cell Identifier List\n");</span><br><span>               return -1;</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (paging.cil.id_discr == CELL_IDENT_BSS && data_length != 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOG_PAGING(&paging, DMSC, LOGL_ERROR, "Cell Identifier List for BSS (0x%x)"</span><br><span style="color: hsl(120, 100%, 40%);">+                  " has invalid length: %u, paging entire BSS anyway (%s)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 CELL_IDENT_BSS, data_length, osmo_hexdump(data, data_length));</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span>    remain = 0;</span><br><span> </span><br><span>      if (TLVP_PRESENT(&tp, GSM0808_IE_CHANNEL_NEEDED) && TLVP_LEN(&tp, GSM0808_IE_CHANNEL_NEEDED) == 1)</span><br><span style="color: hsl(0, 100%, 40%);">-              chan_needed = TLVP_VAL(&tp, GSM0808_IE_CHANNEL_NEEDED)[0] & 0x03;</span><br><span style="color: hsl(120, 100%, 40%);">+             paging.chan_needed = TLVP_VAL(&tp, GSM0808_IE_CHANNEL_NEEDED)[0] & 0x03;</span><br><span> </span><br><span>         if (TLVP_PRESENT(&tp, GSM0808_IE_EMLPP_PRIORITY)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DMSC, LOGL_ERROR, "eMLPP is not handled\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           LOG_PAGING(&paging, DMSC, LOGL_ERROR, "eMLPP IE present, but eMLPP is not handled\n");</span><br><span>         }</span><br><span> </span><br><span>        rate_ctr_inc(&msc->network->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED]);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  switch (cil.id_discr) {</span><br><span style="color: hsl(120, 100%, 40%);">+       params = &paging;</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (params->cil.id_discr) {</span><br><span>   case CELL_IDENT_NO_CELL:</span><br><span style="color: hsl(0, 100%, 40%);">-                page_all_bts(msc, tmsi, mi_imsi.imsi, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+           page_all_bts(params);</span><br><span>                break;</span><br><span> </span><br><span>   case CELL_IDENT_WHOLE_GLOBAL:</span><br><span style="color: hsl(0, 100%, 40%);">-           page_cgi(msc, &cil, tmsi, mi_imsi.imsi, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+             page_cgi(params);</span><br><span>            break;</span><br><span> </span><br><span>   case CELL_IDENT_LAC_AND_CI:</span><br><span style="color: hsl(0, 100%, 40%);">-             page_lac_and_ci(msc, &cil, tmsi, mi_imsi.imsi, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+              page_lac_and_ci(params);</span><br><span>             break;</span><br><span> </span><br><span>   case CELL_IDENT_CI:</span><br><span style="color: hsl(0, 100%, 40%);">-             page_ci(msc, &cil, tmsi, mi_imsi.imsi, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+              page_ci(params);</span><br><span>             break;</span><br><span> </span><br><span>   case CELL_IDENT_LAI_AND_LAC:</span><br><span style="color: hsl(0, 100%, 40%);">-            page_lai_and_lac(msc, &cil, tmsi, mi_imsi.imsi, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+             page_lai_and_lac(params);</span><br><span>            break;</span><br><span> </span><br><span>   case CELL_IDENT_LAC:</span><br><span style="color: hsl(0, 100%, 40%);">-            page_lac(msc, &cil, tmsi, mi_imsi.imsi, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+             page_lac(params);</span><br><span>            break;</span><br><span> </span><br><span>   case CELL_IDENT_BSS:</span><br><span style="color: hsl(0, 100%, 40%);">-            if (data_length != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGP(DMSC, LOGL_ERROR, "Paging %s: Cell Identifier List for BSS (0x%x)"</span><br><span style="color: hsl(0, 100%, 40%);">-                            " has invalid length: %u, paging entire BSS anyway (%s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                           osmo_mobile_identity_to_str_c(OTC_SELECT, &mi_imsi),</span><br><span style="color: hsl(0, 100%, 40%);">-                        CELL_IDENT_BSS, data_length, osmo_hexdump(data, data_length));</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               page_all_bts(msc, tmsi, mi_imsi.imsi, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+           page_all_bts(params);</span><br><span>                break;</span><br><span> </span><br><span>   default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DMSC, LOGL_NOTICE, "Paging %s: unimplemented Cell Identifier List (0x%x),"</span><br><span style="color: hsl(0, 100%, 40%);">-                    " paging entire BSS instead (%s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                  osmo_mobile_identity_to_str_c(OTC_SELECT, &mi_imsi),</span><br><span style="color: hsl(0, 100%, 40%);">-                cil.id_discr, osmo_hexdump(data, data_length));</span><br><span style="color: hsl(0, 100%, 40%);">-            page_all_bts(msc, tmsi, mi_imsi.imsi, chan_needed);</span><br><span style="color: hsl(120, 100%, 40%);">+           LOG_PAGING(params, DMSC, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "unimplemented Cell Identifier List type (0x%x), paging entire BSS instead\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      params->cil.id_discr);</span><br><span style="color: hsl(120, 100%, 40%);">+          page_all_bts(params);</span><br><span>                break;</span><br><span>       }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/paging.c b/src/osmo-bsc/paging.c</span><br><span>index 0e5bf9f..1869042 100644</span><br><span>--- a/src/osmo-bsc/paging.c</span><br><span>+++ b/src/osmo-bsc/paging.c</span><br><span>@@ -325,8 +325,7 @@</span><br><span>  * \param[in] type type of radio channel we're requirign</span><br><span>  * \param[in] msc MSC which has issue this paging</span><br><span>  * \returns 0 on success, negative on error */</span><br><span style="color: hsl(0, 100%, 40%);">-static int _paging_request(struct gsm_bts *bts, struct bsc_subscr *bsub, int type,</span><br><span style="color: hsl(0, 100%, 40%);">-                      struct bsc_msc_data *msc)</span><br><span style="color: hsl(120, 100%, 40%);">+static int _paging_request(const struct bsc_paging_params *params, struct bsc_subscr *bsub, struct gsm_bts *bts)</span><br><span> {</span><br><span>  struct gsm_bts_paging_state *bts_entry = &bts->paging;</span><br><span>        struct gsm_paging_request *req;</span><br><span>@@ -335,19 +334,18 @@</span><br><span>      rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_ATTEMPTED]);</span><br><span> </span><br><span>   if (paging_pending_request(bts_entry, bsub)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOG_BTS(bts, DPAG, LOGL_INFO, "Paging request already pending for %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      bsc_subscr_name(bsub));</span><br><span style="color: hsl(120, 100%, 40%);">+               LOG_PAGING_BTS(params, bts, DPAG, LOGL_INFO, "Paging request already pending for this subscriber\n");</span><br><span>              rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_ALREADY]);</span><br><span>                 return -EEXIST;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOG_BTS(bts, DPAG, LOGL_DEBUG, "Start paging of subscriber %s\n", bsc_subscr_name(bsub));</span><br><span style="color: hsl(120, 100%, 40%);">+   LOG_PAGING_BTS(params, bts, DPAG, LOGL_DEBUG, "Start paging\n");</span><br><span>   req = talloc_zero(tall_paging_ctx, struct gsm_paging_request);</span><br><span>       OSMO_ASSERT(req);</span><br><span>    req->bsub = bsc_subscr_get(bsub);</span><br><span>         req->bts = bts;</span><br><span style="color: hsl(0, 100%, 40%);">-      req->chan_type = type;</span><br><span style="color: hsl(0, 100%, 40%);">-       req->msc = msc;</span><br><span style="color: hsl(120, 100%, 40%);">+    req->chan_type = params->chan_needed;</span><br><span style="color: hsl(120, 100%, 40%);">+   req->msc = params->msc;</span><br><span>        osmo_timer_setup(&req->T3113, paging_T3113_expired, req);</span><br><span>     t3113_timeout_s = calculate_timer_3113(bts);</span><br><span>         osmo_timer_schedule(&req->T3113, t3113_timeout_s, 0);</span><br><span>@@ -363,8 +361,7 @@</span><br><span>  * \param[in] type type of radio channel we're requirign</span><br><span>  * \param[in] msc MSC which has issue this paging</span><br><span>  * returns 1 on success; 0 in case of error (e.g. TRX down) */</span><br><span style="color: hsl(0, 100%, 40%);">-int paging_request_bts(struct gsm_bts *bts, struct bsc_subscr *bsub, int type,</span><br><span style="color: hsl(0, 100%, 40%);">-                 struct bsc_msc_data *msc)</span><br><span style="color: hsl(120, 100%, 40%);">+int paging_request_bts(const struct bsc_paging_params *params, struct bsc_subscr *bsub, struct gsm_bts *bts)</span><br><span> {</span><br><span>         int rc;</span><br><span> </span><br><span>@@ -376,7 +373,7 @@</span><br><span>    paging_init_if_needed(bts);</span><br><span> </span><br><span>      /* Trigger paging, pass any error to the caller */</span><br><span style="color: hsl(0, 100%, 40%);">-      rc = _paging_request(bts, bsub, type, msc);</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = _paging_request(params, bsub, bts);</span><br><span>     if (rc < 0)</span><br><span>               return 0;</span><br><span>    return 1;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20347">change 20347</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-bsc/+/20347"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I27ca78fc6ff8ef1101554c0a8429e34945ca6f3c </div>
<div style="display:none"> Gerrit-Change-Number: 20347 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>