diff options
Diffstat (limited to 'addons/ooh323c/src/ooq931.c')
-rw-r--r-- | addons/ooh323c/src/ooq931.c | 619 |
1 files changed, 455 insertions, 164 deletions
diff --git a/addons/ooh323c/src/ooq931.c b/addons/ooh323c/src/ooq931.c index e440b4c7b..8c8860b67 100644 --- a/addons/ooh323c/src/ooq931.c +++ b/addons/ooh323c/src/ooq931.c @@ -14,6 +14,10 @@ * *****************************************************************************/ +#include <asterisk.h> +#include <asterisk/lock.h> +#include <time.h> + #include "ooq931.h" #include "ootrace.h" #include "ooasn1.h" @@ -30,9 +34,13 @@ #include <time.h> #include <ctype.h> +int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg, + ASN1UINT *fsCount, ASN1DynOctStr **fsElem); + /** Global endpoint structure */ extern OOH323EndPoint gH323ep; +extern ast_mutex_t newCallLock; static ASN1OBJID gProtocolID = { 6, { 0, 0, 8, 2250, 0, 4 } @@ -44,7 +52,8 @@ EXTERN int ooQ931Decode int offset, x; int rv = ASN_OK; char number[128]; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; dListInit (&msg->ies); /* clear information elements list */ @@ -166,7 +175,7 @@ EXTERN int ooQ931Decode OOTRACEDBGB1(" }\n"); if(gH323ep.h323Callbacks.onReceivedDTMF) { - gH323ep.h323Callbacks.onReceivedDTMF(call, ie->data); + gH323ep.h323Callbacks.onReceivedDTMF(call, (char *)ie->data); } } /* Extract calling party number TODO:Give respect to presentation and @@ -229,7 +238,7 @@ EXTERN int ooQ931Decode we just ignore notify message as of now as handling is optional for end point*/ if(msg->messageType != Q931NotifyMsg) - rv = ooDecodeUUIE(msg); + rv = ooDecodeUUIE(pctxt, msg); return rv; } @@ -364,9 +373,9 @@ EXTERN void ooQ931Print (const Q931Message* q931msg) { } } -int ooCreateQ931Message(Q931Message **q931msg, int msgType) +int ooCreateQ931Message(OOCTXT* pctxt, Q931Message **q931msg, int msgType) { - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ *q931msg = (Q931Message*)memAllocZ(pctxt, sizeof(Q931Message)); @@ -397,10 +406,12 @@ int ooGenerateCallToken (char *callToken, size_t size) char aCallToken[200]; int ret = 0; + ast_mutex_lock(&newCallLock); sprintf (aCallToken, "ooh323c_%d", counter++); if (counter > OO_MAX_CALL_TOKEN) counter = 1; + ast_mutex_unlock(&newCallLock); if ((strlen(aCallToken)+1) < size) strcpy (callToken, aCallToken); @@ -479,24 +490,25 @@ int ooGenerateCallIdentifier(H225CallIdentifier *callid) } -int ooFreeQ931Message(Q931Message *q931Msg) +int ooFreeQ931Message(OOCTXT* pctxt, Q931Message *q931Msg) { if(!q931Msg) { - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(pctxt); } return OO_OK; } -int ooEncodeUUIE(Q931Message *q931msg) +int ooEncodeUUIE(OOCTXT* pctxt, Q931Message *q931msg) { ASN1OCTET msgbuf[1024]; ASN1OCTET * msgptr=NULL; int len; ASN1BOOL aligned = TRUE; Q931InformationElement* ie=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; - /* memset(msgbuf, 0, sizeof(msgbuf));*/ + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + memset(msgbuf, 0, sizeof(msgbuf)); if(!q931msg) { OOTRACEERR1("ERROR: Invalid Q931 message in add user-user IE\n"); @@ -547,14 +559,14 @@ int ooEncodeUUIE(Q931Message *q931msg) return OO_OK; } -int ooDecodeUUIE(Q931Message *q931Msg) +int ooDecodeUUIE(OOCTXT* pctxt, Q931Message *q931Msg) { DListNode* curNode; unsigned int i; ASN1BOOL aligned=TRUE; int stat; Q931InformationElement *ie; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ if(q931Msg ==NULL) { OOTRACEERR1("Error: ooDecodeUUIE failed - NULL q931 message\n"); @@ -566,7 +578,7 @@ int ooDecodeUUIE(Q931Message *q931Msg) i++, curNode = curNode->next) { ie = (Q931InformationElement*) curNode->data; - if(ie->discriminator == Q931UserUserIE) + if(ie && ie->discriminator == Q931UserUserIE) break; } if(i == q931Msg->ies.count) @@ -602,7 +614,8 @@ static void ooQ931PrintMessage (OOH323CallData* call, ASN1OCTET *msgbuf, ASN1UINT msglen) { - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; Q931Message q931Msg; int ret; @@ -650,7 +663,8 @@ int ooEncodeH225Message(OOH323CallData *call, Q931Message *pq931Msg, else if(pq931Msg->messageType == Q931CallProceedingMsg){ msgbuf[i++] = OOCallProceeding; } - else if(pq931Msg->messageType == Q931AlertingMsg){ + else if(pq931Msg->messageType == Q931AlertingMsg || + pq931Msg->messageType == Q931ProgressMsg){ msgbuf[i++] = OOAlert; } else if(pq931Msg->messageType == Q931ReleaseCompleteMsg){ @@ -671,7 +685,7 @@ int ooEncodeH225Message(OOH323CallData *call, Q931Message *pq931Msg, return OO_FAILED; } - stat = ooEncodeUUIE(pq931Msg); + stat = ooEncodeUUIE(call->msgctxt, pq931Msg); if(stat != OO_OK) { OOTRACEERR3("Error:Failed to encode uuie. (%s, %s)\n", call->callType, @@ -819,9 +833,9 @@ int ooEncodeH225Message(OOH323CallData *call, Q931Message *pq931Msg, #ifndef _COMPACT if(msgbuf[0] != OOFacility) - ooQ931PrintMessage (call, msgbuf+5, len-4); + ooQ931PrintMessage (call, (unsigned char *)msgbuf+5, len-4); else - ooQ931PrintMessage (call, msgbuf+8, len-4); + ooQ931PrintMessage (call, (unsigned char *)msgbuf+8, len-4); #endif return OO_OK; } @@ -829,7 +843,8 @@ int ooEncodeH225Message(OOH323CallData *call, Q931Message *pq931Msg, int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg, ASN1UINT *fsCount, ASN1DynOctStr **fsElem) { - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = pCall->msgctxt; int ret = 0, i=0, j=0, remoteMediaPort=0, remoteMediaControlPort = 0, dir=0; char remoteMediaIP[20], remoteMediaControlIP[20]; DListNode *pNode = NULL; @@ -859,22 +874,12 @@ int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg, (*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; } /* If fast start supported and remote endpoint has sent faststart element */ - if(OO_TESTFLAG(gH323ep.flags, OO_M_FASTSTART) && + if(OO_TESTFLAG(pCall->flags, OO_M_FASTSTART) && pCall->remoteFastStartOLCs.count>0) { pFS = (ASN1DynOctStr*)memAlloc(pctxt, @@ -1063,7 +1068,7 @@ int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg, } - ooPrepareFastStartResponseOLC(pCall, olc, epCap, pctxt, dir); + ooBuildFastStartOLC(pCall, olc, epCap, pctxt, dir); pChannel = ooFindLogicalChannelByLogicalChannelNo (pCall, olc->forwardLogicalChannelNumber); @@ -1115,7 +1120,7 @@ int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg, { OOTRACEERR3("ERROR:Encoding of olc failed for faststart " "(%s, %s)\n", pCall->callType, pCall->callToken); - ooFreeQ931Message(pQ931msg); + ooFreeQ931Message(pctxt, pQ931msg); if(pCall->callState < OO_CALL_CLEAR) { pCall->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -1123,11 +1128,11 @@ int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg, } return OO_FAILED; } - pFS[j].data = encodeGetMsgPtr(pctxt, &(pFS[j].numocts)); + pFS[j].data = (unsigned char *) encodeGetMsgPtr(pctxt, (int *)&(pFS[j].numocts)); /* start print call */ - setPERBuffer(pctxt, (char*)pFS[j].data, pFS[j].numocts, 1); + setPERBuffer(pctxt, (unsigned char*)pFS[j].data, pFS[j].numocts, 1); initializePrintHandler(&printHandler, "FastStart Element"); setEventHandler (pctxt, &printHandler); memset(&printOlc, 0, sizeof(printOlc)); @@ -1136,7 +1141,7 @@ int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg, { OOTRACEERR3("Error: Failed decoding FastStart Element (%s, %s)\n", pCall->callType, pCall->callToken); - ooFreeQ931Message(pQ931msg); + ooFreeQ931Message(pctxt, pQ931msg); if(pCall->callState < OO_CALL_CLEAR) { pCall->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -1190,6 +1195,35 @@ int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg, return ASN_OK; } +/* + +H225 CapSet/MS determination helper function + +*/ + +int ooSendTCSandMSD(OOH323CallData *call) +{ + int ret; + if(call->localTermCapState == OO_LocalTermCapExchange_Idle) { + ret = ooSendTermCapMsg(call); + if(ret != OO_OK) { + OOTRACEERR3("ERROR:Sending Terminal capability message (%s, %s)\n", + call->callType, call->callToken); + return ret; + } + } + if(call->masterSlaveState == OO_MasterSlave_Idle) { + ret = ooSendMasterSlaveDetermination(call); + if(ret != OO_OK) { + OOTRACEERR3("ERROR:Sending Master-slave determination message " + "(%s, %s)\n", call->callType, call->callToken); + return ret; + } + } + + return OO_OK; +} + /* @@ -1201,11 +1235,12 @@ int ooSendCallProceeding(OOH323CallData *call) H225VendorIdentifier *vendor; H225CallProceeding_UUIE *callProceeding; Q931Message *q931msg=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; OOTRACEDBGC3("Building CallProceeding (%s, %s)\n", call->callType, call->callToken); - ret = ooCreateQ931Message(&q931msg, Q931CallProceedingMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931CallProceedingMsg); if(ret != OO_OK) { OOTRACEERR1("Error: In allocating memory for - H225 Call " @@ -1225,7 +1260,7 @@ int ooSendCallProceeding(OOH323CallData *call) memset (q931msg->userInfo, 0, sizeof(H225H323_UserInformation)); q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1; q931msg->userInfo->h323_uu_pdu.h245Tunneling = - OO_TESTFLAG(gH323ep.flags, OO_M_TUNNELING); + OO_TESTFLAG(call->flags, OO_M_TUNNELING); q931msg->userInfo->h323_uu_pdu.h323_message_body.t = T_H225H323_UU_PDU_h323_message_body_callProceeding; @@ -1264,7 +1299,7 @@ int ooSendCallProceeding(OOH323CallData *call) vendor->m.productIdPresent = 1; vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID), sizeof(vendor->productId.data)); - strncpy(vendor->productId.data, gH323ep.productID, + strncpy((char *)vendor->productId.data, gH323ep.productID, vendor->productId.numocts); } if(gH323ep.versionID) @@ -1272,7 +1307,7 @@ int ooSendCallProceeding(OOH323CallData *call) vendor->m.versionIdPresent = 1; vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID), sizeof(vendor->versionId.data)); - strncpy(vendor->versionId.data, gH323ep.versionID, + strncpy((char *)vendor->versionId.data, gH323ep.versionID, vendor->versionId.numocts); } @@ -1288,7 +1323,8 @@ int ooSendCallProceeding(OOH323CallData *call) OOTRACEERR3("Error:Failed to enqueue CallProceeding message to outbound queue.(%s, %s)\n", call->callType, call->callToken); } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return ret; } @@ -1299,9 +1335,10 @@ int ooSendAlerting(OOH323CallData *call) H225Alerting_UUIE *alerting; H225VendorIdentifier *vendor; Q931Message *q931msg=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; - ret = ooCreateQ931Message(&q931msg, Q931AlertingMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931AlertingMsg); if(ret != OO_OK) { OOTRACEERR1("Error: In allocating memory for - H225 " @@ -1309,6 +1346,8 @@ int ooSendAlerting(OOH323CallData *call) return OO_FAILED; } + call->alertingTime = (H235TimeStamp) time(NULL); + q931msg->callReference = call->callReference; q931msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt, @@ -1320,7 +1359,7 @@ int ooSendAlerting(OOH323CallData *call) } memset (q931msg->userInfo, 0, sizeof(H225H323_UserInformation)); q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1; - q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(gH323ep.flags, + q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(call->flags, OO_M_TUNNELING); q931msg->userInfo->h323_uu_pdu.h323_message_body.t = T_H225H323_UU_PDU_h323_message_body_alerting; @@ -1382,7 +1421,7 @@ int ooSendAlerting(OOH323CallData *call) vendor->m.productIdPresent = 1; vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID), sizeof(vendor->productId.data)); - strncpy(vendor->productId.data, gH323ep.productID, + strncpy((char *)vendor->productId.data, gH323ep.productID, vendor->productId.numocts); } if(gH323ep.versionID) @@ -1390,7 +1429,7 @@ int ooSendAlerting(OOH323CallData *call) vendor->m.versionIdPresent = 1; vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID), sizeof(vendor->versionId.data)); - strncpy(vendor->versionId.data, gH323ep.versionID, + strncpy((char *)vendor->versionId.data, gH323ep.versionID, vendor->versionId.numocts); } @@ -1398,13 +1437,16 @@ int ooSendAlerting(OOH323CallData *call) 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; } @@ -1416,22 +1458,159 @@ int ooSendAlerting(OOH323CallData *call) OOTRACEERR3("Error: Failed to enqueue Alerting message to outbound queue. (%s, %s)\n", call->callType, call->callToken); } - memReset(&gH323ep.msgctxt); + ooSendTCSandMSD(call); + memReset (call->msgctxt); + + return ret; +} + +int ooSendProgress(OOH323CallData *call) +{ + int ret; + H225Progress_UUIE *progress; + H225VendorIdentifier *vendor; + Q931Message *q931msg=NULL; + H225TransportAddress_ipAddress *h245IpAddr; + OOCTXT *pctxt = call->msgctxt; + + ret = ooCreateQ931Message(pctxt, &q931msg, Q931ProgressMsg); + if(ret != OO_OK) + { + OOTRACEERR1("Error: In allocating memory for - H225 " + "Alerting message\n"); + return OO_FAILED; + } + + q931msg->callReference = call->callReference; + + q931msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt, + sizeof(H225H323_UserInformation)); + if(!q931msg->userInfo) + { + OOTRACEERR1("ERROR:Memory - ooSendAlerting - userInfo\n"); + return OO_FAILED; + } + memset (q931msg->userInfo, 0, sizeof(H225H323_UserInformation)); + q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1; + q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(call->flags, + OO_M_TUNNELING); + q931msg->userInfo->h323_uu_pdu.h323_message_body.t = + T_H225H323_UU_PDU_h323_message_body_progress; + + progress = (H225Progress_UUIE*)memAlloc(pctxt, + sizeof(H225Progress_UUIE)); + if(!progress) + { + OOTRACEERR1("ERROR:Memory - ooSendProgress- alerting\n"); + return OO_FAILED; + } + memset(progress, 0, sizeof(H225Progress_UUIE)); + q931msg->userInfo->h323_uu_pdu.h323_message_body.u.progress = progress; + progress->m.multipleCallsPresent = 1; + progress->m.maintainConnectionPresent = 1; + progress->multipleCalls = FALSE; + progress->maintainConnection = FALSE; + + progress->callIdentifier.guid.numocts = + call->callIdentifier.guid.numocts; + memcpy(progress->callIdentifier.guid.data, + call->callIdentifier.guid.data, + call->callIdentifier.guid.numocts); + progress->protocolIdentifier = gProtocolID; + + /* Pose as Terminal or Gateway */ + if(gH323ep.isGateway) + progress->destinationInfo.m.gatewayPresent = TRUE; + else + progress->destinationInfo.m.terminalPresent = TRUE; + + progress->destinationInfo.m.vendorPresent = 1; + vendor = &progress->destinationInfo.vendor; + if(gH323ep.productID) + { + vendor->m.productIdPresent = 1; + vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID), + sizeof(vendor->productId.data)); + strncpy((char *)vendor->productId.data, gH323ep.productID, + vendor->productId.numocts); + } + if(gH323ep.versionID) + { + vendor->m.versionIdPresent = 1; + vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID), + sizeof(vendor->versionId.data)); + strncpy((char *)vendor->versionId.data, gH323ep.versionID, + vendor->versionId.numocts); + } + + vendor->vendor.t35CountryCode = gH323ep.t35CountryCode; + vendor->vendor.t35Extension = gH323ep.t35Extension; + vendor->vendor.manufacturerCode = gH323ep.manufacturerCode; + + 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; + } + + /* Add h245 listener address. Do not add H245 listener address in case + of tunneling. */ + if (/* (!OO_TESTFLAG(call->flags, OO_M_FASTSTART) || + call->remoteFastStartOLCs.count == 0) && */ + !OO_TESTFLAG (call->flags, OO_M_TUNNELING) && + !call->h245listener && ooCreateH245Listener(call) == OO_OK) + { + progress->m.h245AddressPresent = TRUE; + progress->h245Address.t = T_H225TransportAddress_ipAddress; + + h245IpAddr = (H225TransportAddress_ipAddress*) + memAllocZ (pctxt, sizeof(H225TransportAddress_ipAddress)); + if(!h245IpAddr) + { + OOTRACEERR3("Error:Memory - ooAcceptCall - h245IpAddr" + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + ooSocketConvertIpToNwAddr(call->localIP, h245IpAddr->ip.data); + h245IpAddr->ip.numocts=4; + h245IpAddr->port = *(call->h245listenport); + progress->h245Address.u.ipAddress = h245IpAddr; + } + + OOTRACEDBGA3("Built Progress (%s, %s)\n", call->callType, call->callToken); + + ret = ooSendH225Msg(call, q931msg); + if(ret != OO_OK) + { + OOTRACEERR3("Error: Failed to enqueue Alerting message to outbound queue. (%s, %s)\n", call->callType, call->callToken); + } + + ooSendTCSandMSD(call); + memReset (call->msgctxt); return ret; } -int ooSendFacility(OOH323CallData *call) +int ooSendStartH245Facility(OOH323CallData *call) { int ret=0; Q931Message *pQ931Msg = NULL; H225Facility_UUIE *facility=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; + H225TransportAddress_ipAddress *h245IpAddr; OOTRACEDBGA3("Building Facility message (%s, %s)\n", call->callType, call->callToken); - ret = ooCreateQ931Message(&pQ931Msg, Q931FacilityMsg); + ret = ooCreateQ931Message(pctxt, &pQ931Msg, Q931FacilityMsg); if(ret != OO_OK) { OOTRACEERR3 @@ -1479,7 +1658,29 @@ int ooSendFacility(OOH323CallData *call) memcpy(facility->callIdentifier.guid.data, call->callIdentifier.guid.data, call->callIdentifier.guid.numocts); - facility->reason.t = T_H225FacilityReason_transportedInformation; + facility->reason.t = T_H225FacilityReason_startH245; + + if (!call->h245listener && ooCreateH245Listener(call) != OO_OK) { + OOTRACEERR3("Error:No H245Listener, can't send startH245 facility (%s, %s)\n", + call->callType, call->callToken); + return OO_FAILED; + } + + facility->m.h245AddressPresent = TRUE; + facility->h245Address.t = T_H225TransportAddress_ipAddress; + + h245IpAddr = (H225TransportAddress_ipAddress*) + memAllocZ (pctxt, sizeof(H225TransportAddress_ipAddress)); + if(!h245IpAddr) { + OOTRACEERR3("Error:Memory - ooSendFacility - h245IpAddr" + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + ooSocketConvertIpToNwAddr(call->localIP, h245IpAddr->ip.data); + h245IpAddr->ip.numocts=4; + h245IpAddr->port = *(call->h245listenport); + facility->h245Address.u.ipAddress = h245IpAddr; + OOTRACEDBGA3("Built Facility message to send (%s, %s)\n", call->callType, call->callToken); @@ -1490,7 +1691,8 @@ int ooSendFacility(OOH323CallData *call) ("Error:Failed to enqueue Facility message to outbound " "queue.(%s, %s)\n", call->callType, call->callToken); } - memReset (&gH323ep.msgctxt); + /* memReset (&gH323ep.msgctxt); */ + memReset (call->msgctxt); return ret; } @@ -1502,10 +1704,11 @@ int ooSendReleaseComplete(OOH323CallData *call) enum Q931CauseValues cause = Q931ErrorInCauseIE; unsigned h225ReasonCode = T_H225ReleaseCompleteReason_undefinedReason; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; OOTRACEDBGA3("Building Release Complete message to send(%s, %s)\n", call->callType, call->callToken); - ret = ooCreateQ931Message(&q931msg, Q931ReleaseCompleteMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931ReleaseCompleteMsg); if(ret != OO_OK) { OOTRACEERR3("Error: In ooCreateQ931Message - H225 Release Complete " @@ -1539,7 +1742,7 @@ int ooSendReleaseComplete(OOH323CallData *call) } memset(releaseComplete, 0, sizeof(H225ReleaseComplete_UUIE)); q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1; - q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(gH323ep.flags, + q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(call->flags, OO_M_TUNNELING); q931msg->userInfo->h323_uu_pdu.h323_message_body.t = T_H225H323_UU_PDU_h323_message_body_releaseComplete; @@ -1547,8 +1750,10 @@ int ooSendReleaseComplete(OOH323CallData *call) /* Get cause value and h225 reason code corresponding to OOCallClearReason*/ ooQ931GetCauseAndReasonCodeFromCallClearReason(call->callEndReason, &cause, &h225ReasonCode); + if (call->q931cause == 0) + call->q931cause = cause; /* Set Cause IE */ - ooQ931SetCauseIE(q931msg, cause, 0, 0); + ooQ931SetCauseIE(pctxt, q931msg, call->q931cause, 0, 0); /* Set H225 releaseComplete reasonCode */ releaseComplete->m.reasonPresent = TRUE; @@ -1579,13 +1784,23 @@ int ooSendReleaseComplete(OOH323CallData *call) OOTRACEERR3("Error:Failed to enqueue ReleaseComplete message to outbound" " queue.(%s, %s)\n", call->callType, call->callToken); } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return ret; } 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; } @@ -1598,9 +1813,10 @@ int ooAcceptCall(OOH323CallData *call) H225TransportAddress_ipAddress *h245IpAddr; H225VendorIdentifier *vendor; Q931Message *q931msg=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; - ret = ooCreateQ931Message(&q931msg, Q931ConnectMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931ConnectMsg); if(ret != OO_OK) { OOTRACEERR1("Error: In allocating memory for - H225 " @@ -1610,11 +1826,11 @@ int ooAcceptCall(OOH323CallData *call) q931msg->callReference = call->callReference; /* Set bearer capability */ - if(OO_OK != ooSetBearerCapabilityIE(q931msg, Q931CCITTStd, - Q931TransferUnrestrictedDigital, Q931TransferPacketMode, - Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725)) - // Q931TransferSpeech, Q931TransferCircuitMode, - // Q931TransferRate64Kbps, Q931UserInfoLayer1G711ULaw)) + if(OO_OK != ooSetBearerCapabilityIE(pctxt, q931msg, Q931CCITTStd, + // Q931TransferUnrestrictedDigital, Q931TransferPacketMode, + // Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725)) + Q931TransferSpeech, Q931TransferCircuitMode, + Q931TransferRate64Kbps, Q931UserInfoLayer1G711ALaw)) { OOTRACEERR3("Error: Failed to set bearer capability ie. (%s, %s)\n", call->callType, call->callToken); @@ -1708,7 +1924,7 @@ int ooAcceptCall(OOH323CallData *call) vendor->m.productIdPresent = 1; vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID), sizeof(vendor->productId.data)); - strncpy(vendor->productId.data, gH323ep.productID, + strncpy((char *)vendor->productId.data, gH323ep.productID, vendor->productId.numocts); } if(gH323ep.versionID) @@ -1716,27 +1932,42 @@ int ooAcceptCall(OOH323CallData *call) vendor->m.versionIdPresent = 1; vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID), sizeof(vendor->versionId.data)); - strncpy(vendor->versionId.data, gH323ep.versionID, + strncpy((char *)vendor->versionId.data, gH323ep.versionID, 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) || - call->remoteFastStartOLCs.count == 0) && - !OO_TESTFLAG (call->flags, OO_M_TUNNELING)) + if (/* (!OO_TESTFLAG(call->flags, OO_M_FASTSTART) || + call->remoteFastStartOLCs.count == 0) && */ + !OO_TESTFLAG (call->flags, OO_M_TUNNELING) && + !call->h245listener && ooCreateH245Listener(call) == OO_OK) { - ooCreateH245Listener(call); /* First create an H.245 listener */ connect->m.h245AddressPresent = TRUE; connect->h245Address.t = T_H225TransportAddress_ipAddress; @@ -1765,31 +1996,13 @@ int ooAcceptCall(OOH323CallData *call) if(ret != OO_OK) { OOTRACEERR3("Error:Failed to enqueue Connect message to outbound queue.(%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt);*/ + memReset(call->msgctxt); return OO_FAILED; } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); -#if 0 - if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) - { - /* Start terminal capability exchange and master slave determination */ - ret = ooSendTermCapMsg(call); - if(ret != OO_OK) - { - OOTRACEERR3("ERROR:Sending Terminal capability message (%s, %s)\n", - call->callType, call->callToken); - return ret; - } - ret = ooSendMasterSlaveDetermination(call); - if(ret != OO_OK) - { - OOTRACEERR3("ERROR:Sending Master-slave determination message " - "(%s, %s)\n", call->callType, call->callToken); - return ret; - } - } -#endif return OO_OK; } @@ -1798,6 +2011,7 @@ int ooH323HandleCallFwdRequest(OOH323CallData *call) OOH323CallData *fwdedCall=NULL; OOCTXT *pctxt; ooAliases *pNewAlias=NULL, *alias=NULL; + struct timespec ts; 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.*/ @@ -1852,15 +2066,42 @@ int ooH323HandleCallFwdRequest(OOH323CallData *call) 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_cond_timedwait(&fwdedCall->gkWait, &fwdedCall->Lock, &ts); + 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; } +int ooH323NewCall(char *callToken) { + OOH323CallData* call; + if(!callToken) + { + OOTRACEERR1("ERROR: Invalid callToken parameter to make call\n"); + return OO_FAILED; + } + call = ooCreateCall("outgoing", callToken); + if (!call) + { + OOTRACEERR1("ERROR: Can't create call %s\n"); + return OO_FAILED; + } + + return OO_OK; +} + int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts) { OOCTXT *pctxt; @@ -1868,6 +2109,7 @@ int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts) int ret=0, i=0, irand=0; char tmp[30]="\0"; char *ip=NULL, *port = NULL; + struct timespec ts; if(!dest) { @@ -1880,7 +2122,14 @@ int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts) return OO_FAILED; } - call = ooCreateCall("outgoing", callToken); + /* call = ooCreateCall("outgoing", callToken); */ + call = ooFindCallByToken(callToken); + if (!call) + { + OOTRACEERR1("ERROR: Can't create call %s\n"); + return OO_FAILED; + } + pctxt = call->pctxt; if(opts) { @@ -1900,10 +2149,11 @@ int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts) OO_CLRFLAG(call->flags, OO_M_DISABLEGK); call->callMode = opts->callMode; + call->transfercap = opts->transfercap; } - ret = ooParseDestination(call, dest, tmp, 30, &call->remoteAliases); + ret = ooParseDestination(call, dest, tmp, 24, &call->remoteAliases); if(ret != OO_OK) { OOTRACEERR2("Error: Failed to parse the destination string %s for " @@ -1936,14 +2186,28 @@ int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts) { /* 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 */ - ret = ooH323CallAdmitted (call); + + call->callState = OO_CALL_WAITING_ADMISSION; + ast_mutex_lock(&call->Lock); + ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE); + 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); + } + /* 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; } @@ -1972,6 +2236,11 @@ int ooH323CallAdmitted(OOH323CallData *call) } return OO_FAILED; } + + if(gH323ep.h323Callbacks.onOutgoingCall) { + /* Outgoing call callback function */ + gH323ep.h323Callbacks.onOutgoingCall(call); + } ret = ooH323MakeCall_helper(call); } @@ -2012,9 +2281,10 @@ int ooH323MakeCall_helper(OOH323CallData *call) ASN1BOOL aligned = 1; ooAliases *pAlias = NULL; - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; - ret = ooCreateQ931Message(&q931msg, Q931SetupMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931SetupMsg); if(ret != OO_OK) { OOTRACEERR1("ERROR:Failed to Create Q931 SETUP Message\n "); @@ -2024,10 +2294,11 @@ int ooH323MakeCall_helper(OOH323CallData *call) q931msg->callReference = call->callReference; /* Set bearer capability */ - if(OO_OK != ooSetBearerCapabilityIE(q931msg, Q931CCITTStd, - Q931TransferUnrestrictedDigital, Q931TransferPacketMode, - Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725)) -// Q931TransferRate64Kbps, Q931UserInfoLayer1G711ULaw)) + if(OO_OK != ooSetBearerCapabilityIE(pctxt, q931msg, Q931CCITTStd, + // Q931TransferUnrestrictedDigital, Q931TransferPacketMode, + call->transfercap, Q931TransferCircuitMode, + // Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725)) + Q931TransferRate64Kbps, Q931UserInfoLayer1G711ALaw)) { OOTRACEERR3("Error: Failed to set bearer capability ie.(%s, %s)\n", call->callType, call->callToken); @@ -2035,14 +2306,14 @@ int ooH323MakeCall_helper(OOH323CallData *call) } /* Set calling party number Q931 IE */ - if(call->callingPartyNumber) - ooQ931SetCallingPartyNumberIE(q931msg, + if(call->callingPartyNumber && call->callingPartyNumber[0]) + ooQ931SetCallingPartyNumberIE(pctxt, q931msg, (const char*)call->callingPartyNumber, 1, 0, 0, 0); /* Set called party number Q931 IE */ if(call->calledPartyNumber) - ooQ931SetCalledPartyNumberIE(q931msg, + ooQ931SetCalledPartyNumberIE(pctxt, q931msg, (const char*)call->calledPartyNumber, 1, 0); else if(call->remoteAliases) { pAlias = call->remoteAliases; @@ -2063,7 +2334,7 @@ int ooH323MakeCall_helper(OOH323CallData *call) return OO_FAILED; } strcpy(call->calledPartyNumber, pAlias->value); - ooQ931SetCalledPartyNumberIE(q931msg, + ooQ931SetCalledPartyNumberIE(pctxt, q931msg, (const char*)call->calledPartyNumber, 1, 0); } @@ -2208,7 +2479,7 @@ int ooH323MakeCall_helper(OOH323CallData *call) setup->sourceCallSignalAddress.u.ipAddress = srcCallSignalIpAddress; setup->m.sourceCallSignalAddressPresent=TRUE; /* No fast start */ - if(!OO_TESTFLAG(gH323ep.flags, OO_M_FASTSTART)) + if(!OO_TESTFLAG(call->flags, OO_M_FASTSTART)) { setup->m.fastStartPresent = FALSE; } @@ -2257,7 +2528,10 @@ int ooH323MakeCall_helper(OOH323CallData *call) continue; } +/* don't send t38/other data caps in fasstart olcs */ + if (epCap->capType == OO_CAP_TYPE_DATA) + continue; OOTRACEDBGC4("Building olcs with capability %s. (%s, %s)\n", ooGetCapTypeText(epCap->cap), call->callType, @@ -2270,7 +2544,7 @@ int ooH323MakeCall_helper(OOH323CallData *call) { OOTRACEERR3("ERROR:Memory - ooH323MakeCall_helper - olc(%s, %s)" "\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2290,7 +2564,7 @@ int ooH323MakeCall_helper(OOH323CallData *call) { OOTRACEERR3("ERROR:Encoding of olc failed for faststart(%s, %s)" "\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2298,11 +2572,11 @@ int ooH323MakeCall_helper(OOH323CallData *call) } return OO_FAILED; } - pFS[i].data = encodeGetMsgPtr(pctxt, &(pFS[i].numocts)); + pFS[i].data = (unsigned char *)encodeGetMsgPtr(pctxt, (int *)&(pFS[i].numocts)); /* Dump faststart element in logfile for debugging purpose */ - setPERBuffer(pctxt, (char*)pFS[i].data, pFS[i].numocts, 1); + setPERBuffer(pctxt, (unsigned char*)pFS[i].data, pFS[i].numocts, 1); initializePrintHandler(&printHandler, "FastStart Element"); setEventHandler (pctxt, &printHandler); memset(&printOlc, 0, sizeof(printOlc)); @@ -2311,7 +2585,7 @@ int ooH323MakeCall_helper(OOH323CallData *call) { OOTRACEERR3("Error: Failed decoding FastStart Element." "(%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2338,7 +2612,7 @@ int ooH323MakeCall_helper(OOH323CallData *call) { OOTRACEERR3("ERROR:Memory - ooH323MakeCall_helper - olc(%s, %s)" "\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2358,7 +2632,7 @@ int ooH323MakeCall_helper(OOH323CallData *call) { OOTRACEERR3("ERROR:Encoding of olc failed for faststart(%s, %s)" "\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2366,10 +2640,10 @@ int ooH323MakeCall_helper(OOH323CallData *call) } return OO_FAILED; } - pFS[i].data = encodeGetMsgPtr(pctxt, &(pFS[i].numocts)); + pFS[i].data = (unsigned char *)encodeGetMsgPtr(pctxt, (int *)&(pFS[i].numocts)); /* Dump faststart element in logfile for debugging purpose */ - setPERBuffer(pctxt, (char*)pFS[i].data, pFS[i].numocts, 1); + setPERBuffer(pctxt, (unsigned char*)pFS[i].data, pFS[i].numocts, 1); initializePrintHandler(&printHandler, "FastStart Element"); setEventHandler (pctxt, &printHandler); memset(&printOlc, 0, sizeof(printOlc)); @@ -2378,7 +2652,7 @@ int ooH323MakeCall_helper(OOH323CallData *call) { OOTRACEERR3("Error: Failed decoding FastStart Element." "(%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2442,8 +2716,10 @@ int ooH323MakeCall_helper(OOH323CallData *call) /* For H.323 version 4 and higher, if fast connect, tunneling should be supported. */ - if(OO_TESTFLAG(call->flags, OO_M_FASTSTART)) + if(OO_TESTFLAG(call->flags, OO_M_FASTSTART)) { q931msg->userInfo->h323_uu_pdu.h245Tunneling = TRUE; + OO_SETFLAG(call->flags, OO_M_TUNNELING); + } OOTRACEDBGA3("Built SETUP message (%s, %s)\n", call->callType, call->callToken); @@ -2457,7 +2733,8 @@ int ooH323MakeCall_helper(OOH323CallData *call) { OOTRACEERR3("Error:Failed to enqueue SETUP message to outbound queue. (%s, %s)\n", call->callType, call->callToken); } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt);*/ + memReset(call->msgctxt); return ret; } @@ -2469,9 +2746,10 @@ int ooQ931SendDTMFAsKeyPadIE(OOH323CallData *call, const char* data) int ret; H225Information_UUIE *information=NULL; Q931Message *q931msg=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; - ret = ooCreateQ931Message(&q931msg, Q931InformationMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931InformationMsg); if(ret != OO_OK) { OOTRACEERR3("Error: In allocating memory for - H225 Information message." @@ -2487,11 +2765,12 @@ int ooQ931SendDTMFAsKeyPadIE(OOH323CallData *call, const char* data) { OOTRACEERR3("ERROR:Memory - ooQ931SendDTMFAsKeypadIE - userInfo" "(%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return OO_FAILED; } q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1; - q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(gH323ep.flags, + q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(call->flags, OO_M_TUNNELING); q931msg->userInfo->h323_uu_pdu.h323_message_body.t = T_H225H323_UU_PDU_h323_message_body_information; @@ -2502,7 +2781,8 @@ int ooQ931SendDTMFAsKeyPadIE(OOH323CallData *call, const char* data) { OOTRACEERR3("ERROR:Memory - ooQ931SendDTMFAsKeypadIE - information" "(%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return OO_FAILED; } q931msg->userInfo->h323_uu_pdu.h323_message_body.u.information = @@ -2516,12 +2796,13 @@ int ooQ931SendDTMFAsKeyPadIE(OOH323CallData *call, const char* data) information->protocolIdentifier = gProtocolID; /*Add keypad IE*/ - ret = ooQ931SetKeypadIE(q931msg, data); + ret = ooQ931SetKeypadIE(pctxt, q931msg, data); if(ret != OO_OK) { OOTRACEERR3("Error:Creating keypad IE for (%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return OO_FAILED; } @@ -2531,7 +2812,8 @@ int ooQ931SendDTMFAsKeyPadIE(OOH323CallData *call, const char* data) OOTRACEERR3("Error:Failed to enqueue Information message to outbound " "queue. (%s, %s)\n", call->callType, call->callToken); } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return ret; @@ -2586,7 +2868,7 @@ int ooH323ForwardCall(char* callToken, char *dest) strcpy(call->pCallFwdData->ip, ip); } - ret = ooCreateQ931Message(&pQ931Msg, Q931FacilityMsg); + ret = ooCreateQ931Message(pctxt, &pQ931Msg, Q931FacilityMsg); if(ret != OO_OK) { OOTRACEERR3 @@ -2683,7 +2965,7 @@ int ooH323ForwardCall(char* callToken, char *dest) return ret; } -int ooH323HangCall(char * callToken, OOCallClearReason reason) +int ooH323HangCall(char * callToken, OOCallClearReason reason, int q931cause) { OOH323CallData *call; @@ -2698,19 +2980,20 @@ int ooH323HangCall(char * callToken, OOCallClearReason reason) if(call->callState < OO_CALL_CLEAR) { call->callEndReason = reason; + call->q931cause = q931cause; call->callState = OO_CALL_CLEAR; } return OO_OK; } int ooSetBearerCapabilityIE - (Q931Message *pmsg, enum Q931CodingStandard codingStandard, + (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CodingStandard codingStandard, enum Q931InformationTransferCapability capability, enum Q931TransferMode transferMode, enum Q931TransferRate transferRate, enum Q931UserInfoLayer1Protocol userInfoLayer1) { unsigned size = 3; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ if(pmsg->bearerCapabilityIE) { @@ -2738,10 +3021,10 @@ int ooSetBearerCapabilityIE return OO_OK; } -int ooQ931SetKeypadIE(Q931Message *pmsg, const char* data) +int ooQ931SetKeypadIE(OOCTXT* pctxt, Q931Message *pmsg, const char* data) { unsigned len = 0; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ len = strlen(data); pmsg->keypadIE = (Q931InformationElement*) @@ -2762,11 +3045,11 @@ int ooQ931SetKeypadIE(Q931Message *pmsg, const char* data) int ooQ931SetCallingPartyNumberIE - (Q931Message *pmsg, const char *number, unsigned plan, unsigned type, + (OOCTXT* pctxt, Q931Message *pmsg, const char *number, unsigned plan, unsigned type, unsigned presentation, unsigned screening) { unsigned len = 0; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ if(pmsg->callingPartyNumberIE) { @@ -2793,10 +3076,10 @@ int ooQ931SetCallingPartyNumberIE } int ooQ931SetCalledPartyNumberIE - (Q931Message *pmsg, const char *number, unsigned plan, unsigned type) + (OOCTXT* pctxt, Q931Message *pmsg, const char *number, unsigned plan, unsigned type) { unsigned len = 0; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ if(pmsg->calledPartyNumberIE) { @@ -2822,10 +3105,10 @@ int ooQ931SetCalledPartyNumberIE } int ooQ931SetCauseIE - (Q931Message *pmsg, enum Q931CauseValues cause, unsigned coding, + (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CauseValues cause, unsigned coding, unsigned location) { - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ if(pmsg->causeIE){ memFreePtr(pctxt, pmsg->causeIE); @@ -2859,12 +3142,13 @@ int ooSendAsTunneledMessage(OOH323CallData *call, ASN1OCTET* msgbuf, ASN1DynOctStr * elem; int ret =0; H225Facility_UUIE *facility=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; OOTRACEDBGA4("Building Facility message for tunneling %s (%s, %s)\n", ooGetMsgTypeText(h245MsgType), call->callType, call->callToken); - ret = ooCreateQ931Message(&pQ931Msg, Q931FacilityMsg); + ret = ooCreateQ931Message(pctxt, &pQ931Msg, Q931FacilityMsg); if(ret != OO_OK) { OOTRACEERR3("ERROR: In allocating memory for facility message " @@ -2880,7 +3164,8 @@ int ooSendAsTunneledMessage(OOH323CallData *call, ASN1OCTET* msgbuf, { OOTRACEERR3("ERROR:Memory - ooSendAsTunneledMessage - userInfo" " (%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt);*/ + memReset(call->msgctxt); return OO_FAILED; } memset (pQ931Msg->userInfo, 0, sizeof(H225H323_UserInformation)); @@ -2899,7 +3184,8 @@ int ooSendAsTunneledMessage(OOH323CallData *call, ASN1OCTET* msgbuf, { OOTRACEERR3("ERROR:Memory - ooSendAsTunneledMessage - facility (%s, %s)" "\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return OO_FAILED; } @@ -2951,7 +3237,8 @@ int ooSendAsTunneledMessage(OOH323CallData *call, ASN1OCTET* msgbuf, main received H225 message processing is finished. Rule. No reset when tunneling */ - memFreePtr(&gH323ep.msgctxt, pQ931Msg); + /* memFreePtr(&gH323ep.msgctxt, pQ931Msg); */ + memFreePtr(call->msgctxt, pQ931Msg); return ret; } @@ -3378,7 +3665,11 @@ const char* ooGetMsgTypeText (int msgType) "OORequestChannelCloseAck", "OORequestChannelCloseReject", "OORequestChannelCloseRelease", - "OOEndSessionCommand" + "OOEndSessionCommand", + "OOUserInputIndication", + "OORequestModeAck", + "OORequestModeReject", + "OORequestMode" }; int idx = msgType - OO_MSGTYPE_MIN; return ooUtilsGetText (idx, msgTypeText, OONUMBEROF(msgTypeText)); |