aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmsc
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc/src/libmsc')
-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
4 files changed, 8 insertions, 12 deletions
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);