dexter has uploaded this change for review. ( https://gerrit.osmocom.org/11307


Change subject: gsm_04_08_cc: Add global guard timer for MNCC
......................................................................

gsm_04_08_cc: Add global guard timer for MNCC

The external MNCC handler may hang indefinitely in cases where the remote
end of the MNCC ceases to work properly. Add a global guard timer to
make sure the call reaches ACTIVE state.

Change-Id: I7375d1e17cd746aac4eadfe1e587e82cf1630d3d
Related: OS#3599
---
M include/osmocom/msc/transaction.h
M src/libmsc/gsm_04_08_cc.c
M tests/msc_vlr/msc_vlr_test_call.err
3 files changed, 60 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/07/11307/1

diff --git a/include/osmocom/msc/transaction.h 
b/include/osmocom/msc/transaction.h
index 4ffb468..b7d7971 100644
--- a/include/osmocom/msc/transaction.h
+++ b/include/osmocom/msc/transaction.h
@@ -69,6 +69,7 @@
                        int Tcurrent;           /* current CC timer */
                        int T308_second;        /* used to send release again */
                        struct osmo_timer_list timer;
+                       struct osmo_timer_list timer_guard;
                        struct gsm_mncc msg;    /* stores 
setup/disconnect/release message */
                } cc;
                struct {
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c
index 19e6cba..7410947 100644
--- a/src/libmsc/gsm_04_08_cc.c
+++ b/src/libmsc/gsm_04_08_cc.c
@@ -73,6 +73,35 @@

 static uint32_t new_callref = 0x80000001;

+#define GUARD_TIMEOUT 65
+
+static void gsm48_cc_guard_timeout(void *arg)
+{
+       struct gsm_trans *trans = arg;
+       DEBUGP(DCC, "guard timeout for subscr %s\n",
+              vlr_subscr_msisdn_or_name(trans->vsub));
+       trans_free(trans);
+       return;
+}
+
+static void gsm48_stop_guard_timer(struct gsm_trans *trans)
+{
+       if (osmo_timer_pending(&trans->cc.timer_guard)) {
+               DEBUGP(DCC, "stopping pending guard timer for subscr %s\n",
+                      vlr_subscr_msisdn_or_name(trans->vsub));
+               osmo_timer_del(&trans->cc.timer_guard);
+       }
+}
+
+static void gsm48_start_guard_timer(struct gsm_trans *trans)
+{
+       if (osmo_timer_pending(&trans->cc.timer_guard))
+               gsm48_stop_guard_timer(trans);
+       DEBUGP(DCC, "starting guard timer with %d seconds for subscr %s\n",
+              GUARD_TIMEOUT, vlr_subscr_msisdn_or_name(trans->vsub));
+       osmo_timer_setup(&trans->cc.timer_guard, gsm48_cc_guard_timeout, trans);
+       osmo_timer_schedule(&trans->cc.timer_guard, GUARD_TIMEOUT, 0);
+}

 /* Call Control */

@@ -149,6 +178,10 @@

        count_statistics(trans, state);
        trans->cc.state = state;
+
+       /* Stop the guard timer when a call reaches the active state */
+       if (state == GSM_CSTATE_ACTIVE)
+               gsm48_stop_guard_timer(trans);
 }

 static int gsm48_cc_tx_status(struct gsm_trans *trans, void *arg)
@@ -259,6 +292,8 @@
        }
        if (trans->cc.state != GSM_CSTATE_NULL)
                new_cc_state(trans, GSM_CSTATE_NULL);
+
+       gsm48_stop_guard_timer(trans);
 }

 static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg);
@@ -1970,6 +2005,8 @@
                log_set_context(LOG_CTX_VLR_SUBSCR, trans->vsub);
        }

+       gsm48_start_guard_timer(trans);
+
        if (trans->conn)
                conn = trans->conn;

