From 7914527929b5d87d18465b4c35ab93bec33f346a Mon Sep 17 00:00:00 2001 From: Alexandr Anikin Date: Tue, 30 Aug 2011 22:16:13 +0000 Subject: Merged revisions 333961-333962 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/10 ................ r333961 | may | 2011-08-31 01:21:53 +0400 (Wed, 31 Aug 2011) | 11 lines Merged revisions 333947 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r333947 | may | 2011-08-31 01:16:30 +0400 (Wed, 31 Aug 2011) | 5 lines cleanups in ACF/ARJ GK replies processing fixed long (24 sec) pause if acf/arj proccessed before ast_cond_wait called to wait this ........ ................ r333962 | may | 2011-08-31 01:53:42 +0400 (Wed, 31 Aug 2011) | 3 lines security fix. really drop call if signalling addr is not same as socket addr ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@333963 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 | 29 +++++++++++++++++------------ addons/ooh323c/src/ooq931.c | 29 +++++++++++++++++------------ 6 files changed, 55 insertions(+), 27 deletions(-) (limited to 'addons/ooh323c/src') diff --git a/addons/ooh323c/src/ooCalls.c b/addons/ooh323c/src/ooCalls.c index f92464852..046b5fcf4 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 ce7f6e5a8..a81f536f4 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 36ef8d0c3..cfc7f33e6 100644 --- a/addons/ooh323c/src/ooGkClient.c +++ b/addons/ooh323c/src/ooGkClient.c @@ -431,7 +431,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); } @@ -1921,6 +1921,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++) { @@ -1931,6 +1933,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) @@ -1939,6 +1944,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; @@ -2000,15 +2008,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 { @@ -2017,6 +2025,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; } @@ -2030,6 +2039,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++) { @@ -2046,6 +2057,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{ @@ -2054,6 +2066,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++) @@ -2118,6 +2131,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 e3ac30fbb..8a46f0b7e 100644 --- a/addons/ooh323c/src/oochannels.c +++ b/addons/ooh323c/src/oochannels.c @@ -960,6 +960,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 349c21f29..08a4b1d1e 100644 --- a/addons/ooh323c/src/ooh323.c +++ b/addons/ooh323c/src/ooh323.c @@ -371,7 +371,7 @@ int ooOnReceivedSetup(OOH323CallData *call, Q931Message *q931Msg) H225TransportAddress_ip6Address_ip *ip6 = NULL; Q931InformationElement* pDisplayIE=NULL; OOAliases *pAlias=NULL; - char remoteIP[2+8*4+7]; + char remoteIP[2+8*4+7] = ""; call->callReference = q931Msg->callReference; @@ -529,6 +529,7 @@ int ooOnReceivedSetup(OOH323CallData *call, Q931Message *q931Msg) OOTRACEERR5("ERROR: Security denial remote sig IP isn't a socket ip, %s not %s " "(%s, %s)\n", remoteIP, call->remoteIP, call->callType, call->callToken); + return OO_FAILED; } /* check for fast start */ @@ -1638,12 +1639,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. */ @@ -1661,23 +1665,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 efef2747c..9fe66124b 100644 --- a/addons/ooh323c/src/ooq931.c +++ b/addons/ooh323c/src/ooq931.c @@ -2266,19 +2266,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; + } } -- cgit v1.2.3