From d0a80878e85e5a11ea5d13704240a6fcb678ce39 Mon Sep 17 00:00:00 2001 From: Kurtis Heimerl Date: Sat, 10 Mar 2012 02:42:55 +0000 Subject: [PATCH] Fixes #580 in public. We had some transactions getting stuck in the transaction table, but no longer. We more aggressively clear the table. git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@3300 19bc5d8c-e614-43d4-8b26-e1612bc8e597 --- Control/CallControl.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Control/CallControl.cpp b/Control/CallControl.cpp index dfa7780..bf5e235 100644 --- a/Control/CallControl.cpp +++ b/Control/CallControl.cpp @@ -326,7 +326,7 @@ bool callManagementDispatchGSM(TransactionEntry *transaction, GSM::LogicalChanne transaction->MODSendBYE(); transaction->MODWaitForBYEOK(); } - else { //ok, call isn't yet active. What we send depends on who sent it + else { //this is the end if the call isn't setup yet if (transaction->instigator()){ //if we instigated the call, send a cancel transaction->MODSendCANCEL(); transaction->MODWaitForCANCELOK(); @@ -338,6 +338,8 @@ bool callManagementDispatchGSM(TransactionEntry *transaction, GSM::LogicalChanne transaction->MODSendUnavail(); //enventually wait for ACK here -kurtis } + transaction->GSMState(GSM::NullState); + return true; } return false; } @@ -835,7 +837,7 @@ void Control::MOCController(TransactionEntry *transaction, GSM::TCHFACCHLogicalC // FIXME -- We should also have a SIP.Timer.B timeout on this end. while (transaction->GSMState()!=GSM::CallReceived) { - if (updateGSMSignalling(transaction,TCH)) return; + if (updateGSMSignalling(transaction,TCH)) return abortAndRemoveCall(transaction,TCH,GSM::L3Cause(0x15)); if (transaction->clearingGSM()) return abortAndRemoveCall(transaction,TCH,GSM::L3Cause(0x7F)); LOG(INFO) << "wait for Ringing or OK"; @@ -887,7 +889,7 @@ void Control::MOCController(TransactionEntry *transaction, GSM::TCHFACCHLogicalC LOG(DEBUG) << "SIP state "<< state; // check GSM state - if (updateGSMSignalling(transaction,TCH)) return; + if (updateGSMSignalling(transaction,TCH)) return abortAndRemoveCall(transaction,TCH,GSM::L3Cause(0x15)); if (transaction->clearingGSM()) return abortAndRemoveCall(transaction,TCH,GSM::L3Cause(0x7F)); // parse out SIP state @@ -1053,7 +1055,7 @@ void Control::MTCController(TransactionEntry *transaction, GSM::TCHFACCHLogicalC // Get the alerting message. LOG(INFO) << "waiting for GSM Alerting and Connect"; while (transaction->GSMState()!=GSM::Active) { - if (updateGSMSignalling(transaction,TCH,1000)) return; + if (updateGSMSignalling(transaction,TCH,1000)) return abortAndRemoveCall(transaction,TCH,GSM::L3Cause(0x15)); if (transaction->GSMState()==GSM::Active) break; if (transaction->GSMState()==GSM::CallReceived) { LOG(DEBUG) << "sending SIP Ringing"; @@ -1086,7 +1088,7 @@ void Control::MTCController(TransactionEntry *transaction, GSM::TCHFACCHLogicalC SIP::SIPState state = transaction->MTCSendOK(RTPPorts,SIP::RTPGSM610); while (state!=SIP::Active) { LOG(DEBUG) << "wait for SIP OKAY-ACK"; - if (updateGSMSignalling(transaction,TCH)) return; + if (updateGSMSignalling(transaction,TCH)) return abortAndRemoveCall(transaction,TCH,GSM::L3Cause(0x15)); state = transaction->MTCWaitForACK(); LOG(DEBUG) << "SIP call state "<< state; switch (state) {