diff --git a/tests/msc_vlr/msc_vlr_test_call.err 
b/tests/msc_vlr/msc_vlr_test_call.err
index 19cb25d..9c68ea5 100644
--- a/tests/msc_vlr/msc_vlr_test_call.err
+++ b/tests/msc_vlr/msc_vlr_test_call.err
@@ -287,6 +287,7 @@
 DREF MSISDN:42342: MSC conn use - dtap == 1 (0x10: trans_cc)
 - MNCC says that's fine
 DMNCC receive message MNCC_CALL_PROC_REQ
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 08 sub 42342) Received 'MNCC_CALL_PROC_REQ' from MNCC in state 1 
(INITIATED)
 DCC (ti 08 sub MSISDN:42342) new state INITIATED -> MO_CALL_PROC
 DMSC msc_tx 2 bytes to MSISDN:42342 via RAN_UTRAN_IU
@@ -296,12 +297,16 @@
 - Total time passed: 1.000023 s
 - The other call leg got established (not shown here), MNCC tells us so
 DMNCC receive message MNCC_ALERT_REQ
+DCC stopping pending guard timer for subscr 42342
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 08 sub 42342) Received 'MNCC_ALERT_REQ' from MNCC in state 3 
(MO_CALL_PROC)
 DCC (ti 08 sub MSISDN:42342) new state MO_CALL_PROC -> CALL_DELIVERED
 DMSC msc_tx 2 bytes to MSISDN:42342 via RAN_UTRAN_IU
 - DTAP --RAN_UTRAN_IU--> MS: GSM48_MT_CC_ALERTING: 8301
 - DTAP matches expected message
 DMNCC receive message MNCC_SETUP_RSP
+DCC stopping pending guard timer for subscr 42342
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 08 sub 42342) Received 'MNCC_SETUP_RSP' from MNCC in state 4 
(CALL_DELIVERED)
 DCC starting timer T313 with 30 seconds
 DCC (ti 08 sub MSISDN:42342) new state CALL_DELIVERED -> CONNECT_IND
@@ -314,6 +319,7 @@
 DRLL Dispatching 04.08 message GSM48_MT_CC_CONNECT_ACK (0x3:0xf)
 DCC stopping pending timer T313
 DCC (ti 08 sub MSISDN:42342) new state CONNECT_IND -> ACTIVE
+DCC stopping pending guard timer for subscr 42342
 DMNCC transmit message MNCC_SETUP_COMPL_IND
 DCC Sending 'MNCC_SETUP_COMPL_IND' to MNCC.
   MSC --> MNCC: callref 0x80000001: MNCC_SETUP_COMPL_IND
@@ -334,6 +340,7 @@
 DMM Subscr_Conn(CM_SERVICE_REQ:901700000010650){SUBSCR_CONN_S_COMMUNICATING}: 
Received Event SUBSCR_CONN_E_COMMUNICATING
 DREF MSISDN:42342: MSC conn use - dtap == 1 (0x10: trans_cc)
 DMNCC receive message MNCC_REL_REQ
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 08 sub 42342) Received 'MNCC_REL_REQ' from MNCC in state 12 
(DISCONNECT_IND)
 DCC starting timer T308 with 10 seconds
 DCC (ti 08 sub MSISDN:42342) new state DISCONNECT_IND -> RELEASE_REQ
@@ -349,6 +356,7 @@
   MSC --> MNCC: callref 0x80000001: MNCC_REL_CNF
   MS <--Call Release-- MSC: subscr=MSISDN:42342 callref=0x0
 DCC (ti 08 sub MSISDN:42342) new state RELEASE_REQ -> NULL
+DCC stopping pending guard timer for subscr 42342
 DREF VLR subscr MSISDN:42342 usage decreases to: 2
 DREF MSISDN:42342: MSC conn use - trans_cc == 1 (0x2: dtap)
 DMM Subscr_Conn(CM_SERVICE_REQ:901700000010650){SUBSCR_CONN_S_COMMUNICATING}: 
