From c1ebe963f44006fe8b60304dcceeb22c5d14c2e3 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Fri, 10 Mar 2017 02:11:25 +0100 Subject: 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 --- openbsc/src/libmsc/gsm_04_08.c | 16 ++++------------ openbsc/src/libmsc/gsm_04_11.c | 1 + openbsc/src/libmsc/msc_ifaces.c | 1 + openbsc/src/libmsc/ussd.c | 2 ++ 4 files changed, 8 insertions(+), 12 deletions(-) (limited to 'openbsc/src') 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); -- cgit v1.2.3