summaryrefslogtreecommitdiff
path: root/addons/ooh323c/src/ooCalls.c
diff options
context:
space:
mode:
authorAlexandr Anikin <may@telecom-service.ru>2009-11-04 22:10:44 +0000
committerAlexandr Anikin <may@telecom-service.ru>2009-11-04 22:10:44 +0000
commit953031095415efa4558ca7eff29d7c85ff8efe89 (patch)
treec8a21eb3b2896c7f5b558913cb7ea914b40a06ce /addons/ooh323c/src/ooCalls.c
parent317435a93200520218c4e9f4bbb8c0258f363876 (diff)
Reworked chan_ooh323 channel module.
Many architectural and functional changes. Main changes are threading model chanes (many thread in ooh323 stack instead of one), modifications and improvements in signalling part, additional codecs support (726, speex), t38 mode support. This module tested and used in production environment. (closes issue #15285) Reported by: may213 Tested by: sles, c0w, OrNix Review: https://reviewboard.asterisk.org/r/324/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@227898 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'addons/ooh323c/src/ooCalls.c')
-rw-r--r--addons/ooh323c/src/ooCalls.c144
1 files changed, 139 insertions, 5 deletions
diff --git a/addons/ooh323c/src/ooCalls.c b/addons/ooh323c/src/ooCalls.c
index 33f584c5a..75450182e 100644
--- a/addons/ooh323c/src/ooCalls.c
+++ b/addons/ooh323c/src/ooCalls.c
@@ -14,6 +14,9 @@
*
*****************************************************************************/
+#include <asterisk.h>
+#include <asterisk/lock.h>
+
#include "ootrace.h"
#include "ootypes.h"
#include "ooCalls.h"
@@ -28,11 +31,14 @@
/** Global endpoint structure */
extern OOH323EndPoint gH323ep;
+extern ast_mutex_t callListLock;
+extern ast_mutex_t newCallLock;
OOH323CallData* ooCreateCall(char* type, char*callToken)
{
OOH323CallData *call=NULL;
OOCTXT *pctxt=NULL;
+ OOCTXT *msgctxt=NULL;
pctxt = newContext();
if(!pctxt)
@@ -40,14 +46,26 @@ OOH323CallData* ooCreateCall(char* type, char*callToken)
OOTRACEERR1("ERROR:Failed to create OOCTXT for new call\n");
return NULL;
}
+ msgctxt = newContext();
+ if(!msgctxt)
+ {
+ OOTRACEERR1("ERROR:Failed to create OOCTXT for new call\n");
+ return NULL;
+ }
+ ast_mutex_lock(&newCallLock);
+ /* call = (OOH323CallData*)memAlloc(&gH323ep.ctxt, sizeof(OOH323CallData)); */
call = (OOH323CallData*)memAlloc(pctxt, sizeof(OOH323CallData));
+ ast_mutex_unlock(&newCallLock);
if(!call)
{
OOTRACEERR1("ERROR:Memory - ooCreateCall - call\n");
return NULL;
}
- /* memset(call, 0, sizeof(OOH323CallData));*/
+ memset(call, 0, sizeof(OOH323CallData));
+ ast_cond_init(&call->gkWait, NULL);
+ ast_mutex_init(&call->Lock);
call->pctxt = pctxt;
+ call->msgctxt = msgctxt;
call->callMode = gH323ep.callMode;
sprintf(call->callToken, "%s", callToken);
sprintf(call->callType, "%s", type);
@@ -80,6 +98,12 @@ OOH323CallData* ooCreateCall(char* type, char*callToken)
if (OO_TESTFLAG(gH323ep.flags, OO_M_MEDIAWAITFORCONN))
OO_SETFLAG (call->flags, OO_M_MEDIAWAITFORCONN);
+
+ call->fsSent = FALSE;
+
+// May 20090713. Fix it for Video session
+
+ OO_SETFLAG(call->flags, OO_M_AUDIOSESSION);
call->callState = OO_CALL_CREATED;
call->callEndReason = OO_REASON_UNKNOWN;
@@ -158,6 +182,8 @@ OOH323CallData* ooCreateCall(char* type, char*callToken)
int ooAddCallToList(OOH323CallData *call)
{
+ ast_mutex_lock(&callListLock);
+
if(!gH323ep.callList)
{
gH323ep.callList = call;
@@ -170,6 +196,9 @@ int ooAddCallToList(OOH323CallData *call)
gH323ep.callList->prev = call;
gH323ep.callList = call;
}
+
+ ast_mutex_unlock(&callListLock);
+
return OO_OK;
}
@@ -180,9 +209,16 @@ int ooEndCall(OOH323CallData *call)
ooGetCallStateText(call->callState), call->callType,
call->callToken);
+ if(call->callState == OO_CALL_REMOVED) {
+ OOTRACEINFO2("Call already removed %s\n",
+ call->callToken);
+ return OO_OK;
+ }
+
if(call->callState == OO_CALL_CLEARED)
{
ooCleanCall(call);
+ call->callState = OO_CALL_REMOVED;
return OO_OK;
}
@@ -230,6 +266,11 @@ int ooRemoveCallFromList (OOH323CallData *call)
if(!call)
return OO_OK;
+ ast_mutex_lock(&callListLock);
+
+ OOTRACEINFO3("Removing call %lx: %s\n", call, call->callToken);
+
+ if (!gH323ep.callList) return OO_OK;
if(call == gH323ep.callList)
{
if(!call->next)
@@ -244,6 +285,9 @@ int ooRemoveCallFromList (OOH323CallData *call)
if(call->next)
call->next->prev = call->prev;
}
+
+ ast_mutex_unlock(&callListLock);
+
return OO_OK;
}
@@ -258,7 +302,7 @@ int ooCleanCall(OOH323CallData *call)
/* First clean all the logical channels, if not already cleaned. */
if(call->logicalChans)
ooClearAllLogicalChannels(call);
-
+
/* Close H.245 connection, if not already closed */
if(call->h245SessionState != OO_H245SESSION_CLOSED)
ooCloseH245Connection(call);
@@ -314,9 +358,24 @@ int ooCleanCall(OOH323CallData *call)
gH323ep.h323Callbacks.onCallCleared(call);
}
- pctxt = call->pctxt;
+ if (call->rtpMask) {
+ ast_mutex_lock(&call->rtpMask->lock);
+ call->rtpMask->inuse--;
+ ast_mutex_unlock(&call->rtpMask->lock);
+ if ((call->rtpMask->inuse) == 0) {
+ regfree(&call->rtpMask->regex);
+ ast_mutex_destroy(&call->rtpMask->lock);
+ free(call->rtpMask);
+ }
+ }
+
+ pctxt = call->msgctxt;
freeContext(pctxt);
- ASN1CRTFREE0(pctxt);
+ free(pctxt);
+ call->msgctxt = NULL;
+/* May !!!! Fix it !! */
+ /* free(pctxt); */
+
return OO_OK;
}
@@ -489,6 +548,44 @@ int ooCallAddRemoteAliasDialedDigits
/* Used to override global end point capabilities and add call specific
capabilities */
+int ooCallAddG726Capability(OOH323CallData *call, int cap, int txframes,
+ int rxframes, OOBOOL silenceSuppression, int dir,
+ cb_StartReceiveChannel startReceiveChannel,
+ cb_StartTransmitChannel startTransmitChannel,
+ cb_StopReceiveChannel stopReceiveChannel,
+ cb_StopTransmitChannel stopTransmitChannel)
+{
+ return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
+ stopTransmitChannel, FALSE);
+}
+int ooCallAddAMRNBCapability(OOH323CallData *call, int cap, int txframes,
+ int rxframes, OOBOOL silenceSuppression, int dir,
+ cb_StartReceiveChannel startReceiveChannel,
+ cb_StartTransmitChannel startTransmitChannel,
+ cb_StopReceiveChannel stopReceiveChannel,
+ cb_StopTransmitChannel stopTransmitChannel)
+{
+ return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
+ stopTransmitChannel, FALSE);
+}
+
+int ooCallAddSpeexCapability(OOH323CallData *call, int cap, int txframes,
+ int rxframes, OOBOOL silenceSuppression, int dir,
+ cb_StartReceiveChannel startReceiveChannel,
+ cb_StartTransmitChannel startTransmitChannel,
+ cb_StopReceiveChannel stopReceiveChannel,
+ cb_StopTransmitChannel stopTransmitChannel)
+{
+ return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
+ stopTransmitChannel, FALSE);
+}
+
int ooCallAddG7231Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
@@ -596,6 +693,16 @@ int ooCallDisableDTMFRFC2833(OOH323CallData *call)
return ooCapabilityDisableDTMFRFC2833(call);
}
+int ooCallEnableDTMFCISCO(OOH323CallData *call, int dynamicRTPPayloadType)
+{
+ return ooCapabilityEnableDTMFCISCO(call, dynamicRTPPayloadType);
+}
+
+int ooCallDisableDTMFCISCO(OOH323CallData *call)
+{
+ return ooCapabilityDisableDTMFCISCO(call);
+}
+
int ooCallEnableDTMFH245Alphanumeric(OOH323CallData *call)
{
@@ -628,7 +735,7 @@ int ooCallDisableDTMFQ931Keypad(OOH323CallData *call)
}
-OOH323CallData* ooFindCallByToken(char *callToken)
+OOH323CallData* ooFindCallByToken(const char *callToken)
{
OOH323CallData *call;
if(!callToken)
@@ -636,9 +743,13 @@ OOH323CallData* ooFindCallByToken(char *callToken)
OOTRACEERR1("ERROR:Invalid call token passed - ooFindCallByToken\n");
return NULL;
}
+
+ ast_mutex_lock(&callListLock);
+
if(!gH323ep.callList)
{
OOTRACEERR1("ERROR: Empty calllist - ooFindCallByToken failed\n");
+ ast_mutex_unlock(&callListLock);
return NULL;
}
call = gH323ep.callList;
@@ -653,8 +764,14 @@ OOH323CallData* ooFindCallByToken(char *callToken)
if(!call)
{
OOTRACEERR2("ERROR:Call with token %s not found\n", callToken);
+ ast_mutex_unlock(&callListLock);
return NULL;
}
+
+ ast_mutex_unlock(&callListLock);
+
+ OOTRACEINFO3("INFO: FinCall returned %lx for call: %s\n", call, callToken);
+
return call;
}
@@ -750,6 +867,23 @@ unsigned ooCallGenerateSessionID
}
}
}
+ if(type == OO_CAP_TYPE_DATA)
+ {
+ if(!ooGetLogicalChannel(call, 3, dir))
+ {
+ sessionID = 3;
+ }
+ else{
+ if(call->masterSlaveState == OO_MasterSlave_Master)
+ sessionID = call->nextSessionID++;
+ else{
+ sessionID = 0; /* Will be assigned by remote */
+ OOTRACEDBGC4("Session id for %s channel of type data has to be "
+ "provided by remote.(%s, %s)\n", dir, call->callType,
+ call->callToken);
+ }
+ }
+ }
return sessionID;
}