aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-10-11 00:50:05 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-02-23 22:27:39 +0100
commit34cede93506a3c88d19726a1f4cf7a0b1644e7b8 (patch)
tree0aefdf184109e1782a665060762c1d648c64d55e
parent046016fab5c9b0de1932b6a4a60ec020ce2a0d91 (diff)
IuCS: don't remove Iu conn until release
Don't remove the gsm_subscriber_connection without an Iu Release. From the 2G paradigm to close a subscriber connection as soon as nothing else is pending, osmo-msc frequently calls msc_release_connection() to see whether a conn has anything pending, or discards it. In 3G however, we so far don't actively release IuCS connections from the MSC side, but wait until the IuCS is released from the UE side. So the conn is often discarded even though the IuCS stays open and valid, which confuses the situation: before the UE releases a bit later, we would try to page the subscriber unsuccessfully, because the UE expects to already be connected. To first fix the discrepancy of Iu vs. subscr release, never discard gsm_subscriber_connections when msc_release_connection() is called. This creates a "lazy" CN that keeps connections open as long as the UE will tolerate. It is really fast in sending many SMS in close succession, but is certainly a bad CN design choice: we should rather stay lean on connections. A subsequent commit will change this, but I decided to keep this commit as a reference, for when we'd like to test situations that should re-use an established connection. Change-Id: I012378cfa432d791146db387554ec1909de05297
-rw-r--r--openbsc/src/libmsc/osmo_msc.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/openbsc/src/libmsc/osmo_msc.c b/openbsc/src/libmsc/osmo_msc.c
index 6e982d050..2d5f94b56 100644
--- a/openbsc/src/libmsc/osmo_msc.c
+++ b/openbsc/src/libmsc/osmo_msc.c
@@ -149,6 +149,10 @@ struct bsc_api *msc_bsc_api() {
/* conn release handling */
void msc_release_connection(struct gsm_subscriber_connection *conn)
{
+ /* For IuCS, always wait until the UE releases. */
+ if (conn->via_iface == IFACE_IU)
+ return;
+
/* skip when we are in release, e.g. due an error */
if (conn->in_release)
return;