From 1ae6d66b92e0402759db2db55d5e6535d9e506b4 Mon Sep 17 00:00:00 2001 From: Alexandr Anikin Date: Tue, 30 Aug 2011 21:16:30 +0000 Subject: [PATCH] cleanups in ACF/ARJ GK replies processing fixed long (24 sec) pause if acf/arj proccessed before ast_cond_wait called to wait this git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@333947 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- addons/ooh323c/src/ooCalls.c | 1 + addons/ooh323c/src/ooCalls.h | 1 + addons/ooh323c/src/ooGkClient.c | 21 ++++++++++++++++++--- addons/ooh323c/src/oochannels.c | 1 + addons/ooh323c/src/ooh323.c | 26 +++++++++++++++----------- addons/ooh323c/src/ooq931.c | 29 +++++++++++++++++------------ 6 files changed, 53 insertions(+), 26 deletions(-) diff --git a/addons/ooh323c/src/ooCalls.c b/addons/ooh323c/src/ooCalls.c index f92464852b..046b5fcf4c 100644 --- a/addons/ooh323c/src/ooCalls.c +++ b/addons/ooh323c/src/ooCalls.c @@ -63,6 +63,7 @@ OOH323CallData* ooCreateCall(char* type, char*callToken) } memset(call, 0, sizeof(OOH323CallData)); ast_cond_init(&call->gkWait, NULL); + ast_mutex_init(&call->GkLock); ast_mutex_init(&call->Lock); call->pctxt = pctxt; call->msgctxt = msgctxt; diff --git a/addons/ooh323c/src/ooCalls.h b/addons/ooh323c/src/ooCalls.h index 5c26040879..bbba91c93d 100644 --- a/addons/ooh323c/src/ooCalls.h +++ b/addons/ooh323c/src/ooCalls.h @@ -151,6 +151,7 @@ typedef struct OOH323CallData { OOCTXT *msgctxt; pthread_t callThread; ast_cond_t gkWait; + ast_mutex_t GkLock; ast_mutex_t Lock; OOBOOL Monitor; OOBOOL fsSent; diff --git a/addons/ooh323c/src/ooGkClient.c b/addons/ooh323c/src/ooGkClient.c index f3e3d16e8b..676298b442 100644 --- a/addons/ooh323c/src/ooGkClient.c +++ b/addons/ooh323c/src/ooGkClient.c @@ -430,7 +430,7 @@ int ooGkClientReceive(ooGkClient *pGkClient) if(iRet != OO_OK) { OOTRACEERR1("Error: Failed to handle received RAS message\n"); - //pGkClient->state = GkClientFailed; + pGkClient->state = GkClientFailed; } memReset(pctxt); } @@ -1920,6 +1920,8 @@ int ooGkClientHandleAdmissionConfirm OOTimer *pTimer = NULL; char ip[20]; + ast_mutex_lock(&pGkClient->Lock); + /* Search call in pending calls list */ for(x=0 ; xcallsPendingList.count; x++) { @@ -1930,6 +1932,9 @@ int ooGkClientHandleAdmissionConfirm OOTRACEDBGC3("Found Pending call(%s, %s)\n", pCallAdmInfo->call->callType, pCallAdmInfo->call->callToken); + + ast_mutex_lock(&pCallAdmInfo->call->GkLock); + /* Populate Remote IP */ if(pAdmissionConfirm->destCallSignalAddress.t != T_H225TransportAddress_ipAddress) @@ -1938,6 +1943,9 @@ int ooGkClientHandleAdmissionConfirm "Gatekeeper is not an IPv4 address\n"); OOTRACEINFO1("Ignoring ACF, will wait for timeout and retransmit " "ARQ\n"); + ast_mutex_unlock(&pCallAdmInfo->call->GkLock); + ast_mutex_unlock(&pGkClient->Lock); + ast_cond_signal(&pCallAdmInfo->call->gkWait); return OO_FAILED; } ipAddress = pAdmissionConfirm->destCallSignalAddress.u.ipAddress; @@ -1996,15 +2004,15 @@ int ooGkClientHandleAdmissionConfirm pCallAdmInfo->call->callToken); pCallAdmInfo->call->callState = OO_CALL_CONNECTING; - /* ooH323CallAdmitted( pCallAdmInfo->call); */ dListRemove(&pGkClient->callsPendingList, pNode); dListAppend(&pGkClient->ctxt, &pGkClient->callsAdmittedList, pNode->data); memFreePtr(&pGkClient->ctxt, pNode); + ast_mutex_unlock(&pCallAdmInfo->call->GkLock); + ast_mutex_unlock(&pGkClient->Lock); ast_cond_signal(&pCallAdmInfo->call->gkWait); return OO_OK; - break; } else { @@ -2013,6 +2021,7 @@ int ooGkClientHandleAdmissionConfirm } OOTRACEERR1("Error: Failed to process ACF as there is no corresponding " "pending call\n"); + ast_mutex_unlock(&pGkClient->Lock); return OO_OK; } @@ -2026,6 +2035,8 @@ int ooGkClientHandleAdmissionReject OOH323CallData *call=NULL; OOTimer *pTimer = NULL; + ast_mutex_lock(&pGkClient->Lock); + /* Search call in pending calls list */ for(x=0 ; xcallsPendingList.count; x++) { @@ -2042,6 +2053,7 @@ int ooGkClientHandleAdmissionReject OOTRACEWARN2("Received admission reject with request number %d can not" " be matched with any pending call.\n", pAdmissionReject->requestSeqNum); + ast_mutex_unlock(&pGkClient->Lock); return OO_OK; } else{ @@ -2050,6 +2062,7 @@ int ooGkClientHandleAdmissionReject memFreePtr(&pGkClient->ctxt, pCallAdmInfo); memFreePtr(&pGkClient->ctxt, pNode); } + ast_mutex_lock(&pCallAdmInfo->call->GkLock); /* Delete ARQ timer */ for(y=0; ytimerList.count; y++) @@ -2114,6 +2127,8 @@ int ooGkClientHandleAdmissionReject break; } + ast_mutex_unlock(&pCallAdmInfo->call->GkLock); + ast_mutex_unlock(&pGkClient->Lock); ast_cond_signal(&pCallAdmInfo->call->gkWait); return OO_OK; } diff --git a/addons/ooh323c/src/oochannels.c b/addons/ooh323c/src/oochannels.c index 8fa8510c3f..f66624c189 100644 --- a/addons/ooh323c/src/oochannels.c +++ b/addons/ooh323c/src/oochannels.c @@ -949,6 +949,7 @@ int ooMonitorCallChannels(OOH323CallData *call) ast_mutex_lock(&call->Lock); ast_mutex_unlock(&call->Lock); ast_mutex_destroy(&call->Lock); + ast_mutex_destroy(&call->GkLock); ast_cond_destroy(&call->gkWait); pctxt = call->pctxt; freeContext(pctxt); diff --git a/addons/ooh323c/src/ooh323.c b/addons/ooh323c/src/ooh323.c index 33751067a0..dd0cf51983 100644 --- a/addons/ooh323c/src/ooh323.c +++ b/addons/ooh323c/src/ooh323.c @@ -1628,12 +1628,15 @@ int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg) case Q931SetupMsg: /* SETUP message is received */ OOTRACEINFO3("Received SETUP message (%s, %s)\n", call->callType, call->callToken); - ooOnReceivedSetup(call, q931Msg); - + ret = ooOnReceivedSetup(call, q931Msg); + if (ret != OO_OK) { + call->callState = OO_CALL_CLEAR; + } else { + /* H225 message callback */ - if(gH323ep.h225Callbacks.onReceivedSetup) - ret = gH323ep.h225Callbacks.onReceivedSetup(call, q931Msg); - + if(gH323ep.h225Callbacks.onReceivedSetup) + ret = gH323ep.h225Callbacks.onReceivedSetup(call, q931Msg); + } /* Free up the mem used by the received message, as it's processing is done. */ @@ -1651,23 +1654,24 @@ int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg) if(gH323ep.gkClient->state == GkClientRegistered) { call->callState = OO_CALL_WAITING_ADMISSION; - ast_mutex_lock(&call->Lock); ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); - tv = ast_tvnow(); + tv = ast_tvnow(); ts.tv_sec = tv.tv_sec + 24; - ts.tv_nsec = tv.tv_usec * 1000; - ast_cond_timedwait(&call->gkWait, &call->Lock, &ts); + ts.tv_nsec = tv.tv_usec * 1000; + ast_mutex_lock(&call->GkLock); + if (call->callState == OO_CALL_WAITING_ADMISSION) + ast_cond_timedwait(&call->gkWait, &call->GkLock, &ts); if (call->callState == OO_CALL_WAITING_ADMISSION) call->callState = OO_CALL_CLEAR; - ast_mutex_unlock(&call->Lock); + ast_mutex_unlock(&call->GkLock); } else { - /* TODO: Should send Release complete with reject reason */ OOTRACEERR1("Error:Ignoring incoming call as not yet" "registered with Gk\n"); call->callState = OO_CALL_CLEAR; + call->callEndReason = OO_REASON_GK_UNREACHABLE; } } if (call->callState < OO_CALL_CLEAR) { diff --git a/addons/ooh323c/src/ooq931.c b/addons/ooh323c/src/ooq931.c index dddcf15ec0..a017256358 100644 --- a/addons/ooh323c/src/ooq931.c +++ b/addons/ooh323c/src/ooq931.c @@ -2204,19 +2204,24 @@ int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts) if(gH323ep.gkClient && !OO_TESTFLAG(call->flags, OO_M_DISABLEGK)) { - /* No need to check registration status here as it is already checked for - MakeCall command */ - - call->callState = OO_CALL_WAITING_ADMISSION; - ast_mutex_lock(&call->Lock); - ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); - tv = ast_tvnow(); - ts.tv_sec = tv.tv_sec + 24; - ts.tv_nsec = tv.tv_usec * 1000; - ast_cond_timedwait(&call->gkWait, &call->Lock, &ts); - if (call->callState == OO_CALL_WAITING_ADMISSION) + if(gH323ep.gkClient->state == GkClientRegistered) { + call->callState = OO_CALL_WAITING_ADMISSION; + ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); + tv = ast_tvnow(); + ts.tv_sec = tv.tv_sec + 24; + ts.tv_nsec = tv.tv_usec * 1000; + ast_mutex_lock(&call->GkLock); + if (call->callState == OO_CALL_WAITING_ADMISSION) + ast_cond_timedwait(&call->gkWait, &call->GkLock, &ts); + if (call->callState == OO_CALL_WAITING_ADMISSION) call->callState = OO_CALL_CLEAR; - ast_mutex_unlock(&call->Lock); + ast_mutex_unlock(&call->GkLock); + } else { + OOTRACEERR1("Error:Aborting outgoing call as not yet" + "registered with Gk\n"); + call->callState = OO_CALL_CLEAR; + call->callEndReason = OO_REASON_GK_UNREACHABLE; + } } -- 2.47.2