Received Event SUBSCR_CONN_E_COMMUNICATING
@@ -697,8 +705,10 @@
 DMM Subscr_Conn(PAGING_RESP:901700000010650){SUBSCR_CONN_S_COMMUNICATING}: 
Received Event SUBSCR_CONN_E_COMMUNICATING
 DREF MSISDN:42342: MSC conn use - dtap == 1 (0x10: trans_cc)
 DMNCC receive message MNCC_SETUP_COMPL_REQ
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 00 sub 42342) Received 'MNCC_SETUP_COMPL_REQ' from MNCC in state 8 
(CONNECT_REQUEST)
 DCC (ti 00 sub MSISDN:42342) new state CONNECT_REQUEST -> ACTIVE
+DCC stopping pending guard timer for subscr 42342
 DMSC msc_tx 2 bytes to MSISDN:42342 via RAN_UTRAN_IU
 - DTAP --RAN_UTRAN_IU--> MS: GSM48_MT_CC_CONNECT_ACK: 030f
 - DTAP matches expected message
@@ -717,6 +727,7 @@
 DMM Subscr_Conn(PAGING_RESP:901700000010650){SUBSCR_CONN_S_COMMUNICATING}: 
Received Event SUBSCR_CONN_E_COMMUNICATING
 DREF MSISDN:42342: MSC conn use - dtap == 1 (0x10: trans_cc)
 DMNCC receive message MNCC_REL_REQ
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 00 sub 42342) Received 'MNCC_REL_REQ' from MNCC in state 12 
(DISCONNECT_IND)
 DCC starting timer T308 with 10 seconds
 DCC (ti 00 sub MSISDN:42342) new state DISCONNECT_IND -> RELEASE_REQ
@@ -732,6 +743,7 @@
   MSC --> MNCC: callref 0x423: MNCC_REL_CNF
   MS <--Call Release-- MSC: subscr=MSISDN:42342 callref=0x0
 DCC (ti 00 sub MSISDN:42342) new state RELEASE_REQ -> NULL
+DCC stopping pending guard timer for subscr 42342
 DREF VLR subscr MSISDN:42342 usage decreases to: 2
 DREF MSISDN:42342: MSC conn use - trans_cc == 1 (0x2: dtap)
 DMM Subscr_Conn(PAGING_RESP:901700000010650){SUBSCR_CONN_S_COMMUNICATING}: 
Received Event SUBSCR_CONN_E_COMMUNICATING
@@ -1078,6 +1090,7 @@
 DCC stopping pending timer T301
   MS <--Call Release-- MSC: subscr=MSISDN:42342 callref=0x423
 DMNCC receive message MNCC_REL_REQ
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 00 sub 42342) Received 'MNCC_REL_REQ' from MNCC in state 7 
(CALL_RECEIVED)
 DCC starting timer T308 with 10 seconds
 DCC (ti 00 sub MSISDN:42342) new state CALL_RECEIVED -> RELEASE_REQ
@@ -1089,6 +1102,7 @@
   MSC --> MNCC: callref 0x423: MNCC_REL_CNF
 DCC stopping pending timer T308
 DCC (ti 00 sub MSISDN:42342) new state RELEASE_REQ -> NULL
+DCC stopping pending guard timer for subscr 42342
 DREF VLR subscr MSISDN:42342 usage decreases to: 2
 DREF MSISDN:42342: MSC conn use - trans_cc == 1 (0x100: release)
 - Iu Release --RAN_UTRAN_IU--> MS
@@ -1399,6 +1413,7 @@
 DREF MSISDN:42342: MSC conn use - dtap == 1 (0x10: trans_cc)
 - MNCC says that's fine
 DMNCC receive message MNCC_CALL_PROC_REQ
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 08 sub 42342) Received 'MNCC_CALL_PROC_REQ' from MNCC in state 1 
(INITIATED)
 DCC (ti 08 sub MSISDN:42342) new state INITIATED -> MO_CALL_PROC
 DMSC msc_tx 2 bytes to MSISDN:42342 via RAN_UTRAN_IU
