aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-03-10 02:11:25 +0100
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-03-16 15:32:34 +0100
commitc1ebe963f44006fe8b60304dcceeb22c5d14c2e3 (patch)
treebea32b1ed127b5da846c9f5e7bdb0ed6a1ded151 /openbsc
parent3e82738b740830f53ac552f4c51430f1fd434684 (diff)
more specifically conclude cm service requests
Don't end a CM Service Request "lock" too indiscriminately. Trigger only on new transactions that start. Change-Id: I4f64b8d91cfb1e61be4563594b2d6b23144af5bc
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/include/openbsc/gsm_04_08.h3
-rw-r--r--openbsc/src/libmsc/gsm_04_08.c16
-rw-r--r--openbsc/src/libmsc/gsm_04_11.c1
-rw-r--r--openbsc/src/libmsc/msc_ifaces.c1
-rw-r--r--openbsc/src/libmsc/ussd.c2
5 files changed, 11 insertions, 12 deletions
diff --git a/openbsc/include/openbsc/gsm_04_08.h b/openbsc/include/openbsc/gsm_04_08.h
index 0cd8ea171..82026798e 100644
--- a/openbsc/include/openbsc/gsm_04_08.h
+++ b/openbsc/include/openbsc/gsm_04_08.h
@@ -39,6 +39,9 @@ static inline void set_radio_link_timeout(struct gsm48_cell_options *cell_option
cell_options->radio_link_timeout = (value >> 2) - 1;
}
+void cm_service_request_concludes(struct gsm_subscriber_connection *conn,
+ struct msgb *msg);
+
/* config options controlling the behaviour of the lower leves */
void gsm0408_allow_everyone(int allow);
void gsm0408_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause);
diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c
index f39785e8d..68ac3cf86 100644
--- a/openbsc/src/libmsc/gsm_04_08.c
+++ b/openbsc/src/libmsc/gsm_04_08.c
@@ -3464,6 +3464,7 @@ static int gsm0408_rcv_cc(struct gsm_subscriber_connection *conn, struct msgb *m
}
/* Assign transaction */
trans->conn = msc_conn_get(conn);
+ cm_service_request_concludes(conn, msg);
}
/* find function for current state and message */
@@ -3520,13 +3521,13 @@ static bool msg_is_initially_permitted(const struct gsm48_hdr *hdr)
return false;
}
-static void
-cm_service_request_concludes(struct gsm_subscriber_connection *conn,
- struct msgb *msg)
+void cm_service_request_concludes(struct gsm_subscriber_connection *conn,
+ struct msgb *msg)
{
/* If a CM Service Request was received before, this is the request the
* conn was opened for. No need to wait for further messages. */
+
if (!conn->received_cm_service_request)
return;
@@ -3580,15 +3581,6 @@ int gsm0408_dispatch(struct gsm_subscriber_connection *conn, struct msgb *msg)
return silent_call_rx(conn, msg);
#endif
- /* Should we receive RR messages like an odd UTRAN Classmark Change,
- * don't close the CM Service Request initiated conn yet. All others
- * constitue a service and the conn can be closed, or something unknown
- * is happening and we'd rather close the conn instead of idling around
- * (we may add more specific exceptions as they become apparent). */
- if (pdisc != GSM48_PDISC_RR) {
- cm_service_request_concludes(conn, msg);
- }
-
switch (pdisc) {
case GSM48_PDISC_CC:
rc = gsm0408_rcv_cc(conn, msg);
diff --git a/openbsc/src/libmsc/gsm_04_11.c b/openbsc/src/libmsc/gsm_04_11.c
index cb02be2f7..b567e235e 100644
--- a/openbsc/src/libmsc/gsm_04_11.c
+++ b/openbsc/src/libmsc/gsm_04_11.c
@@ -835,6 +835,7 @@ int gsm0411_rcv_sms(struct gsm_subscriber_connection *conn,
trans->conn = msc_conn_get(conn);
new_trans = 1;
+ cm_service_request_concludes(conn, msg);
}
/* 5.4: For MO, if a CP-DATA is received for a new
diff --git a/openbsc/src/libmsc/msc_ifaces.c b/openbsc/src/libmsc/msc_ifaces.c
index d3390fcb2..f3d11fbbc 100644
--- a/openbsc/src/libmsc/msc_ifaces.c
+++ b/openbsc/src/libmsc/msc_ifaces.c
@@ -86,6 +86,7 @@ int msc_gsm48_tx_mm_serv_rej(struct gsm_subscriber_connection *conn,
enum gsm48_reject_value value)
{
struct msgb *msg;
+ conn->received_cm_service_request = false;
msg = gsm48_create_mm_serv_rej(value);
if (!msg) {
diff --git a/openbsc/src/libmsc/ussd.c b/openbsc/src/libmsc/ussd.c
index 8c7700b11..81a356690 100644
--- a/openbsc/src/libmsc/ussd.c
+++ b/openbsc/src/libmsc/ussd.c
@@ -54,6 +54,8 @@ int handle_rcv_ussd(struct gsm_subscriber_connection *conn, struct msgb *msg)
* As we answer everytying synchronously so far, there's no need
* yet */
+ cm_service_request_concludes(conn, msg);
+
memset(&req, 0, sizeof(req));
gh = msgb_l3(msg);
rc = gsm0480_decode_ss_request(gh, msgb_l3len(msg), &req);