<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, ¶ms->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, ¶ms->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 = ¶ms->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 = ¶ms->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 = ¶ms->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>