@@ -1407,6 +1422,8 @@
   MS <--Call Assignment-- MSC: subscr=MSISDN:42342 callref=0x80000002
 - But the other side's MSISDN could not be resolved, MNCC tells us to cancel
 DMNCC receive message MNCC_REL_REQ
+DCC stopping pending guard timer for subscr 42342
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 08 sub 42342) Received 'MNCC_REL_REQ' from MNCC in state 3 
(MO_CALL_PROC)
 DCC starting timer T308 with 10 seconds
 DCC (ti 08 sub MSISDN:42342) new state MO_CALL_PROC -> RELEASE_REQ
@@ -1427,6 +1444,7 @@
   MSC --> MNCC: callref 0x80000002: MNCC_REL_CNF
   MS <--Call Release-- MSC: subscr=MSISDN:42342 callref=0x0
 DCC (ti 08 sub MSISDN:42342) new state RELEASE_REQ -> NULL
+DCC stopping pending guard timer for subscr 42342
 DREF VLR subscr MSISDN:42342 usage decreases to: 2
 DREF MSISDN:42342: MSC conn use - trans_cc == 1 (0x2: dtap)
 DMM Subscr_Conn(CM_SERVICE_REQ:901700000010650){SUBSCR_CONN_S_COMMUNICATING}: 
Received Event SUBSCR_CONN_E_COMMUNICATING
@@ -1743,6 +1761,7 @@
 DREF MSISDN:42342: MSC conn use - dtap == 1 (0x10: trans_cc)
 - MNCC says that's fine
 DMNCC receive message MNCC_CALL_PROC_REQ
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 08 sub 42342) Received 'MNCC_CALL_PROC_REQ' from MNCC in state 1 
(INITIATED)
 DCC (ti 08 sub MSISDN:42342) new state INITIATED -> MO_CALL_PROC
 DMSC msc_tx 2 bytes to MSISDN:42342 via RAN_UTRAN_IU
@@ -1751,6 +1770,8 @@
   MS <--Call Assignment-- MSC: subscr=MSISDN:42342 callref=0x80000003
 - But the other side's MSISDN could not be resolved, MNCC tells us to cancel
 DMNCC receive message MNCC_REL_REQ
+DCC stopping pending guard timer for subscr 42342
+DCC starting guard timer with 65 seconds for subscr 42342
 DCC (ti 08 sub 42342) Received 'MNCC_REL_REQ' from MNCC in state 3 
(MO_CALL_PROC)
 DCC starting timer T308 with 10 seconds
 DCC (ti 08 sub MSISDN:42342) new state MO_CALL_PROC -> RELEASE_REQ
@@ -1770,6 +1791,7 @@
 DCC Sending 'MNCC_REL_CNF' to MNCC.
   MSC --> MNCC: callref 0x80000003: MNCC_REL_CNF
 DCC (ti 08 sub MSISDN:42342) new state RELEASE_REQ -> NULL
+DCC stopping pending guard timer for subscr 42342
 DREF VLR subscr MSISDN:42342 usage decreases to: 2
 DREF MSISDN:42342: MSC conn use - trans_cc == 0 (0x0: )
 DMM Subscr_Conn(CM_SERVICE_REQ:901700000010650){SUBSCR_CONN_S_COMMUNICATING}: 
Received Event SUBSCR_CONN_E_UNUSED

--
To view, visit https://gerrit.osmocom.org/11307
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I7375d1e17cd746aac4eadfe1e587e82cf1630d3d
Gerrit-Change-Number: 11307
Gerrit-PatchSet: 1
Gerrit-Owner: dexter <pma...@sysmocom.de>

Reply via email to