--- channels/chan_ooh323.c 2009-07-04 00:11:07.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/chan_ooh323.c 2009-07-03 23:45:42.000000000 +0400 @@ -512,7 +512,7 @@ p->host = strdup(peer->ip); p->port = peer->port; /* Disable gk as we are going to call a known peer*/ - OO_SETFLAG(p->flags, H323_DISABLEGK); + /* OO_SETFLAG(p->flags, H323_DISABLEGK); */ if (ext) ast_copy_string(p->exten, ext, sizeof(p->exten)); @@ -551,23 +551,22 @@ ast_mutex_lock(&iflock); ooh323_destroy(p); ast_mutex_unlock(&iflock); - } else { - ast_mutex_lock(&p->lock); - p->callToken = (char*)malloc(AST_MAX_EXTENSION); - if(!p->callToken) - { - ast_mutex_unlock(&p->lock); - ast_mutex_lock(&iflock); - ooh323_destroy(p); - ast_mutex_unlock(&iflock); - ast_log(LOG_ERROR, "Failed to allocate memory for callToken\n"); - return NULL; /* TODO: need to clean/hangup?? */ - } + } else { + ast_mutex_lock(&p->lock); + p->callToken = (char*)malloc(AST_MAX_EXTENSION); + if(!p->callToken) { + ast_mutex_unlock(&p->lock); + ast_mutex_lock(&iflock); + ooh323_destroy(p); + ast_mutex_unlock(&iflock); + ast_log(LOG_ERROR, "Failed to allocate memory for callToken\n"); + return NULL; /* TODO: need to clean/hangup?? */ + } - ast_mutex_unlock(&p->lock); - ast_mutex_lock(&ooh323c_cmd_lock); - ooMakeCall(data, p->callToken, AST_MAX_EXTENSION, NULL); - ast_mutex_unlock(&ooh323c_cmd_lock); + ast_mutex_unlock(&p->lock); + ast_mutex_lock(&ooh323c_cmd_lock); + ooMakeCall(data, p->callToken, AST_MAX_EXTENSION, NULL); + ast_mutex_unlock(&ooh323c_cmd_lock); } restart_monitor(); @@ -826,13 +825,13 @@ if(OO_TESTFLAG(p->flags, H323_DISABLEGK)) { - for (i=0;i<160 && !isRunning(p->callToken);i++) usleep(12000); + for (i=0;i<480 && !isRunning(p->callToken);i++) usleep(12000); res = ooRunCall(destination, p->callToken, AST_MAX_EXTENSION, &opts); } else { - for (i=0;i<160 && !isRunning(p->callToken);i++) usleep(12000); + for (i=0;i<480 && !isRunning(p->callToken);i++) usleep(12000); res = ooRunCall(destination, p->callToken, AST_MAX_EXTENSION, NULL); } @@ -924,18 +923,21 @@ if (gH323Debug) ast_verbose("--- ooh323_answer\n"); - ast_mutex_lock(&p->lock); - if (ast->_state != AST_STATE_UP) { - ast_channel_lock(ast); - ast_setstate(ast, AST_STATE_UP); - if (option_debug) - ast_debug(1, "ooh323_answer(%s)\n", ast->name); - ast_channel_unlock(ast); - /* ast_mutex_lock(&ooh323c_cmd_lock); */ - ooAnswerCall(p->callToken); - /* ast_mutex_unlock(&ooh323c_cmd_lock); */ + if (p) { + + ast_mutex_lock(&p->lock); + if (ast->_state != AST_STATE_UP) { + ast_channel_lock(ast); + ast_setstate(ast, AST_STATE_UP); + if (option_debug) + ast_debug(1, "ooh323_answer(%s)\n", ast->name); + ast_channel_unlock(ast); + /* ast_mutex_lock(&ooh323c_cmd_lock); */ + ooAnswerCall(p->callToken); + /* ast_mutex_unlock(&ooh323c_cmd_lock); */ + } + ast_mutex_unlock(&p->lock); } - ast_mutex_unlock(&p->lock); if (gH323Debug) ast_verbose("+++ ooh323_answer\n"); @@ -949,6 +951,8 @@ static struct ast_frame null_frame = { AST_FRAME_NULL, }; struct ooh323_pvt *p = ast->tech_pvt; + if (!p) return &null_frame; + ast_mutex_lock(&p->lock); if (p->rtp) fr = ooh323_rtp_read(ast, p); @@ -1018,6 +1022,8 @@ struct ooh323_pvt *p = (struct ooh323_pvt *) ast->tech_pvt; char *callToken = (char *)NULL; + if (!p) return -1; + ast_mutex_lock(&p->lock); callToken = (p->callToken ? strdup(p->callToken) : NULL); ast_mutex_unlock(&p->lock); @@ -1461,8 +1467,8 @@ memcpy(&p->prefs, &user->prefs, sizeof(struct ast_codec_pref)); p->dtmfmode = user->dtmfmode; /* Since, call is coming from a pbx user, no need to use gk */ - OO_SETFLAG(p->flags, H323_DISABLEGK); - OO_SETFLAG(call->flags, OO_M_DISABLEGK); + /* OO_SETFLAG(p->flags, H323_DISABLEGK); + OO_SETFLAG(call->flags, OO_M_DISABLEGK); */ if (user->incominglimit) user->inUse++; ast_mutex_unlock(&user->lock); } else { @@ -1520,10 +1526,10 @@ } ast_mutex_lock(&p->lock); - if (p->callerid_name) { + if (!ast_strlen_zero(p->callerid_name)) { ooCallSetCallerId(call, p->callerid_name); } - if (p->callerid_num) { + if (!ast_strlen_zero(p->callerid_num)) { i = 0; while (*(p->callerid_num + i) != '\0') { if(!isdigit(*(p->callerid_num+i))) { break; } @@ -1545,7 +1551,7 @@ ast_verbose("Setting dialed digits %s\n", p->caller_dialedDigits); } ooCallAddAliasDialedDigits(call, p->caller_dialedDigits); - } else if (p->callerid_num) { + } else if (!ast_strlen_zero(p->callerid_num)) { if (ooIsDailedDigit(p->callerid_num)) { if (gH323Debug) { ast_verbose("setting callid number %s\n", p->callerid_num); @@ -2221,7 +2227,7 @@ gRasGkMode = RasDiscoverGatekeeper; } else { gRasGkMode = RasUseSpecificGatekeeper; - strncpy(gGatekeeper, v->value, sizeof(gGatekeeper)-1); + strncpy(gGatekeeper, v->value, sizeof(gGatekeeper)-1); } } else if (!strcasecmp(v->name, "logfile")) { strncpy(gLogFile, v->value, sizeof(gLogFile)-1); --- channels/ooh323cDriver.c 2009-07-04 00:10:21.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323cDriver.c 2009-07-03 23:45:42.000000000 +0400 @@ -319,11 +319,6 @@ ast_verbose("\tAdding g729A capability to call(%s, %s)\n", call->callType, call->callToken); txframes = (prefs->framing[x])/10; - ret= ooCallAddG729Capability(call, OO_G729A, txframes, 24, - OORXANDTX, &ooh323c_start_receive_channel, - &ooh323c_start_transmit_channel, - &ooh323c_stop_receive_channel, - &ooh323c_stop_transmit_channel); if(gH323Debug) ast_verbose("\tAdding g729 capability to call(%s, %s)\n", call->callType, call->callToken); @@ -332,6 +327,11 @@ &ooh323c_start_transmit_channel, &ooh323c_stop_receive_channel, &ooh323c_stop_transmit_channel); + ret= ooCallAddG729Capability(call, OO_G729A, txframes, 24, + OORXANDTX, &ooh323c_start_receive_channel, + &ooh323c_start_transmit_channel, + &ooh323c_stop_receive_channel, + &ooh323c_stop_transmit_channel); if(gH323Debug) ast_verbose("\tAdding g729B capability to call(%s, %s)\n", call->callType, call->callToken); --- channels/ooh323c/src/oochannels.c 2009-07-04 00:11:12.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/oochannels.c 2009-07-03 23:58:03.000000000 +0400 @@ -408,6 +408,7 @@ return OO_FAILED; } + ast_mutex_lock(&call->Lock); call->pH225Channel = (OOH323Channel*) memAllocZ (call->pctxt, sizeof(OOH323Channel)); @@ -431,13 +432,15 @@ call->callState = OO_CALL_CLEAR; call->callEndReason = OO_REASON_TRANSPORTFAILURE; } + ast_mutex_unlock(&call->Lock); return OO_FAILED; } OOTRACEDBGA4("Using Local IP address %s for incoming call in multihomed " "mode. (%s, %s)\n", call->localIP, call->callType, call->callToken); } - + + ast_mutex_unlock(&call->Lock); return OO_OK; } @@ -484,32 +487,29 @@ } -int ooSetCmdFDSETs(fd_set *pReadfds, fd_set *pWritefds, int *nfds) +int ooSetCmdFDSETs(struct pollfd *pfds, int *nfds) { OOH323CallData *call=NULL; if(gH323ep.cmdSock) { - FD_SET(gH323ep.cmdSock, pReadfds); - if(*nfds < (int)gH323ep.cmdSock) - *nfds = (int)gH323ep.cmdSock; + pfds[*nfds].fd = gH323ep.cmdSock; + pfds[*nfds].events = POLLIN; + (*nfds)++; } - - if(*nfds != 0) *nfds = *nfds+1; - return OO_OK; } int ooProcessCmdFDSETsAndTimers - (fd_set *pReadfds, fd_set *pWritefds, struct timeval *pToMin) + (struct pollfd *pfds, int nfds, struct timeval *pToMin) { OOH323CallData *call, *prev=NULL; struct timeval toNext; if(gH323ep.cmdSock) { - if(FD_ISSET(gH323ep.cmdSock, pReadfds)) { + if(ooPDRead(pfds, nfds, gH323ep.cmdSock)) { if(ooReadAndProcessStackCommand() != OO_OK) { /* ooReadAndProcessStackCommand prints an error message */ return OO_FAILED; @@ -522,82 +522,73 @@ } -int ooSetFDSETs(fd_set *pReadfds, fd_set *pWritefds, int *nfds) +int ooSetFDSETs(struct pollfd *pfds, int *nfds) { - OOH323CallData *call=NULL; - if(gH323ep.gkClient && gH323ep.gkClient->rasSocket != 0) { - FD_SET(gH323ep.gkClient->rasSocket, pReadfds ); - if ( *nfds < (int)gH323ep.gkClient->rasSocket) - *nfds = (int)gH323ep.gkClient->rasSocket; + pfds[*nfds].fd = gH323ep.gkClient->rasSocket; + pfds[*nfds].events = POLLIN; + (*nfds)++; } if(gH323ep.listener) { - FD_SET(*(gH323ep.listener), pReadfds); - if(*nfds < (int)*(gH323ep.listener)) - *nfds = *((int*)gH323ep.listener); + pfds[*nfds].fd = *gH323ep.listener; + pfds[*nfds].events = POLLIN; + (*nfds)++; } - if(*nfds != 0) *nfds = *nfds+1; - return OO_OK; } -int ooSetCallFDSETs(OOH323CallData* call, fd_set *pReadfds, fd_set *pWritefds, int *nfds) +int ooSetCallFDSETs(OOH323CallData* call, struct pollfd* pfds, int *nfds) { - if(call) - { + if(call) { + + if(call->cmdSock && call->callState < OO_CALL_CLEAR) { + pfds[*nfds].fd = call->cmdSock; + pfds[*nfds].events = POLLIN; + (*nfds)++; + } + + if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) { + pfds[*nfds].fd = call->pH225Channel->sock; + pfds[*nfds].events = POLLIN; - if(call->cmdSock && call->callState < OO_CALL_CLEAR) - { - FD_SET(call->cmdSock, pReadfds); - if(*nfds < (int)call->cmdSock) - *nfds = (int)call->cmdSock; - } - if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) - { - FD_SET (call->pH225Channel->sock, pReadfds); if (call->pH225Channel->outQueue.count > 0 || (OO_TESTFLAG (call->flags, OO_M_TUNNELING) && 0 != call->pH245Channel && call->pH245Channel->outQueue.count>0)) - FD_SET (call->pH225Channel->sock, pWritefds); - if(*nfds < (int)call->pH225Channel->sock) - *nfds = call->pH225Channel->sock; - } + pfds[*nfds].events |= POLLOUT; + (*nfds)++; + + } - if (0 != call->pH245Channel && call->pH245Channel->sock != 0) - { - FD_SET(call->pH245Channel->sock, pReadfds); + if (0 != call->pH245Channel && call->pH245Channel->sock != 0) { + pfds[*nfds].fd = call->pH245Channel->sock; + pfds[*nfds].events = POLLIN; if (call->pH245Channel->outQueue.count>0) - FD_SET(call->pH245Channel->sock, pWritefds); - if(*nfds < (int)call->pH245Channel->sock) - *nfds = call->pH245Channel->sock; + pfds[*nfds].events |= POLLOUT; + (*nfds)++; } - else if(call->h245listener) - { + else if(call->h245listener) { OOTRACEINFO3("H.245 Listerner socket being monitored " "(%s, %s)\n", call->callType, call->callToken); - FD_SET(*(call->h245listener), pReadfds); - if(*nfds < (int)*(call->h245listener)) - *nfds = *(call->h245listener); + pfds[*nfds].fd = *(call->h245listener); + pfds[*nfds].events = POLLIN; + (*nfds)++; } } - if(*nfds != 0) *nfds = *nfds+1; - return OO_OK; } int ooProcessFDSETsAndTimers - (fd_set *pReadfds, fd_set *pWritefds, struct timeval *pToMin) + (struct pollfd* pfds, int nfds, struct timeval *pToMin) { - OOH323CallData *call, *prev=NULL; struct timeval toNext; /* Process gatekeeper client timers */ @@ -628,7 +619,7 @@ if(0 != gH323ep.gkClient && 0 != gH323ep.gkClient->rasSocket) { - if(FD_ISSET( gH323ep.gkClient->rasSocket, pReadfds) ) + if(ooPDRead(pfds, nfds, gH323ep.gkClient->rasSocket) ) { ooGkClientReceive(gH323ep.gkClient); if(gH323ep.gkClient->state == GkClientFailed || @@ -640,7 +631,7 @@ if(gH323ep.listener) { - if(FD_ISSET(*(gH323ep.listener), pReadfds)) + if(ooPDRead(pfds, nfds, *(gH323ep.listener))) { OOTRACEDBGA1("New connection at H225 receiver\n"); ooAcceptH225Connection(); @@ -652,7 +643,7 @@ } int ooProcessCallFDSETsAndTimers - (OOH323CallData *call, fd_set *pReadfds, fd_set *pWritefds, struct timeval *pToMin) + (OOH323CallData *call, struct pollfd* pfds, int nfds, struct timeval *pToMin) { struct timeval toNext; @@ -660,7 +651,7 @@ { if(call->cmdSock) { - if(FD_ISSET(call->cmdSock, pReadfds)) { + if(ooPDRead(pfds, nfds, call->cmdSock)) { ast_mutex_lock(&call->Lock); if(ooReadAndProcessCallStackCommand(call) != OO_OK) { /* ooReadAndProcessStackCommand prints an error message */ @@ -674,7 +665,7 @@ ooTimerFireExpired(call->pctxt, &call->timerList); if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) { - if(FD_ISSET(call->pH225Channel->sock, pReadfds)) + if(ooPDRead(pfds, nfds, call->pH225Channel->sock)) { if(ooH2250Receive(call) != OO_OK) { @@ -690,24 +681,20 @@ } if (0 != call->pH245Channel && 0 != call->pH245Channel->sock) - { - if(FD_ISSET(call->pH245Channel->sock, pReadfds)) - { + if(ooPDRead(pfds, nfds, call->pH245Channel->sock)) ooH245Receive(call); - } - } if (0 != call->pH245Channel && 0 != call->pH245Channel->sock) { - if(FD_ISSET(call->pH245Channel->sock, pWritefds)) + if(call->pH245Channel->outQueue.count>0) { - if(call->pH245Channel->outQueue.count>0) + if(ooPDWrite(pfds, nfds, call->pH245Channel->sock)) ooSendMsg(call, OOH245MSG); } } else if(call->h245listener) { - if(FD_ISSET(*(call->h245listener), pReadfds)) + if(ooPDRead(pfds, nfds, *(call->h245listener))) { OOTRACEDBGC3("Incoming H.245 connection (%s, %s)\n", call->callType, call->callToken); @@ -717,7 +704,7 @@ if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) { - if(FD_ISSET(call->pH225Channel->sock, pWritefds)) + if(ooPDWrite(pfds, nfds, call->pH225Channel->sock)) { if(call->pH225Channel->outQueue.count>0) { @@ -733,9 +720,9 @@ "(%s, %s)\n", call->callType, call->callToken); ooSendMsg(call, OOH245MSG); - } - } - } + } + } + } if(ooTimerNextTimeout(&call->timerList, &toNext)) { @@ -766,7 +753,7 @@ { int ret=0, nfds=0; struct timeval toMin, toNext; - fd_set readfds, writefds; + struct pollfd pfds[1]; gMonitor = TRUE; @@ -775,10 +762,8 @@ while(1) { - FD_ZERO(&readfds); - FD_ZERO(&writefds); nfds = 0; - ooSetCmdFDSETs(&readfds, &writefds, &nfds); + ooSetCmdFDSETs(pfds, &nfds); if(!gMonitor) { OOTRACEINFO1("Ending Monitor thread\n"); @@ -793,26 +778,25 @@ { toMin.tv_sec = 0; toMin.tv_usec = 10000; - ooSocketSelect(1, 0, 0, 0, &toMin); + ooSocketPoll(pfds, nfds, toMin.tv_usec / 1000); } #endif else - ret = ooSocketSelect(nfds, &readfds, &writefds, - NULL, &toMin); + ret = ooSocketPoll(pfds, nfds, toMin.tv_sec * 1000 + toMin.tv_usec / 1000); if(ret == -1) { - OOTRACEERR1("Error in select ...exiting\n"); + OOTRACEERR1("Error in poll ...exiting\n"); exit(-1); continue; } - toMin.tv_sec = 0; + toMin.tv_sec = 2; /* 2 sec */ toMin.tv_usec = 100000; /* 100ms*/ ast_mutex_lock(&monitorLock); - if(ooProcessCmdFDSETsAndTimers(&readfds, &writefds, &toMin) != OO_OK) + if(ooProcessCmdFDSETsAndTimers(pfds, nfds, &toMin) != OO_OK) { /* ooStopMonitorCalls(); */ ast_mutex_unlock(&monitorLock); @@ -828,7 +812,7 @@ { int ret=0, nfds=0; struct timeval toMin, toNext; - fd_set readfds, writefds; + struct pollfd pfds[2]; gMonitor = TRUE; @@ -847,10 +831,8 @@ while(1) { - FD_ZERO(&readfds); - FD_ZERO(&writefds); nfds = 0; - ooSetFDSETs(&readfds, &writefds, &nfds); + ooSetFDSETs(pfds, &nfds); if(!gMonitor) { OOTRACEINFO1("Ending Monitor thread\n"); @@ -865,21 +847,20 @@ { toMin.tv_sec = 0; toMin.tv_usec = 10000; - ooSocketSelect(1, 0, 0, 0, &toMin); + ooSocketPoll(pfds, nfds, toMin.tv_usec / 1000); } #endif else - ret = ooSocketSelect(nfds, &readfds, &writefds, - NULL, &toMin); + ret = ooSocketPoll(pfds, nfds, toMin.tv_sec * 1000 + toMin.tv_usec / 1000); if(ret == -1) { - OOTRACEERR1("Error in select ...exiting\n"); + OOTRACEERR1("Error in poll ...exiting\n"); exit(-1); } - toMin.tv_sec = 0; + toMin.tv_sec = 2; /* 2 sec */ toMin.tv_usec = 100000; /* 100ms*/ /*This is for test application. Not part of actual stack */ @@ -894,7 +875,7 @@ } } - if(ooProcessFDSETsAndTimers(&readfds, &writefds, &toMin) != OO_OK) + if(ooProcessFDSETsAndTimers(pfds, nfds, &toMin) != OO_OK) { ast_mutex_unlock(&monitorLock); ooStopMonitorCalls(); @@ -907,10 +888,10 @@ } int ooMonitorCallChannels(OOH323CallData *call) { - int ret=0, nfds=0; + int ret=0, nfds=0, zeroloops = 0; +#define MAX_ZERO_LOOP 1020 struct timeval toMin, toNext; - fd_set readfds, writefds; - pthread_t thread; + struct pollfd pfds[5]; OOCTXT* pctxt; @@ -926,10 +907,8 @@ break; } - FD_ZERO(&readfds); - FD_ZERO(&writefds); nfds = 0; - ooSetCallFDSETs(call, &readfds, &writefds, &nfds); + ooSetCallFDSETs(call, pfds, &nfds); if(nfds == 0) @@ -937,32 +916,36 @@ Sleep(10); #else { + if (zeroloops++ > MAX_ZERO_LOOP) { + ooCleanCall(call); + ooStopMonitorCallChannels(call); + break; + } toMin.tv_sec = 0; toMin.tv_usec = 10000; - ooSocketSelect(1, 0, 0, 0, &toMin); + ooSocketPoll(pfds, nfds, toMin.tv_usec / 1000); } #endif else - ret = ooSocketSelect(nfds, &readfds, &writefds, - NULL, &toMin); + ret = ooSocketPoll(pfds, nfds, toMin.tv_sec * 1000 + toMin.tv_usec / 1000); if(ret == -1) { - OOTRACEERR2("Error in select %d ...exiting\n", errno); + OOTRACEERR2("Error in poll %d ...exiting\n", errno); call->callEndReason = OO_REASON_INVALIDMESSAGE; call->callState = OO_CALL_CLEARED; ooCleanCall(call); ooStopMonitorCallChannels(call); - continue; + break; } - toMin.tv_sec = 0; + toMin.tv_sec = 2; /* 2 sec */ toMin.tv_usec = 100000; /* 100ms*/ /*This is for test application. Not part of actual stack */ - if(ooProcessCallFDSETsAndTimers(call, &readfds, &writefds, &toMin) != OO_OK) + if(ooProcessCallFDSETsAndTimers(call, pfds, nfds, &toMin) != OO_OK) { ooStopMonitorCallChannels(call); continue; @@ -976,11 +959,10 @@ ast_mutex_lock(&call->Lock); ast_mutex_unlock(&call->Lock); ast_mutex_destroy(&call->Lock); - thread = call->callThread; + ast_cond_destroy(&call->gkWait); pctxt = call->pctxt; freeContext(pctxt); free(pctxt); - /* pthread_exit(&thread); */ return OO_OK; } @@ -991,11 +973,9 @@ ASN1OCTET message[MAXMSGLEN], message1[MAXMSGLEN]; int len; Q931Message *pmsg; - /* OOCTXT *pctxt = &gH323ep.msgctxt; */ OOCTXT *pctxt = call->pctxt; struct timeval timeout; - fd_set readfds; pmsg = (Q931Message*)memAlloc(pctxt, sizeof(Q931Message)); @@ -1072,12 +1052,12 @@ if(total == len) break; /* Complete message is received */ - FD_ZERO(&readfds); - FD_SET(call->pH225Channel->sock, &readfds); + struct pollfd pfds; + pfds.fd = call->pH225Channel->sock; + pfds.events = POLLIN; timeout.tv_sec = 3; timeout.tv_usec = 0; - ret = ooSocketSelect(call->pH225Channel->sock+1, &readfds, NULL, - NULL, &timeout); + ret = ooSocketPoll(&pfds, 1, timeout.tv_sec * 1000); if(ret == -1) { OOTRACEERR3("Error in select while receiving H.2250 message - " @@ -1093,7 +1073,7 @@ } /* If remaining part of the message is not received in 3 seconds exit */ - if(!FD_ISSET(call->pH225Channel->sock, &readfds)) + if(!ooPDRead(&pfds, 1, call->pH225Channel->sock)) { OOTRACEERR3("Error: Incomplete H.2250 message received - clearing " "call (%s, %s)\n", call->callType, call->callToken); @@ -1138,7 +1118,6 @@ /* OOCTXT *pctxt = &gH323ep.msgctxt; */ OOCTXT *pctxt = call->pctxt; struct timeval timeout; - fd_set readfds; pmsg = (H245Message*)memAlloc(pctxt, sizeof(H245Message)); @@ -1225,12 +1204,13 @@ memcpy(message+total, message1, recvLen); total = total + recvLen; if(total == len) break; /* Complete message is received */ - FD_ZERO(&readfds); - FD_SET(call->pH245Channel->sock, &readfds); + + struct pollfd pfds; + pfds.fd = call->pH245Channel->sock; + pfds.events = POLLIN; timeout.tv_sec = 3; timeout.tv_usec = 0; - ret = ooSocketSelect(call->pH245Channel->sock+1, &readfds, NULL, - NULL, &timeout); + ret = ooSocketPoll(&pfds, 1, timeout.tv_sec * 1000); if(ret == -1) { OOTRACEERR3("Error in select...H245 Receive-Clearing call (%s, %s)\n", @@ -1245,7 +1225,7 @@ } /* If remaining part of the message is not received in 3 seconds exit */ - if(!FD_ISSET(call->pH245Channel->sock, &readfds)) + if(!ooPDRead(&pfds, 1, call->pH245Channel->sock)) { OOTRACEERR3("Error: Incomplete h245 message received (%s, %s)\n", call->callType, call->callToken); @@ -1593,6 +1573,8 @@ gH323ep.gkClient->state == GkClientRegistered){ OOTRACEDBGA3("Sending DRQ after sending ReleaseComplete." "(%s, %s)\n", call->callType, call->callToken); + + call->endTime = (H235TimeStamp) time(NULL); ooGkClientSendDisengageRequest(gH323ep.gkClient, call); } } --- channels/ooh323c/src/ooCalls.c 2009-07-04 00:10:21.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCalls.c 2009-07-03 23:50:45.000000000 +0400 @@ -62,6 +62,7 @@ return NULL; } memset(call, 0, sizeof(OOH323CallData)); + ast_cond_init(&call->gkWait, NULL); ast_mutex_init(&call->Lock); call->pctxt = pctxt; call->msgctxt = msgctxt; --- channels/ooh323c/src/ooSocket.h 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooSocket.h 2009-06-30 04:33:07.000000000 +0400 @@ -331,6 +331,11 @@ EXTERN int ooSocketSelect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval * timeout); +EXTERN int ooSocketPoll(struct pollfd *pfds, int nfds, int timeout); + +EXTERN int ooPDRead(struct pollfd *pfds, int nfds, int fd); +EXTERN int ooPDWrite(struct pollfd *pfds, int nfds, int fd); + /** * This function converts the string with IP address to a double word * representation. The converted address may be used with the ::rtSocketBind --- channels/ooh323c/src/ooh323.c 2009-07-04 00:10:21.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh323.c 2009-07-03 23:45:42.000000000 +0400 @@ -16,6 +16,7 @@ #include #include +#include #include "ootypes.h" #include "ooq931.h" @@ -1256,6 +1257,9 @@ DListNode *pNode = NULL; OOTimer *pTimer=NULL; int type = q931Msg->messageType; + struct timespec ts; + int gkWaits; + ast_mutex_t gmutex; switch(type) { case Q931SetupMsg: /* SETUP message is received */ @@ -1274,8 +1278,6 @@ ooFreeQ931Message(call->msgctxt, q931Msg); - ooSendCallProceeding(call);/* Send call proceeding message*/ - /* DISABLEGK is used to selectively disable gatekeeper use. For incoming calls DISABLEGK can be set in onReceivedSetup callback by application. Very useful in pbx applications where gk is used only @@ -1285,20 +1287,37 @@ { if(gH323ep.gkClient->state == GkClientRegistered) { + call->callState = OO_CALL_WAITING_ADMISSION; + // ast_mutex_lock(&call->Lock); ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); - call->callState = OO_CALL_WAITING_ADMISSION; + ast_mutex_init(&gmutex); + for (gkWaits = 0; gkWaits < 1000; gkWaits++) { + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_nsec += 24000000; + ast_mutex_lock(&gmutex); + ast_cond_timedwait(&call->gkWait, &gmutex, &ts); + ast_mutex_unlock(&gmutex); + if (call->callState != OO_CALL_WAITING_ADMISSION) + break; + } + ast_mutex_destroy(&gmutex); + // ast_mutex_unlock(&call->Lock); + } - else{ + 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; } } - else { - ret = ooH323CallAdmitted (call); - } - } + if (call->callState < OO_CALL_CLEAR) { + ooSendCallProceeding(call);/* Send call proceeding message*/ + ret = ooH323CallAdmitted (call); + } + + } /* end ret == OO_OK */ break; @@ -1315,6 +1334,7 @@ OOTRACEINFO3("H.225 Alerting message received (%s, %s)\n", call->callType, call->callToken); + call->alertingTime = (H235TimeStamp) time(NULL); ooOnReceivedAlerting(call, q931Msg); if(gH323ep.h323Callbacks.onAlerting && call->callStatecallType, call->callToken); + call->connectTime = (H235TimeStamp) time(NULL); + /* Disable call establishment timer */ for(i = 0; itimerList.count; i++) { @@ -1367,6 +1389,12 @@ gH323ep.h323Callbacks.onCallEstablished(call); } ooFreeQ931Message(call->msgctxt, q931Msg); + + if(gH323ep.gkClient && !OO_TESTFLAG(call->flags, OO_M_DISABLEGK)) { + if(gH323ep.gkClient->state == GkClientRegistered) { + ooGkClientSendIRR(gH323ep.gkClient, call); + } + } break; case Q931InformationMsg: OOTRACEINFO3("H.225 Information msg received (%s, %s)\n", @@ -1379,6 +1407,8 @@ OOTRACEINFO3("H.225 Release Complete message received (%s, %s)\n", call->callType, call->callToken); + call->endTime = (H235TimeStamp) time(NULL); + ooOnReceivedReleaseComplete(call, q931Msg); ooFreeQ931Message(call->msgctxt, q931Msg); @@ -1545,11 +1575,14 @@ } } else{ /* Empty facility message Check for tunneling */ + if (pH323UUPdu->h323_message_body.t == + T_H225H323_UU_PDU_h323_message_body_empty) { OOTRACEDBGB3("Handling tunneled messages in empty Facility message." " (%s, %s)\n", call->callType, call->callToken); ooHandleTunneledH245Messages(call, pH323UUPdu); OOTRACEDBGB3("Finished handling tunneled messages in empty Facility " "message. (%s, %s)\n", call->callType, call->callToken); + } } return OO_OK; @@ -1606,7 +1639,6 @@ (OOH323CallData *call, H225H323_UU_PDU * pH323UUPdu) { H245Message *pmsg; - /* OOCTXT *pctxt = &gH323ep.msgctxt; */ OOCTXT *pctxt = call->msgctxt; int ret=0,i=0; @@ -1819,6 +1851,54 @@ } +int ooPopulatePrefixList(OOCTXT *pctxt, OOAliases *pAliases, + H225_SeqOfH225SupportedPrefix *pPrefixList ) +{ + H225SupportedPrefix *pPrefixEntry=NULL; + OOAliases * pAlias=NULL; + ASN1BOOL bValid=FALSE; + int i = 0; + + dListInit(pPrefixList); + if(pAliases) + { + pAlias = pAliases; + while(pAlias) + { + pPrefixEntry = NULL; + switch(pAlias->type) + { + case T_H225AliasAddress_dialedDigits: + pPrefixEntry = (H225SupportedPrefix *)memAlloc(pctxt, + sizeof(H225SupportedPrefix)); + if(!pPrefixEntry) { + OOTRACEERR1("ERROR:Memory - ooPopulatePrefixList - pAliasEntry\n"); + return OO_FAILED; + } + pPrefixEntry->prefix.t = T_H225AliasAddress_dialedDigits; + pPrefixEntry->prefix.u.dialedDigits = (ASN1IA5String)memAlloc(pctxt, + strlen(pAlias->value)+1); + if(!pPrefixEntry->prefix.u.dialedDigits) { + OOTRACEERR1("ERROR:Memory - ooPopulatePrefixList - " + "dialedDigits\n"); + memFreePtr(pctxt, pPrefixEntry); + return OO_FAILED; + } + strcpy((char*)pPrefixEntry->prefix.u.dialedDigits, pAlias->value); + bValid = TRUE; + break; + default: + bValid = FALSE; + } + + if(bValid) + dListAppend( pctxt, pPrefixList, (void*)pPrefixEntry ); + + pAlias = pAlias->next; + } + } + return OO_OK; +} int ooPopulateAliasList(OOCTXT *pctxt, OOAliases *pAliases, H225_SeqOfH225AliasAddress *pAliasList ) { @@ -1833,6 +1913,10 @@ pAlias = pAliases; while(pAlias) { + if (pAlias->value[0] == 0) { + pAlias = pAlias->next; + continue; + } pAliasEntry = (H225AliasAddress*)memAlloc(pctxt, sizeof(H225AliasAddress)); if(!pAliasEntry) --- channels/ooh323c/src/ooCalls.h 2009-07-04 00:10:21.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCalls.h 2009-07-03 23:50:45.000000000 +0400 @@ -140,6 +140,7 @@ OOCTXT *pctxt; OOCTXT *msgctxt; pthread_t callThread; + ast_cond_t gkWait; ast_mutex_t Lock; OOBOOL Monitor; OOSOCKET CmdChan; @@ -176,7 +177,8 @@ char *remoteDisplayName; struct OOAliases *remoteAliases; struct OOAliases *ourAliases; /*aliases used in the call for us */ - OOMasterSlaveState masterSlaveState; /*!< Master-Slave state */ + OOMasterSlaveState masterSlaveState; /*!< Master-Slave state */ + OOMSAckStatus msAckStatus; /* Master-Slave ack's status */ ASN1UINT statusDeterminationNumber; OOCapExchangeState localTermCapState; OOCapExchangeState remoteTermCapState; @@ -196,6 +198,7 @@ unsigned nextSessionID; /* Note by default 1 is audio session, 2 is video and 3 is data, from 3 onwards master decides*/ DList timerList; ASN1UINT msdRetries; + H235TimeStamp alertingTime, connectTime, endTime; /* time data for gatekeeper */ FastStartResponse *pFastStartRes; /* fast start response */ void *usrData; /*! #include +#include #include "ooq931.h" #include "ootrace.h" @@ -1323,6 +1324,8 @@ return OO_FAILED; } + call->alertingTime = (H235TimeStamp) time(NULL); + q931msg->callReference = call->callReference; q931msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt, @@ -1714,6 +1717,15 @@ int ooSendConnect(OOH323CallData *call) { + + call->connectTime = (H235TimeStamp) time(NULL); + + if(gH323ep.gkClient && !OO_TESTFLAG(call->flags, OO_M_DISABLEGK)) { + if(gH323ep.gkClient->state == GkClientRegistered) { + ooGkClientSendIRR(gH323ep.gkClient, call); + } + } + ooAcceptCall(call); return OO_OK; } @@ -1929,6 +1941,8 @@ OOH323CallData *fwdedCall=NULL; OOCTXT *pctxt; ooAliases *pNewAlias=NULL, *alias=NULL; + struct timespec ts; + ast_mutex_t gmutex; int i=0, irand=0, ret = OO_OK; /* Note: We keep same callToken, for new call which is going to replace an existing call, thus treating it as a single call.*/ @@ -1983,9 +1997,23 @@ MakeCall command */ ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, fwdedCall, FALSE); fwdedCall->callState = OO_CALL_WAITING_ADMISSION; + ast_mutex_lock(&fwdedCall->Lock); + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += 24; + ast_mutex_init(&gmutex); + ast_mutex_lock(&gmutex); + ast_cond_timedwait(&fwdedCall->gkWait, &gmutex, &ts); + ast_mutex_unlock(&gmutex); + ast_mutex_destroy(&gmutex); + if (fwdedCall->callState == OO_CALL_WAITING_ADMISSION) /* GK is not responding */ + fwdedCall->callState = OO_CALL_CLEAR; + ast_mutex_unlock(&fwdedCall->Lock); + } - else { + if (fwdedCall->callState < OO_CALL_CLEAR) { + ast_mutex_lock(&fwdedCall->Lock); ret = ooH323CallAdmitted (fwdedCall); + ast_mutex_unlock(&fwdedCall->Lock); } return OO_OK; @@ -2016,6 +2044,9 @@ int ret=0, i=0, irand=0; char tmp[30]="\0"; char *ip=NULL, *port = NULL; + struct timespec ts; + int gkWaits; + ast_mutex_t gmutex; if(!dest) { @@ -2092,20 +2123,34 @@ { /* No need to check registration status here as it is already checked for MakeCall command */ - ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); - call->callState = OO_CALL_WAITING_ADMISSION; - } - else { - /* Send as H225 message to calling endpoint */ - ast_mutex_lock(&call->Lock); - if (call->callState < OO_CALL_CLEAR) - if ((ret = ooH323CallAdmitted (call)) != OO_OK) { - ast_mutex_unlock(&call->Lock); - return ret; + + call->callState = OO_CALL_WAITING_ADMISSION; + // ast_mutex_lock(&call->Lock); + ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); + ast_mutex_init(&gmutex); + for (gkWaits = 0; gkWaits < 1000; gkWaits++) { + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_nsec += 24000000; + ast_mutex_lock(&gmutex); + ast_cond_timedwait(&call->gkWait, &gmutex, &ts); + ast_mutex_unlock(&gmutex); + if (call->callState != OO_CALL_WAITING_ADMISSION) + break; } - ast_mutex_unlock(&call->Lock); + ast_mutex_destroy(&gmutex); + // ast_mutex_unlock(&call->Lock); + } + /* Send as H225 message to calling endpoint */ + ast_mutex_lock(&call->Lock); + if (call->callState < OO_CALL_CLEAR) + if ((ret = ooH323CallAdmitted (call)) != OO_OK) { + ast_mutex_unlock(&call->Lock); + return ret; + } + ast_mutex_unlock(&call->Lock); + return OO_OK; } @@ -2204,7 +2249,7 @@ } /* Set calling party number Q931 IE */ - if(call->callingPartyNumber) + if(call->callingPartyNumber && call->callingPartyNumber[0]) ooQ931SetCallingPartyNumberIE(pctxt, q931msg, (const char*)call->callingPartyNumber, 1, 0, 0, 0); --- channels/ooh323c/src/ooSocket.c 2009-07-04 00:10:21.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooSocket.c 2009-07-02 11:16:44.000000000 +0400 @@ -469,6 +469,29 @@ return ret; } +int ooSocketPoll(struct pollfd *pfds, int nfds, int timeout) +{ + return poll(pfds, nfds, timeout); +} + +int ooPDRead(struct pollfd *pfds, int nfds, int fd) +{ + int i; + for (i=0;iCmdChanLock); - if ((ret = pipe(thePipe)) == -1) { + if ((ret = socketpair(PF_LOCAL, SOCK_STREAM, 0, thePipe)) == -1) { ast_mutex_destroy((ast_mutex_t *)call->CmdChanLock); free(call->CmdChanLock); call->CmdChanLock = NULL; return OO_FAILED; } ast_mutex_lock((ast_mutex_t *)call->CmdChanLock); - call->cmdSock = dup(thePipe[0]); - close(thePipe[0]); - call->CmdChan = dup(thePipe[1]); - close(thePipe[1]); + call->cmdSock = thePipe[0]; + call->CmdChan = thePipe[1]; ast_mutex_unlock((ast_mutex_t *)call->CmdChanLock); return OO_OK; } @@ -238,8 +236,8 @@ break; case OO_CMD_HANGCALL: - OOTRACEINFO2("Processing Hang call command %s with q931 cause %d\n", - (char*)cmd.param1); + OOTRACEINFO3("Processing Hang call command %s with q931 cause %d\n", + (char*)cmd.param1, *(int *) cmd.param3); ooH323HangCall((char*)cmd.param1, *(OOCallClearReason*)cmd.param2, *(int *) cmd.param3); break; --- channels/ooh323c/src/ooh245.c 2009-07-04 00:10:21.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh245.c 2009-07-03 01:18:38.000000000 +0400 @@ -805,6 +805,8 @@ call->callType, call->callToken); } } + + call->msAckStatus = OO_msAck_remoteReceived; if(call->localTermCapState == OO_LocalTermCapSetAckRecvd && call->remoteTermCapState == OO_RemoteTermCapSetAckSent) @@ -937,6 +939,7 @@ } ooFreeH245Message(call, ph245msg); + call->msAckStatus = OO_msAck_localSent; return ret; } @@ -1707,8 +1710,9 @@ if(call->remoteTermCapState != OO_RemoteTermCapSetAckSent) return OO_OK; - if(call->masterSlaveState == OO_MasterSlave_Master || - call->masterSlaveState == OO_MasterSlave_Slave) + if((call->masterSlaveState == OO_MasterSlave_Master || + call->masterSlaveState == OO_MasterSlave_Slave) && + (call->msAckStatus == OO_msAck_remoteReceived)) { if(gH323ep.h323Callbacks.openLogicalChannels) gH323ep.h323Callbacks.openLogicalChannels(call); --- channels/ooh323c/src/ooh323.h 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh323.h 2009-07-03 23:45:42.000000000 +0400 @@ -122,6 +122,11 @@ OOAliases **aliasList); /** + */ +EXTERN int ooPopulatePrefixList(OOCTXT *pctxt, OOAliases *pAliases, + H225_SeqOfH225SupportedPrefix *pPrefixList ); + +/** * This is a helper function used to populate alias list using aliases. * @param pctxt Pointer to OOCTXT structure which will be used for memory * allocations. --- channels/ooh323c/src/ooGkClient.c 2009-07-04 00:10:21.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooGkClient.c 2009-07-03 23:50:45.000000000 +0400 @@ -61,6 +61,7 @@ } memset(pGkClient, 0, sizeof(ooGkClient)); + ast_mutex_init(&pGkClient->Lock); gH323ep.gkClient = pGkClient; initContext(&(pGkClient->ctxt)); initContext(&(pGkClient->msgCtxt)); @@ -159,7 +160,7 @@ pGkClient->gkRasPort); } else if(pGkClient->gkMode == RasDiscoverGatekeeper) { - OOTRACEINFO1("\tGatekeeper mode - UseSpecificGatekeeper\n"); + OOTRACEINFO1("\tGatekeeper mode - RasDiscoverGatekeeper\n"); } else { OOTRACEERR1("Invalid GatekeeperMode\n"); @@ -180,6 +181,9 @@ ooGkClientCloseChannel(gH323ep.gkClient); freeContext(&gH323ep.gkClient->msgCtxt); freeContext(&gH323ep.gkClient->ctxt); + ast_mutex_lock(&gH323ep.gkClient->Lock); + ast_mutex_unlock(&gH323ep.gkClient->Lock); + ast_mutex_destroy(&gH323ep.gkClient->Lock); memFreePtr(&gH323ep.ctxt, gH323ep.gkClient); gH323ep.gkClient = NULL; } @@ -197,14 +201,17 @@ return OO_FAILED; } + ast_mutex_lock(&pGkClient->Lock); pGkClient->discoveryComplete = FALSE; iRet = ooGkClientSendGRQ(pGkClient); if(iRet != OO_OK) { OOTRACEERR1("Error:Failed to send GRQ message\n"); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } + ast_mutex_unlock(&pGkClient->Lock); return OO_OK; } @@ -239,6 +246,7 @@ else if(eGkMode == RasNoGatekeeper) { OOTRACEINFO1("Gatekeeper Mode - RasNoGatekeeper\n"); } + return OO_OK; } @@ -364,6 +372,7 @@ H225RasMessage *pRasMsg=NULL; int iRet=OO_OK; + ast_mutex_lock(&pGkClient->Lock); pctxt = &pGkClient->msgCtxt; recvLen = ooSocketRecvFrom(pGkClient->rasSocket, recvBuf, 1024, remoteHost, @@ -371,6 +380,7 @@ if(recvLen <0) { OOTRACEERR1("Error:Failed to receive RAS message\n"); + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } OOTRACEDBGA1("GkClient Received RAS Message\n"); @@ -383,6 +393,7 @@ { OOTRACEWARN3("WARN:Ignoring message received from unknown gatekeeper " "%s:%d\n", remoteHost, iFromPort); + ast_mutex_unlock(&pGkClient->Lock); return OO_OK; } } @@ -392,6 +403,7 @@ OOTRACEERR1("Error:Failed to set PER buffer for RAS message decoding\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } pRasMsg = (H225RasMessage*)memAlloc(pctxt, sizeof(H225RasMessage)); @@ -400,6 +412,7 @@ OOTRACEERR1("Error: Failed to allocate memory for RAS message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } #ifndef _COMPACT @@ -428,8 +441,10 @@ removeEventHandler(pctxt); #endif memReset(pctxt); + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } + ast_mutex_unlock(&pGkClient->Lock); return iRet; } @@ -549,6 +564,7 @@ ASN1OCTET msgBuf[MAXMSGLEN]; ASN1OCTET *msgPtr=NULL; int iLen; + OOCTXT *pctxt = &pGkClient->msgCtxt; setPERBuffer( pctxt, msgBuf, MAXMSGLEN, TRUE ); @@ -603,7 +619,7 @@ OOCTXT *pctxt = &pGkClient->msgCtxt; ooGkClientTimerCb *cbData=NULL; - + ast_mutex_lock(&pGkClient->Lock); /* Allocate memory for RAS message */ pRasMsg = (H225RasMessage*)memAlloc(pctxt, sizeof(H225RasMessage)); @@ -611,6 +627,7 @@ { OOTRACEERR1("Error: Memory allocation for GRQ RAS message failed\n"); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } @@ -621,6 +638,7 @@ OOTRACEERR1("Error:Memory allocation for GRQ failed\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memset(pGkReq, 0, sizeof(H225GatekeeperRequest)); @@ -643,6 +661,7 @@ "failed\n"); memReset(&pGkClient->msgCtxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } @@ -672,6 +691,7 @@ OOTRACEERR1("Error Failed to fill alias information for GRQ message\n"); memReset(&pGkClient->msgCtxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } iRet = ooGkClientSendMsg(pGkClient, pRasMsg); @@ -680,6 +700,7 @@ OOTRACEERR1("Error: Failed to send GRQ message\n"); memReset(&pGkClient->msgCtxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } OOTRACEINFO1("Sent GRQ message\n"); @@ -689,6 +710,7 @@ { OOTRACEERR1("Error:Failed to allocate memory to GRQ timer callback\n"); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } cbData->timerType = OO_GRQ_TIMER; @@ -700,8 +722,10 @@ OOTRACEERR1("Error:Unable to create GRQ timer.\n "); memFreePtr(&pGkClient->ctxt, cbData); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } + ast_mutex_unlock(&pGkClient->Lock); return OO_OK; } @@ -861,6 +885,10 @@ H225TransportAddress *pTransportAddress=NULL; H225TransportAddress_ipAddress *pIpAddress=NULL; ooGkClientTimerCb *cbData =NULL; + H225SupportedProtocols *pProtocol = NULL; + H225VoiceCaps *pVoiceCaps = NULL; + + ast_mutex_lock(&pGkClient->Lock); pctxt = &pGkClient->msgCtxt; @@ -869,6 +897,7 @@ { OOTRACEERR1("Error: Memory allocation for RRQ RAS message failed\n"); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } @@ -879,6 +908,7 @@ OOTRACEERR1("Error:Memory allocation for RRQ failed\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memset(pRegReq, 0, sizeof(H225RegistrationRequest)); @@ -898,6 +928,7 @@ "RRQ message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } pTransportAddress->t = T_H225TransportAddress_ipAddress; @@ -923,6 +954,7 @@ "RRQ message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_lock(&pGkClient->Lock); return OO_FAILED; } @@ -946,15 +978,44 @@ pRegReq->terminalType.m.vendorPresent=TRUE; ooGkClientFillVendor(pGkClient, &pRegReq->terminalType.vendor ); - + + if (gH323ep.isGateway) { + pRegReq->terminalType.gateway.m.protocolPresent = TRUE; + pProtocol = (H225SupportedProtocols*) memAlloc(pctxt, + sizeof(H225SupportedProtocols)); + pVoiceCaps = (H225VoiceCaps*) memAlloc(pctxt, sizeof(H225VoiceCaps)); + if(!pProtocol || !pVoiceCaps) { + OOTRACEERR1("Error:Failed to allocate memory for protocol info of " + "RRQ message\n"); + memReset(pctxt); + pGkClient->state = GkClientFailed; + ast_mutex_lock(&pGkClient->Lock); + return OO_FAILED; + } + + memset(pVoiceCaps, 0, sizeof(H225VoiceCaps)); + memset(pProtocol, 0, sizeof(H225SupportedProtocols)); + + pVoiceCaps->m.supportedPrefixesPresent = TRUE; + ooPopulatePrefixList(pctxt, gH323ep.aliases, &pVoiceCaps->supportedPrefixes); + + pProtocol->t = T_H225SupportedProtocols_voice; + pProtocol->u.voice = pVoiceCaps; + + dListInit(&pRegReq->terminalType.gateway.protocol); + dListAppend(pctxt, &pRegReq->terminalType.gateway.protocol, + (void*)pProtocol); + + } + pRegReq->m.terminalAliasPresent=TRUE; if(OO_OK != ooPopulateAliasList(pctxt, gH323ep.aliases, - &pRegReq->terminalAlias)) - { - OOTRACEERR1("Error filling alias for RRQ\n"); - memReset(pctxt); - pGkClient->state = GkClientFailed; - return OO_FAILED; + &pRegReq->terminalAlias)) { + OOTRACEERR1("Error filling alias for RRQ\n"); + memReset(pctxt); + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); + return OO_FAILED; } pRegReq->m.gatekeeperIdentifierPresent=TRUE; @@ -967,6 +1028,7 @@ "message.\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memcpy(pRegReq->gatekeeperIdentifier.data, pGkClient->gkId.data, @@ -1011,6 +1073,7 @@ OOTRACEERR1("Error: Failed to allocate memory for EndpointIdentifier in RRQ \n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } } @@ -1024,6 +1087,7 @@ OOTRACEERR1("Error: Failed to send RRQ message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } OOTRACEINFO1("Sent RRQ message \n"); @@ -1034,6 +1098,7 @@ { OOTRACEERR1("Error:Failed to allocate memory to RRQ timer callback\n"); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } cbData->timerType = OO_RRQ_TIMER; @@ -1045,9 +1110,11 @@ OOTRACEERR1("Error:Unable to create GRQ timer.\n "); memFreePtr(&pGkClient->ctxt, cbData); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } + ast_mutex_unlock(&pGkClient->Lock); return OO_OK; } @@ -1293,6 +1360,7 @@ H225TransportAddress *pTransportAddress=NULL; H225TransportAddress_ipAddress *pIpAddress=NULL; + ast_mutex_lock(&pGkClient->Lock); pctxt = &pGkClient->msgCtxt; OOTRACEDBGA1("Building Unregistration Request message\n"); @@ -1302,6 +1370,7 @@ { OOTRACEERR1("Error: Memory allocation for URQ RAS message failed\n"); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } @@ -1312,6 +1381,7 @@ OOTRACEERR1("Error:Memory allocation for URQ failed\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memset(pUnregReq, 0, sizeof(H225UnregistrationRequest)); @@ -1335,6 +1405,7 @@ "RRQ message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } pTransportAddress->t = T_H225TransportAddress_ipAddress; @@ -1358,6 +1429,7 @@ "message.\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memcpy((void*)pUnregReq->endpointIdentifier.data, @@ -1374,6 +1446,7 @@ OOTRACEERR1("Error:Failed to allocate memory for GKID of URQ message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memcpy((void*)pUnregReq->gatekeeperIdentifier.data, @@ -1394,11 +1467,13 @@ OOTRACEERR1("Error:Failed to send UnregistrationRequest message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } pGkClient->state = GkClientUnregistered; OOTRACEINFO1("Unregistration Request message sent.\n"); + ast_mutex_unlock(&pGkClient->Lock); return OO_OK; } @@ -1452,6 +1527,8 @@ H225RasMessage *pRasMsg=NULL; H225UnregistrationConfirm *pUCF=NULL; + ast_mutex_lock(&pGkClient->Lock); + pRasMsg = (H225RasMessage*)memAlloc(pctxt, sizeof(H225RasMessage)); pUCF = (H225UnregistrationConfirm*)memAlloc(pctxt, sizeof(H225UnregistrationConfirm)); @@ -1459,6 +1536,7 @@ { OOTRACEERR1("Error: Memory allocation for UCF RAS message failed\n"); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } pRasMsg->t = T_H225RasMessage_unregistrationConfirm; @@ -1473,11 +1551,13 @@ OOTRACEERR1("Error:Failed to send UnregistrationConfirm message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } OOTRACEINFO1("Unregistration Confirm message sent for \n"); memReset(pctxt); + ast_mutex_unlock(&pGkClient->Lock); return OO_OK; } @@ -1499,6 +1579,8 @@ RasCallAdmissionInfo *pCallAdmInfo=NULL; pctxt = &pGkClient->msgCtxt; + ast_mutex_lock(&pGkClient->Lock); + OOTRACEDBGA3("Building Admission Request for call (%s, %s)\n", call->callType, call->callToken); pRasMsg = (H225RasMessage*)memAlloc(pctxt, sizeof(H225RasMessage)); @@ -1507,6 +1589,7 @@ OOTRACEERR3("Error:Memory - ooGkClientSendAdmissionRequest - " "pRasMsg(%s, %s)\n", call->callType, call->callToken); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } pRasMsg->t = T_H225RasMessage_admissionRequest; @@ -1518,6 +1601,7 @@ "pAdmReq(%s, %s)\n", call->callType, call->callToken); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memset(pAdmReq, 0, sizeof(H225AdmissionRequest)); @@ -1536,6 +1620,7 @@ "Addresses of ARQ message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddressLocal->ip.data); @@ -1600,6 +1685,7 @@ call->callToken); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memcpy((void*)pAdmReq->endpointIdentifier.data, @@ -1636,6 +1722,7 @@ "ARQ message\n"); pGkClient->state = GkClientFailed; memReset(pctxt); + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } } @@ -1649,7 +1736,8 @@ { OOTRACEERR1("Error:Failed to populate source aliases -ARQ message\n"); memReset(pctxt); - pGkClient->state = GkClientFailed; + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } } @@ -1687,6 +1775,7 @@ OOTRACEERR1("Error:Failed to allocate memory for GKID of ARQ message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memcpy((void*)pAdmReq->gatekeeperIdentifier.data, @@ -1707,6 +1796,7 @@ " Info entry\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } @@ -1734,6 +1824,7 @@ OOTRACEERR1("Error:Failed to send AdmissionRequest message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } OOTRACEINFO3("Admission Request message sent for (%s, %s)\n", @@ -1748,6 +1839,7 @@ OOTRACEERR1("Error:Failed to allocate memory for Regisration timer." "\n"); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } cbData->timerType = OO_ARQ_TIMER; @@ -1760,9 +1852,11 @@ OOTRACEERR1("Error:Unable to create ARQ timer.\n "); memFreePtr(&pGkClient->ctxt, cbData); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } + ast_mutex_unlock(&pGkClient->Lock); return OO_OK; } @@ -1853,8 +1947,12 @@ } OOTRACEINFO3("Admission Confirm message received for (%s, %s)\n", pCallAdmInfo->call->callType, - pCallAdmInfo->call->callToken); - ooH323CallAdmitted( pCallAdmInfo->call); + pCallAdmInfo->call->callToken); + + pCallAdmInfo->call->callState = OO_CALL_CONNECTING; + ast_cond_broadcast(&pCallAdmInfo->call->gkWait); + /* ooH323CallAdmitted( pCallAdmInfo->call); */ + dListRemove(&pGkClient->callsPendingList, pNode); dListAppend(&pGkClient->ctxt, &pGkClient->callsAdmittedList, pNode->data); @@ -1951,9 +2049,272 @@ break; } + ast_cond_broadcast(&pCallAdmInfo->call->gkWait); return OO_OK; } + +int ooGkClientSendIRR + (ooGkClient *pGkClient, OOH323CallData *call) +{ + int iRet = 0; + unsigned int x; + DListNode *pNode; + ooGkClientTimerCb *cbData=NULL; + H225RasMessage *pRasMsg=NULL; + OOCTXT* pctxt; + H225InfoRequestResponse *pIRR=NULL; + H225TransportAddress_ipAddress *pIpAddressLocal =NULL, *pIpRasAddress, + *pLocalAddr, *pRemoteAddr; + H225TransportAddress *pTransportAddress; + ooAliases *destAliases = NULL, *srcAliases=NULL; + H225InfoRequestResponse_perCallInfo_element *perCallInfo = NULL; + pctxt = &pGkClient->msgCtxt; + + ast_mutex_lock(&pGkClient->Lock); + + OOTRACEDBGA3("Building Info Request Resp for call (%s, %s)\n", + call->callType, call->callToken); + pRasMsg = (H225RasMessage*)memAlloc(pctxt, sizeof(H225RasMessage)); + if(!pRasMsg) + { + OOTRACEERR3("Error:Memory - ooGkClientSendAdmissionRequest - " + "pRasMsg(%s, %s)\n", call->callType, call->callToken); + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); + return OO_FAILED; + } + pRasMsg->t = T_H225RasMessage_infoRequestResponse; + pIRR = (H225InfoRequestResponse*) memAlloc(pctxt, + sizeof(H225InfoRequestResponse)); + if(!pIRR) + { + OOTRACEERR3("Error:Memory - ooGkClientSendIRR - " + "pIRR(%s, %s)\n", call->callType, call->callToken); + memReset(pctxt); + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); + return OO_FAILED; + } + memset(pIRR, 0, sizeof(H225InfoRequestResponse)); + pRasMsg->u.infoRequestResponse = pIRR; + + /* Populate call signalling addresses */ + pIpAddressLocal = (H225TransportAddress_ipAddress*)memAlloc(pctxt, + sizeof(H225TransportAddress_ipAddress)); + pTransportAddress = (H225TransportAddress*) memAlloc(pctxt, + sizeof(H225TransportAddress)); + if(!pIpAddressLocal || !pTransportAddress) + { + OOTRACEERR1("Error:Failed to allocate memory for Call Signalling " + "Addresses of IRR message\n"); + memReset(pctxt); + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); + return OO_FAILED; + } + ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddressLocal->ip.data); + + pIpAddressLocal->ip.numocts = 4; + pIpAddressLocal->port = gH323ep.listenPort; + + pTransportAddress->t = T_H225TransportAddress_ipAddress; + pTransportAddress->u.ipAddress = pIpAddressLocal; + + dListInit(&pIRR->callSignalAddress); + dListAppend(pctxt, &pIRR->callSignalAddress, + (void*)pTransportAddress); + + /* Populate seq number */ + pIRR->requestSeqNum = pGkClient->requestSeqNum++; + if(!pIRR->requestSeqNum) + pIRR->requestSeqNum = pGkClient->requestSeqNum++; + + pIpRasAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt, + sizeof(H225TransportAddress_ipAddress)); + if(!pIpRasAddress) + { + OOTRACEERR1("Error: Memory allocation for Ras Address of IRR message " + "failed\n"); + memReset(&pGkClient->msgCtxt); + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); + return OO_FAILED; + } + + pIpRasAddress->ip.numocts = 4; + pIpRasAddress->port = pGkClient->localRASPort; + ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpRasAddress->ip.data); + + pIRR->rasAddress.u.ipAddress = pIpRasAddress; + pIRR->rasAddress.t=T_H225TransportAddress_ipAddress; /* IPv4 address */ + + /* Pose as gateway or terminal as per config */ + if(gH323ep.isGateway) + pIRR->endpointType.m.gatewayPresent = TRUE; + else + pIRR->endpointType.m.terminalPresent = TRUE; + + pIRR->endpointType.m.nonStandardDataPresent=FALSE; + pIRR->endpointType.m.vendorPresent=TRUE; + ooGkClientFillVendor(pGkClient, &pIRR->endpointType.vendor); + + /* Populate Endpoint Identifier */ + pIRR->endpointIdentifier.nchars = pGkClient->endpointId.nchars; + pIRR->endpointIdentifier.data = (ASN116BITCHAR*)memAlloc(pctxt, + sizeof(ASN116BITCHAR)*pGkClient->endpointId.nchars); + if(!pIRR->endpointIdentifier.data) + { + OOTRACEERR3("Error:Memory - ooGkClientSendIRR - " + "endpointIdentifier.data(%s, %s)\n", call->callType, + call->callToken); + memReset(pctxt); + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); + return OO_FAILED; + } + memcpy((void*)pIRR->endpointIdentifier.data, + (void*)pGkClient->endpointId.data, + sizeof(ASN116BITCHAR)*pGkClient->endpointId.nchars); + + + /* Populate call aliases */ + if(call->ourAliases) + srcAliases = call->ourAliases; + else + srcAliases = gH323ep.aliases; + + /* Populate Source Info */ + if(srcAliases) + { + iRet = ooPopulateAliasList(&pGkClient->msgCtxt, srcAliases, + &pIRR->endpointAlias); + if(OO_OK != iRet) + { + OOTRACEERR1("Error:Failed to populate source aliases -ARQ message\n"); + memReset(pctxt); + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); + return OO_FAILED; + } + } + pIRR->m.endpointAliasPresent = TRUE; + + /* Populate need response & unsolicited */ + pIRR->needResponse = FALSE; + pIRR->m.needResponsePresent = TRUE; + pIRR->unsolicited = TRUE; + pIRR->m.unsolicitedPresent = TRUE; + + /* Populate perCallInfo */ + + pIRR->m.perCallInfoPresent = TRUE; + + perCallInfo = + (H225InfoRequestResponse_perCallInfo_element *)memAlloc(pctxt, + sizeof(H225InfoRequestResponse_perCallInfo_element)); + memset(perCallInfo, 0, sizeof(H225InfoRequestResponse_perCallInfo_element)); + + if(!perCallInfo) + { + OOTRACEERR3("Error:Memory - ooGkClientSendIRR - " + "perCallInfo for (%s, %s)\n", call->callType, + call->callToken); + memReset(pctxt); + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); + return OO_FAILED; + } + + perCallInfo->m.originatorPresent = TRUE; + perCallInfo->originator = (!strcmp(call->callType, "incoming")) ? FALSE : TRUE; + + pLocalAddr = (H225TransportAddress_ipAddress*)memAlloc(pctxt, + sizeof(H225TransportAddress_ipAddress)); + pRemoteAddr = (H225TransportAddress_ipAddress*) memAlloc(pctxt, + sizeof(H225TransportAddress_ipAddress)); + if(!pLocalAddr || !pRemoteAddr) + { + OOTRACEERR1("Error:Failed to allocate memory for Call Signalling " + "Addresses of IRR message\n"); + memReset(pctxt); + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); + return OO_FAILED; + } + pLocalAddr->ip.numocts = 4; + ooSocketConvertIpToNwAddr(call->localIP, pLocalAddr->ip.data); + pLocalAddr->port = (call->pH225Channel->port) ? call->pH225Channel->port : gH323ep.listenPort; + + pRemoteAddr->ip.numocts = 4; + ooSocketConvertIpToNwAddr(call->remoteIP, pRemoteAddr->ip.data); + pRemoteAddr->port = call->remotePort; + + perCallInfo->callSignaling.m.sendAddressPresent = TRUE; + perCallInfo->callSignaling.sendAddress.t = T_H225TransportAddress_ipAddress; + perCallInfo->callSignaling.m.recvAddressPresent = TRUE; + perCallInfo->callSignaling.recvAddress.t = T_H225TransportAddress_ipAddress; + + if (!strcmp(call->callType, "incoming")) { +// terminator + perCallInfo->callSignaling.sendAddress.u.ipAddress = pRemoteAddr; + perCallInfo->callSignaling.recvAddress.u.ipAddress = pLocalAddr; + } else { +// originator + perCallInfo->callSignaling.sendAddress.u.ipAddress = pLocalAddr; + perCallInfo->callSignaling.recvAddress.u.ipAddress = pRemoteAddr; + } + + /* Populate call Reference */ + perCallInfo->callReferenceValue = call->callReference; + /* populate conferenceID */ + memcpy((void*)&perCallInfo->conferenceID, (void*)&call->confIdentifier, + sizeof(H225ConferenceIdentifier)); + /* Populate call identifier */ + perCallInfo->m.callIdentifierPresent = TRUE; + memcpy((void*)&perCallInfo->callIdentifier, (void*)&call->callIdentifier, + sizeof(H225CallIdentifier)); + /* Populate call type & call model */ + perCallInfo->callType.t = T_H225CallType_pointToPoint; + /* Add call model to message*/ + if(OO_TESTFLAG(call->flags, OO_M_GKROUTED)) + perCallInfo->callModel.t = T_H225CallModel_gatekeeperRouted; + else + perCallInfo->callModel.t = T_H225CallModel_direct; + + /* Populate usage info */ + if (call->alertingTime) { + perCallInfo->usageInformation.m.alertingTimePresent = TRUE; + perCallInfo->usageInformation.alertingTime = call->alertingTime; + } + if (call->connectTime) { + perCallInfo->usageInformation.m.connectTimePresent = TRUE; + perCallInfo->usageInformation.connectTime = call->connectTime; + } + perCallInfo->usageInformation.m.endTimePresent = FALSE; + perCallInfo->m.usageInformationPresent = TRUE; + + dListInit(&pIRR->perCallInfo); + dListAppend(pctxt, &pIRR->perCallInfo, + (void*)perCallInfo); + + iRet = ooGkClientSendMsg(pGkClient, pRasMsg); + if(iRet != OO_OK) + { + OOTRACEERR1("Error:Failed to send IRR message\n"); + memReset(pctxt); + pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); + return OO_FAILED; + } + OOTRACEINFO3("IRR message sent for (%s, %s)\n", + call->callType, call->callToken); + memReset(pctxt); + + ast_mutex_unlock(&pGkClient->Lock); + return OO_OK; +} + /** * This function is invoked to request call disengage to gatekeeper. * @@ -1973,6 +2334,8 @@ RasCallAdmissionInfo* pCallAdmInfo=NULL; pctxt = &pGkClient->msgCtxt; + ast_mutex_lock(&pGkClient->Lock); + OOTRACEINFO3("Sending disengage Request for call. (%s, %s)\n", call->callType, call->callToken); @@ -1981,6 +2344,7 @@ { OOTRACEERR1("Error: Memory allocation for DRQ RAS message failed\n"); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } @@ -1992,6 +2356,7 @@ OOTRACEERR1("Error: Failed to allocate memory for DRQ message\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } @@ -2012,6 +2377,7 @@ "message.\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memcpy((void*)pDRQ->endpointIdentifier.data, @@ -2043,6 +2409,7 @@ OOTRACEERR1("Error:Failed to allocate memory for GKId in DRQ.\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } memcpy(pDRQ->gatekeeperIdentifier.data, pGkClient->gkId.data, @@ -2058,12 +2425,31 @@ OOTRACEERR1("Error: Failed to allocate memory for cause ie in DRQ.\n"); memReset(pctxt); pGkClient->state = GkClientFailed; + ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } pDRQ->terminationCause.u.releaseCompleteCauseIE->numocts = strlen("Call Ended"); strcpy(pDRQ->terminationCause.u.releaseCompleteCauseIE->data, "Call Ended"); + /* populate usage info */ + + /* Populate usage info */ + if (call->alertingTime) { + pDRQ->usageInformation.m.alertingTimePresent = TRUE; + pDRQ->usageInformation.alertingTime = call->alertingTime; + } + if (call->connectTime) { + pDRQ->usageInformation.m.connectTimePresent = TRUE; + pDRQ->usageInformation.connectTime = call->connectTime; + } + pDRQ->usageInformation.m.endTimePresent = TRUE; + if (call->endTime) + pDRQ->usageInformation.endTime = call->endTime; + else + pDRQ->usageInformation.endTime = time(NULL); + pDRQ->m.usageInformationPresent = TRUE; + iRet = ooGkClientSendMsg(pGkClient, pRasMsg); if(iRet != OO_OK) { @@ -2086,6 +2472,7 @@ break; } } + ast_mutex_unlock(&pGkClient->Lock); return iRet; } @@ -2202,6 +2589,8 @@ ooGkClientTimerCb *cbData=NULL; RasCallAdmissionInfo *pAdmInfo = NULL; + ast_mutex_lock(&pGkClient->Lock); + for(x=0; xcallsAdmittedList.count; x++) { @@ -2212,7 +2601,7 @@ dListRemove(&pGkClient->callsAdmittedList, pNode); memFreePtr(&pGkClient->ctxt, pAdmInfo); memFreePtr(&pGkClient->ctxt, pNode); - return OO_OK; + break; } } @@ -2240,10 +2629,11 @@ dListRemove(&pGkClient->callsPendingList, pNode); memFreePtr(&pGkClient->ctxt, pAdmInfo); memFreePtr(&pGkClient->ctxt, pNode); - return OO_OK; + break; } } + ast_mutex_unlock(&pGkClient->Lock); return OO_OK; } --- channels/ooh323c/src/ooCapability.c 2009-07-04 00:10:21.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCapability.c 2009-07-02 13:19:21.000000000 +0400 @@ -2429,7 +2429,9 @@ OORX); break; case T_H245Capability_receiveAndTransmitAudioCapability: - epCap = NULL; + epCap = ooIsAudioDataTypeSupported(call, cap->u.receiveAudioCapability, OOTX); + if (!epCap) + epCap = ooIsAudioDataTypeSupported(call, cap->u.transmitAudioCapability, OORX); break; case T_H245Capability_receiveVideoCapability: return ooCapabilityUpdateJointCapabilitiesVideo(call,