--- channels/ooh323c/src/ooCalls.c 2009-07-31 00:36:24.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCalls.c 2009-07-31 01:13:01.000000000 +0400 @@ -99,6 +99,8 @@ if (OO_TESTFLAG(gH323ep.flags, OO_M_MEDIAWAITFORCONN)) OO_SETFLAG (call->flags, OO_M_MEDIAWAITFORCONN); + call->fsSent = FALSE; + // May 20090713. Fix it for Video session OO_SETFLAG(call->flags, OO_M_AUDIOSESSION); --- channels/ooh323c/src/ooh323.c 2009-07-31 00:36:24.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh323.c 2009-07-31 17:04:06.000000000 +0400 @@ -1321,7 +1321,6 @@ OOTimer *pTimer=NULL; int type = q931Msg->messageType; struct timespec ts; - int gkWaits; switch(type) { case Q931SetupMsg: /* SETUP message is received */ @@ -1353,13 +1352,11 @@ // ast_mutex_lock(&call->Lock); ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); - for (gkWaits = 0; gkWaits < 1000; gkWaits++) { - clock_gettime(CLOCK_REALTIME, &ts); - ts.tv_nsec += 24000000; - sem_timedwait(&call->gkWait, &ts); - if (call->callState != OO_CALL_WAITING_ADMISSION) - break; - } + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += 24; + sem_timedwait(&call->gkWait, &ts); + if (call->callState == OO_CALL_WAITING_ADMISSION) + call->callState = OO_CALL_CLEAR; // ast_mutex_unlock(&call->Lock); } --- channels/ooh323c/src/ooCalls.h 2009-07-31 00:36:24.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCalls.h 2009-07-31 01:12:04.000000000 +0400 @@ -146,6 +146,7 @@ sem_t gkWait; ast_mutex_t Lock; OOBOOL Monitor; + OOBOOL fsSent; OOSOCKET CmdChan; OOSOCKET cmdSock; void* CmdChanLock; --- channels/ooh323c/src/ooq931.c 2009-07-31 00:36:24.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooq931.c 2009-07-31 17:03:41.000000000 +0400 @@ -871,16 +871,6 @@ (*fsElem)[k].data = pData; } - /* free the stored fast start response */ - if(pQ931msg->messageType == Q931ConnectMsg) { - for(k = 0; k < pCall->pFastStartRes->n; k ++) { - memFreePtr(pCall->pctxt, pCall->pFastStartRes->elem[k].data); - } - memFreePtr(pCall->pctxt, pCall->pFastStartRes->elem); - memFreePtr(pCall->pctxt, pCall->pFastStartRes); - pCall->pFastStartRes = NULL; - } - return ASN_OK; } @@ -1415,13 +1405,16 @@ vendor->vendor.t35Extension = gH323ep.t35Extension; vendor->vendor.manufacturerCode = gH323ep.manufacturerCode; - ret = ooSetFastStartResponse(call, q931msg, - &alerting->fastStart.n, &alerting->fastStart.elem); - if(ret != ASN_OK) { return ret; } - if(alerting->fastStart.n > 0) { - alerting->m.fastStartPresent = TRUE; - } - else { + if (!call->fsSent) { + ret = ooSetFastStartResponse(call, q931msg, + &alerting->fastStart.n, &alerting->fastStart.elem); + if(ret != ASN_OK) { return ret; } + if(alerting->fastStart.n > 0) { + alerting->m.fastStartPresent = TRUE; + call->fsSent = TRUE; + } else + alerting->m.fastStartPresent = FALSE; + } else { alerting->m.fastStartPresent = FALSE; } @@ -1522,17 +1515,19 @@ vendor->vendor.t35Extension = gH323ep.t35Extension; vendor->vendor.manufacturerCode = gH323ep.manufacturerCode; - ret = ooSetFastStartResponse(call, q931msg, - &progress->fastStart.n, &progress->fastStart.elem); - if(ret != ASN_OK) { return ret; } - if(progress->fastStart.n > 0) { - progress->m.fastStartPresent = TRUE; - } - else { + if (!call->fsSent) { + ret = ooSetFastStartResponse(call, q931msg, + &progress->fastStart.n, &progress->fastStart.elem); + if(ret != ASN_OK) { return ret; } + if(progress->fastStart.n > 0) { + progress->m.fastStartPresent = TRUE; + call->fsSent = TRUE; + } else + progress->m.fastStartPresent = FALSE; + } else { progress->m.fastStartPresent = FALSE; } - - OOTRACEDBGA3("Built Alerting (%s, %s)\n", call->callType, call->callToken); + OOTRACEDBGA3("Built Progress (%s, %s)\n", call->callType, call->callToken); ret = ooSendH225Msg(call, q931msg); if(ret != OO_OK) @@ -1861,16 +1856,31 @@ vendor->versionId.numocts); } - ret = ooSetFastStartResponse(call, q931msg, - &connect->fastStart.n, &connect->fastStart.elem); - if(ret != ASN_OK) { return ret; } - if(connect->fastStart.n > 0) { - connect->m.fastStartPresent = TRUE; - } - else { + if (!call->fsSent) { + ret = ooSetFastStartResponse(call, q931msg, + &connect->fastStart.n, &connect->fastStart.elem); + if(ret != ASN_OK) { return ret; } + if(connect->fastStart.n > 0) { + connect->m.fastStartPresent = TRUE; + call->fsSent = TRUE; + } else + connect->m.fastStartPresent = FALSE; + } else { connect->m.fastStartPresent = FALSE; } + /* free the stored fast start response */ + if(call->pFastStartRes) { + int k; + for(k = 0; k < call->pFastStartRes->n; k ++) { + memFreePtr(call->pctxt, call->pFastStartRes->elem[k].data); + } + memFreePtr(call->pctxt, call->pFastStartRes->elem); + memFreePtr(call->pctxt, call->pFastStartRes); + call->pFastStartRes = NULL; + } + + /* Add h245 listener address. Do not add H245 listener address in case of fast-start. */ if ((!OO_TESTFLAG(call->flags, OO_M_FASTSTART) || @@ -2040,7 +2050,6 @@ char tmp[30]="\0"; char *ip=NULL, *port = NULL; struct timespec ts; - int gkWaits; if(!dest) { @@ -2121,13 +2130,11 @@ call->callState = OO_CALL_WAITING_ADMISSION; // ast_mutex_lock(&call->Lock); ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); - for (gkWaits = 0; gkWaits < 1000; gkWaits++) { - clock_gettime(CLOCK_REALTIME, &ts); - ts.tv_nsec += 24000000; - sem_timedwait(&call->gkWait, &ts); - if (call->callState != OO_CALL_WAITING_ADMISSION) - break; - } + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += 24; + sem_timedwait(&call->gkWait, &ts); + if (call->callState == OO_CALL_WAITING_ADMISSION) + call->callState = OO_CALL_CLEAR; // ast_mutex_unlock(&call->Lock); }