diff options
author | Philipp Maier <pmaier@sysmocom.de> | 2019-08-14 15:14:28 +0200 |
---|---|---|
committer | Philipp Maier <pmaier@sysmocom.de> | 2019-08-28 13:56:59 +0200 |
commit | 9508e2232f72a368ab87b5903e0764c4ae4985ad (patch) | |
tree | f3ee1e1ebb856d3092f7065b67496a61fb6a94ef | |
parent | a8ba7a7badc3f13c23042a2a9de1ceb36184350b (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.c | 19 |
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; } |