diff options
Diffstat (limited to 'addons/ooh323c/src/ooh323.c')
-rw-r--r-- | addons/ooh323c/src/ooh323.c | 646 |
1 files changed, 612 insertions, 34 deletions
diff --git a/addons/ooh323c/src/ooh323.c b/addons/ooh323c/src/ooh323.c index 1cefa1d0b..038b1a0cd 100644 --- a/addons/ooh323c/src/ooh323.c +++ b/addons/ooh323c/src/ooh323.c @@ -14,6 +14,10 @@ * *****************************************************************************/ +#include <asterisk.h> +#include <asterisk/lock.h> +#include <time.h> + #include "ootypes.h" #include "ooq931.h" #include "ootrace.h" @@ -29,6 +33,202 @@ /** Global endpoint structure */ extern OOH323EndPoint gH323ep; +int ooHandleFastStart(OOH323CallData *call, H225Facility_UUIE *facility); +int ooOnReceivedReleaseComplete(OOH323CallData *call, Q931Message *q931Msg); +int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg); +int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg); +int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg); + +int ooHandleFastStart(OOH323CallData *call, H225Facility_UUIE *facility) +{ + H245OpenLogicalChannel* olc; + ASN1OCTET msgbuf[MAXMSGLEN]; + ooLogicalChannel * pChannel = NULL; + H245H2250LogicalChannelParameters * h2250lcp = NULL; + int i=0, ret=0; + + /* Handle fast-start */ + if(OO_TESTFLAG (call->flags, OO_M_FASTSTART)) + { + if(facility->m.fastStartPresent) + { + /* For printing the decoded message to log, initialize handler. */ + initializePrintHandler(&printHandler, "FastStart Elements"); + + /* Set print handler */ + setEventHandler (call->pctxt, &printHandler); + + for(i=0; i<(int)facility->fastStart.n; i++) + { + olc = NULL; + + olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt, + sizeof(H245OpenLogicalChannel)); + if(!olc) + { + OOTRACEERR3("ERROR:Memory - ooHandleFastStart - olc" + "(%s, %s)\n", call->callType, call->callToken); + /*Mark call for clearing */ + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_LOCAL_CLEARED; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + memset(olc, 0, sizeof(H245OpenLogicalChannel)); + memcpy(msgbuf, facility->fastStart.elem[i].data, + facility->fastStart.elem[i].numocts); + setPERBuffer(call->pctxt, msgbuf, + facility->fastStart.elem[i].numocts, 1); + ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc); + if(ret != ASN_OK) + { + OOTRACEERR3("ERROR:Failed to decode fast start olc element " + "(%s, %s)\n", call->callType, call->callToken); + /* Mark call for clearing */ + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + + dListAppend(call->pctxt, &call->remoteFastStartOLCs, olc); + + pChannel = ooFindLogicalChannelByOLC(call, olc); + if(!pChannel) + { + OOTRACEERR4("ERROR: Logical Channel %d not found, fast start. " + "(%s, %s)\n", + olc->forwardLogicalChannelNumber, call->callType, + call->callToken); + return OO_FAILED; + } + if(pChannel->channelNo != olc->forwardLogicalChannelNumber) + { + OOTRACEINFO5("Remote endpoint changed forwardLogicalChannel" + "Number from %d to %d (%s, %s)\n", + pChannel->channelNo, + olc->forwardLogicalChannelNumber, call->callType, + call->callToken); + pChannel->channelNo = olc->forwardLogicalChannelNumber; + } + if(!strcmp(pChannel->dir, "transmit")) + { + + if(olc->forwardLogicalChannelParameters.multiplexParameters.t != + T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters) + { + OOTRACEERR4("ERROR:Unknown multiplex parameter type for " + "channel %d (%s, %s)\n", + olc->forwardLogicalChannelNumber, call->callType, + call->callToken); + continue; + } + + /* Extract the remote media endpoint address */ + h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters; + if(!h2250lcp) + { + OOTRACEERR3("ERROR:Invalid OLC received in fast start. No " + "forward Logical Channel Parameters found. " + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + if(!h2250lcp->m.mediaChannelPresent) + { + OOTRACEERR3("ERROR:Invalid OLC received in fast start. No " + "reverse media channel information found." + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + ret = ooGetIpPortFromH245TransportAddress(call, + &h2250lcp->mediaChannel, pChannel->remoteIP, + &pChannel->remoteMediaPort); + + if(ret != OO_OK) + { + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } + OOTRACEERR3("ERROR:Unsupported media channel address type " + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + + if(!pChannel->chanCap->startTransmitChannel) + { + OOTRACEERR3("ERROR:No callback registered to start transmit " + "channel (%s, %s)\n",call->callType, + call->callToken); + return OO_FAILED; + } + pChannel->chanCap->startTransmitChannel(call, pChannel); + } + /* Mark the current channel as established and close all other + logical channels with same session id and in same direction. + */ + ooOnLogicalChannelEstablished(call, pChannel); + } + finishPrint(); + removeEventHandler(call->pctxt); + OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED); + } + + } + + if(facility->m.h245AddressPresent) + { + if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) + { + OO_CLRFLAG (call->flags, OO_M_TUNNELING); + OOTRACEINFO3("Tunneling is disabled for call as H245 address is " + "provided in facility message (%s, %s)\n", + call->callType, call->callToken); + } + ret = ooH323GetIpPortFromH225TransportAddress(call, + &facility->h245Address, call->remoteIP, + &call->remoteH245Port); + if(ret != OO_OK) + { + OOTRACEERR3("Error: Unknown H245 address type in received " + "CallProceeding message (%s, %s)", call->callType, + call->callToken); + /* Mark call for clearing */ + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + if(call->remoteH245Port != 0 && !call->pH245Channel) { + /* Create an H.245 connection. + */ + if(ooCreateH245Connection(call)== OO_FAILED) + { + OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n", + call->callType, call->callToken); + + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_TRANSPORTFAILURE; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + } + } else if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { + ret =ooSendTCSandMSD(call); + if (ret != OO_OK) + return ret; + } + return OO_OK; +} int ooOnReceivedReleaseComplete(OOH323CallData *call, Q931Message *q931Msg) { @@ -93,6 +293,7 @@ int ooOnReceivedReleaseComplete(OOH323CallData *call, Q931Message *q931Msg) if(call->callEndReason == OO_REASON_UNKNOWN) call->callEndReason = ooGetCallClearReasonFromCauseAndReasonCode(cause, reasonCode); + call->q931cause = cause; #if 0 if (q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && @@ -165,9 +366,9 @@ int ooOnReceivedSetup(OOH323CallData *call, Q931Message *q931Msg) pDisplayIE = ooQ931GetIE(q931Msg, Q931DisplayIE); if(pDisplayIE) { - call->remoteDisplayName = (ASN1OCTET*) memAlloc(call->pctxt, + call->remoteDisplayName = (char *) memAlloc(call->pctxt, pDisplayIE->length*sizeof(ASN1OCTET)+1); - strcpy(call->remoteDisplayName, pDisplayIE->data); + strcpy(call->remoteDisplayName, (char *)pDisplayIE->data); } /*Extract Remote Aliases, if present*/ if(setup->m.sourceAddressPresent) @@ -501,6 +702,11 @@ int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg) if(ret != OO_OK) { + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } OOTRACEERR3("ERROR:Unsupported media channel address type " "(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; @@ -560,6 +766,26 @@ int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg) } return OO_FAILED; } + if(call->remoteH245Port != 0 && !call->pH245Channel) { + /* Create an H.245 connection. + */ + if(ooCreateH245Connection(call)== OO_FAILED) + { + OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n", + call->callType, call->callToken); + + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_TRANSPORTFAILURE; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + } + } else if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { + ret =ooSendTCSandMSD(call); + if (ret != OO_OK) + return ret; } return OO_OK; } @@ -698,6 +924,234 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg) if(ret != OO_OK) { + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } + OOTRACEERR3("ERROR:Unsupported media channel address type " + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + + if(!pChannel->chanCap->startTransmitChannel) + { + OOTRACEERR3("ERROR:No callback registered to start transmit " + "channel (%s, %s)\n",call->callType, + call->callToken); + return OO_FAILED; + } + pChannel->chanCap->startTransmitChannel(call, pChannel); + /* Mark the current channel as established and close all other + logical channels with same session id and in same direction. + */ + ooOnLogicalChannelEstablished(call, pChannel); + } + } + finishPrint(); + removeEventHandler(call->pctxt); + OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED); + } + + } + + /* Retrieve the H.245 control channel address from the connect msg */ + if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && + q931Msg->userInfo->h323_uu_pdu.h245Tunneling && + alerting->m.h245AddressPresent) { + OOTRACEINFO3("Tunneling and h245address provided." + "Giving preference to Tunneling (%s, %s)\n", + call->callType, call->callToken); + } + else if(alerting->m.h245AddressPresent) + { + if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) + { + OO_CLRFLAG (call->flags, OO_M_TUNNELING); + OOTRACEINFO3("Tunneling is disabled for call as H245 address is " + "provided in Alerting message (%s, %s)\n", + call->callType, call->callToken); + } + ret = ooH323GetIpPortFromH225TransportAddress(call, + &alerting->h245Address, call->remoteIP, + &call->remoteH245Port); + if(ret != OO_OK) + { + OOTRACEERR3("Error: Unknown H245 address type in received " + "Alerting message (%s, %s)", call->callType, + call->callToken); + /* Mark call for clearing */ + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + if(call->remoteH245Port != 0 && !call->pH245Channel) { + /* Create an H.245 connection. + */ + if(ooCreateH245Connection(call)== OO_FAILED) + { + OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n", + call->callType, call->callToken); + + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_TRANSPORTFAILURE; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + } + } else if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { + ret =ooSendTCSandMSD(call); + if (ret != OO_OK) + return ret; + } + + + return OO_OK; +} + +int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg) +{ + H225Progress_UUIE *progress=NULL; + H245OpenLogicalChannel* olc; + ASN1OCTET msgbuf[MAXMSGLEN]; + ooLogicalChannel * pChannel = NULL; + H245H2250LogicalChannelParameters * h2250lcp = NULL; + int i=0, ret=0; + + + if(!q931Msg->userInfo) + { + OOTRACEERR3("ERROR:No User-User IE in received Progress message." + " (%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + progress = q931Msg->userInfo->h323_uu_pdu.h323_message_body.u.progress; + if(progress == NULL) + { + OOTRACEERR3("Error: Received Progress message does not have " + "progress UUIE (%s, %s)\n", call->callType, + call->callToken); + /* Mark call for clearing */ + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + /*Handle fast-start */ + if(OO_TESTFLAG (call->flags, OO_M_FASTSTART) && + !OO_TESTFLAG(call->flags, OO_M_FASTSTARTANSWERED)) + { + if(progress->m.fastStartPresent) + { + /* For printing the decoded message to log, initialize handler. */ + initializePrintHandler(&printHandler, "FastStart Elements"); + + /* Set print handler */ + setEventHandler (call->pctxt, &printHandler); + + for(i=0; i<(int)progress->fastStart.n; i++) + { + olc = NULL; + + olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt, + sizeof(H245OpenLogicalChannel)); + if(!olc) + { + OOTRACEERR3("ERROR:Memory - ooOnReceivedProgress - olc" + "(%s, %s)\n", call->callType, call->callToken); + /*Mark call for clearing */ + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_LOCAL_CLEARED; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + memset(olc, 0, sizeof(H245OpenLogicalChannel)); + memcpy(msgbuf, progress->fastStart.elem[i].data, + progress->fastStart.elem[i].numocts); + setPERBuffer(call->pctxt, msgbuf, + progress->fastStart.elem[i].numocts, 1); + ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc); + if(ret != ASN_OK) + { + OOTRACEERR3("ERROR:Failed to decode fast start olc element " + "(%s, %s)\n", call->callType, call->callToken); + /* Mark call for clearing */ + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + + dListAppend(call->pctxt, &call->remoteFastStartOLCs, olc); + + pChannel = ooFindLogicalChannelByOLC(call, olc); + if(!pChannel) + { + OOTRACEERR4("ERROR: Logical Channel %d not found, fast start. " + "(%s, %s)\n", + olc->forwardLogicalChannelNumber, call->callType, + call->callToken); + return OO_FAILED; + } + if(pChannel->channelNo != olc->forwardLogicalChannelNumber) + { + OOTRACEINFO5("Remote endpoint changed forwardLogicalChannel" + "Number from %d to %d (%s, %s)\n", + pChannel->channelNo, + olc->forwardLogicalChannelNumber, call->callType, + call->callToken); + pChannel->channelNo = olc->forwardLogicalChannelNumber; + } + if(!strcmp(pChannel->dir, "transmit")) + { + if(olc->forwardLogicalChannelParameters.multiplexParameters.t != + T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters) + { + OOTRACEERR4("ERROR:Unknown multiplex parameter type for " + "channel %d (%s, %s)\n", + olc->forwardLogicalChannelNumber, call->callType, + call->callToken); + continue; + } + + /* Extract the remote media endpoint address */ + h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters; + if(!h2250lcp) + { + OOTRACEERR3("ERROR:Invalid OLC received in fast start. No " + "forward Logical Channel Parameters found. " + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + if(!h2250lcp->m.mediaChannelPresent) + { + OOTRACEERR3("ERROR:Invalid OLC received in fast start. No " + "reverse media channel information found." + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + ret = ooGetIpPortFromH245TransportAddress(call, + &h2250lcp->mediaChannel, pChannel->remoteIP, + &pChannel->remoteMediaPort); + + if(ret != OO_OK) + { + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } OOTRACEERR3("ERROR:Unsupported media channel address type " "(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; @@ -727,27 +1181,27 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg) /* Retrieve the H.245 control channel address from the connect msg */ if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && - alerting->m.h245AddressPresent) { + progress->m.h245AddressPresent) { OOTRACEINFO3("Tunneling and h245address provided." "Giving preference to Tunneling (%s, %s)\n", call->callType, call->callToken); } - else if(alerting->m.h245AddressPresent) + else if(progress->m.h245AddressPresent) { if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { OO_CLRFLAG (call->flags, OO_M_TUNNELING); OOTRACEINFO3("Tunneling is disabled for call as H245 address is " - "provided in Alerting message (%s, %s)\n", + "provided in Progress message (%s, %s)\n", call->callType, call->callToken); } ret = ooH323GetIpPortFromH225TransportAddress(call, - &alerting->h245Address, call->remoteIP, + &progress->h245Address, call->remoteIP, &call->remoteH245Port); if(ret != OO_OK) { OOTRACEERR3("Error: Unknown H245 address type in received " - "Alerting message (%s, %s)", call->callType, + "Progress message (%s, %s)", call->callType, call->callToken); /* Mark call for clearing */ if(call->callState < OO_CALL_CLEAR) @@ -757,7 +1211,28 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg) } return OO_FAILED; } + if(call->remoteH245Port != 0 && !call->pH245Channel) { + /* Create an H.245 connection. + */ + if(ooCreateH245Connection(call)== OO_FAILED) + { + OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n", + call->callType, call->callToken); + + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_TRANSPORTFAILURE; + call->callState = OO_CALL_CLEAR; + } + return OO_FAILED; + } + } + } else if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) { + ret =ooSendTCSandMSD(call); + if (ret != OO_OK) + return ret; } + return OO_OK; } @@ -920,6 +1395,11 @@ int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg) &pChannel->remoteMediaPort); if(ret != OO_OK) { + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } OOTRACEERR3("ERROR:Unsupported media channel address type " "(%s, %s)\n", call->callType, call->callToken); finishPrint(); @@ -979,7 +1459,7 @@ int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg) } } - if(call->remoteH245Port != 0) + if(call->remoteH245Port != 0 && !call->pH245Channel) { /* Create an H.245 connection. */ @@ -1056,6 +1536,7 @@ int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg) DListNode *pNode = NULL; OOTimer *pTimer=NULL; int type = q931Msg->messageType; + struct timespec ts; switch(type) { case Q931SetupMsg: /* SETUP message is received */ @@ -1065,14 +1546,14 @@ int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg) /* H225 message callback */ if(gH323ep.h225Callbacks.onReceivedSetup) - gH323ep.h225Callbacks.onReceivedSetup(call, q931Msg); + ret = gH323ep.h225Callbacks.onReceivedSetup(call, q931Msg); /* Free up the mem used by the received message, as it's processing is done. */ - ooFreeQ931Message(q931Msg); - - ooSendCallProceeding(call);/* Send call proceeding message*/ + if (ret == OO_OK) { + + ooFreeQ931Message(call->msgctxt, q931Msg); /* DISABLEGK is used to selectively disable gatekeeper use. For incoming calls DISABLEGK can be set in onReceivedSetup callback by @@ -1083,19 +1564,31 @@ 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); - call->callState = OO_CALL_WAITING_ADMISSION; + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += 24; + ast_cond_timedwait(&call->gkWait, &call->Lock, &ts); + if (call->callState == OO_CALL_WAITING_ADMISSION) + call->callState = OO_CALL_CLEAR; + 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; @@ -1104,7 +1597,7 @@ int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg) call->callType, call->callToken); ooOnReceivedCallProceeding(call, q931Msg); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; @@ -1112,11 +1605,24 @@ int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg) 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->callState<OO_CALL_CLEAR) gH323ep.h323Callbacks.onAlerting(call); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); + break; + + + case Q931ProgressMsg:/* PROGRESS message received */ + OOTRACEINFO3("H.225 Progress message received (%s, %s)\n", + call->callType, call->callToken); + + ooOnReceivedProgress(call, q931Msg); + + if(gH323ep.h323Callbacks.onProgress && call->callState<OO_CALL_CLEAR) + gH323ep.h323Callbacks.onProgress(call); + ooFreeQ931Message(call->msgctxt, q931Msg); break; @@ -1124,6 +1630,8 @@ int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg) OOTRACEINFO3("H.225 Connect message received (%s, %s)\n", call->callType, call->callToken); + call->connectTime = (H235TimeStamp) time(NULL); + /* Disable call establishment timer */ for(i = 0; i<call->timerList.count; i++) { @@ -1151,12 +1659,18 @@ int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg) if(gH323ep.h323Callbacks.onCallEstablished) gH323ep.h323Callbacks.onCallEstablished(call); } - ooFreeQ931Message(q931Msg); + 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", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; @@ -1164,46 +1678,43 @@ int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg) OOTRACEINFO3("H.225 Release Complete message received (%s, %s)\n", call->callType, call->callToken); + call->endTime = (H235TimeStamp) time(NULL); + ooOnReceivedReleaseComplete(call, q931Msg); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931FacilityMsg: OOTRACEINFO3("H.225 Facility message Received (%s, %s)\n", call->callType, call->callToken); ooOnReceivedFacility(call, q931Msg); - ooFreeQ931Message(q931Msg); - break; - case Q931ProgressMsg: - OOTRACEINFO3("H.225 Progress message received (%s, %s)\n", - call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931StatusMsg: OOTRACEINFO3("H.225 Status message received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931StatusEnquiryMsg: OOTRACEINFO3("H.225 Status Inquiry message Received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931SetupAckMsg: OOTRACEINFO3("H.225 Setup Ack message received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931NotifyMsg: OOTRACEINFO3("H.225 Notify message Received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; default: OOTRACEWARN3("Invalid H.225 message type received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); } return ret; } @@ -1329,17 +1840,33 @@ int ooOnReceivedFacility(OOH323CallData *call, Q931Message * pQ931Msg) return OO_OK; } } + else if(facility->reason.t == T_H225FacilityReason_forwardedElements) + { + OOTRACEINFO3("Handling fast start in forwardedElem facility for " + "(%s, %s)\n", call->callType, call->callToken); + /*start H.245 channel*/ + ret = ooHandleFastStart(call, facility); + if(ret != OO_OK) + { + OOTRACEERR3("ERROR: Handling transportedInformation facility message " + "(%s, %s)\n", call->callType, call->callToken); + return ret; + } + } else{ OOTRACEINFO3("Unhandled Facility reason type received (%s, %s)\n", call->callType, call->callToken); } } 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; @@ -1396,7 +1923,7 @@ int ooHandleTunneledH245Messages (OOH323CallData *call, H225H323_UU_PDU * pH323UUPdu) { H245Message *pmsg; - OOCTXT *pctxt = &gH323ep.msgctxt; + OOCTXT *pctxt = call->msgctxt; int ret=0,i=0; OOTRACEDBGC3("Checking for tunneled H.245 messages (%s, %s)\n", @@ -1608,6 +2135,53 @@ int ooH323RetrieveAliases } +int ooPopulatePrefixList(OOCTXT *pctxt, OOAliases *pAliases, + H225_SeqOfH225SupportedPrefix *pPrefixList ) +{ + H225SupportedPrefix *pPrefixEntry=NULL; + OOAliases * pAlias=NULL; + ASN1BOOL bValid=FALSE; + + 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 ) { @@ -1622,6 +2196,10 @@ int ooPopulateAliasList(OOCTXT *pctxt, OOAliases *pAliases, pAlias = pAliases; while(pAlias) { + if (pAlias->value[0] == 0) { + pAlias = pAlias->next; + continue; + } pAliasEntry = (H225AliasAddress*)memAlloc(pctxt, sizeof(H225AliasAddress)); if(!pAliasEntry) |