aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2019-08-14 15:14:28 +0200
committerPhilipp Maier <pmaier@sysmocom.de>2019-08-28 13:56:59 +0200
commit9508e2232f72a368ab87b5903e0764c4ae4985ad (patch)
treef3ee1e1ebb856d3092f7065b67496a61fb6a94ef
parenta8ba7a7badc3f13c23042a2a9de1ceb36184350b (diff)
gsm_08_08.c: always pick first msc for unsolicit paging responses
When osmo-bsc receives a paging response via the A-bis interface it tries to find the MSC which is in charge for the paging. This is due to the fact that osmo-bsc supports multiple msc connections, which is not specified by 3gpp specs. In an MT-CSFB call the MSC pages the UE via the SGs interface. Then the UE falls back to 2G. It then reports back as MS on the A-Bis interface with the paging response directly. In those cases osmo-bsc will not be able to determine an MSC in charge, so we will forward the paging response to the first configured MSC. Change-Id: I7f091ed1bbc2afe12656e42031e122144eeb6826 Related: SYS#4624
-rw-r--r--src/osmo-bsc/gsm_08_08.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/osmo-bsc/gsm_08_08.c b/src/osmo-bsc/gsm_08_08.c
index 4dc488348..43117a84d 100644
--- a/src/osmo-bsc/gsm_08_08.c
+++ b/src/osmo-bsc/gsm_08_08.c
@@ -323,8 +323,8 @@ paging:
subscr = extract_sub(conn, msg);
if (!subscr) {
- LOGP(DMSC, LOGL_ERROR, "Got paged but no subscriber found.\n");
- return NULL;
+ LOGP(DMSC, LOGL_INFO, "Got paging response but no subscriber found, will now (blindly) deliver the paging response to the first configured MSC!\n");
+ goto blind;
}
pag_msc = paging_get_msc(conn_get_bts(conn), subscr);
@@ -344,7 +344,20 @@ paging:
return msc;
}
- LOGP(DMSC, LOGL_ERROR, "Got paged but no request found.\n");
+ LOGP(DMSC, LOGL_INFO, "Got paging response but no request found, will now (blindly) deliver the paging response to the first configured MSC!\n");
+
+blind:
+ /* In the case of an MT CSFB call we will get a paging response from
+ * the BTS without a preceding paging request via A-Interface. In those
+ * cases the MSC will page the subscriber via SGs interface, so the BSC
+ * can not know about the paging in advance. In those cases we can not
+ * know the MSC which is in charge. The only meaningful option we have
+ * is to deliver the paging response to the first configured MSC
+ * blindly. */
+ msc = llist_first_entry_or_null(&bsc->mscs, struct bsc_msc_data, entry);
+ if (msc)
+ return msc;
+ LOGP(DMSC, LOGL_ERROR, "Unable to find any suitable MSC to deliver paging response!\n");
return NULL;
}