mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-11 07:13:20 +00:00
Move Asterisk-addons modules into the main Asterisk source tree.
Someone asked yesterday, "is there a good reason why we can't just put these modules in Asterisk?". After a brief discussion, as long as the modules are clearly set aside in their own directory and not enabled by default, it is perfectly fine. For more information about why a module goes in addons, see README-addons.txt. chan_ooh323 does not currently compile as it is behind some trunk API updates. However, it will not build by default, so it should be okay for now. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@204413 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
372
addons/ooh323c/src/ooLogChan.c
Normal file
372
addons/ooh323c/src/ooLogChan.c
Normal file
@@ -0,0 +1,372 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2005 by Objective Systems, Inc.
|
||||
*
|
||||
* This software is furnished under an open source license and may be
|
||||
* used and copied only in accordance with the terms of this license.
|
||||
* The text of the license may generally be found in the root
|
||||
* directory of this installation in the COPYING file. It
|
||||
* can also be viewed online at the following URL:
|
||||
*
|
||||
* http://www.obj-sys.com/open/license.html
|
||||
*
|
||||
* Any redistributions of this file including modified versions must
|
||||
* maintain this copyright notice.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include "ooCalls.h"
|
||||
#include "ooh323ep.h"
|
||||
|
||||
/** Global endpoint structure */
|
||||
extern OOH323EndPoint gH323ep;
|
||||
|
||||
OOLogicalChannel* ooAddNewLogicalChannel(OOH323CallData *call, int channelNo,
|
||||
int sessionID, char *dir,
|
||||
ooH323EpCapability *epCap)
|
||||
{
|
||||
OOLogicalChannel *pNewChannel=NULL, *pChannel=NULL;
|
||||
OOMediaInfo *pMediaInfo = NULL;
|
||||
OOTRACEDBGC5("Adding new media channel for cap %d dir %s (%s, %s)\n",
|
||||
epCap->cap, dir, call->callType, call->callToken);
|
||||
/* Create a new logical channel entry */
|
||||
pNewChannel = (OOLogicalChannel*)memAlloc(call->pctxt,
|
||||
sizeof(OOLogicalChannel));
|
||||
if(!pNewChannel)
|
||||
{
|
||||
OOTRACEERR3("ERROR:Memory - ooAddNewLogicalChannel - pNewChannel "
|
||||
"(%s, %s)\n", call->callType, call->callToken);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(pNewChannel, 0, sizeof(OOLogicalChannel));
|
||||
pNewChannel->channelNo = channelNo;
|
||||
pNewChannel->sessionID = sessionID;
|
||||
pNewChannel->state = OO_LOGICALCHAN_IDLE;
|
||||
pNewChannel->type = epCap->capType;
|
||||
/* strcpy(pNewChannel->type, type);*/
|
||||
strcpy(pNewChannel->dir, dir);
|
||||
|
||||
pNewChannel->chanCap = epCap;
|
||||
OOTRACEDBGC4("Adding new channel with cap %d (%s, %s)\n", epCap->cap,
|
||||
call->callType, call->callToken);
|
||||
/* As per standards, media control port should be same for all
|
||||
proposed channels with same session ID. However, most applications
|
||||
use same media port for transmit and receive of audio streams. Infact,
|
||||
testing of OpenH323 based asterisk assumed that same ports are used.
|
||||
Hence we first search for existing media ports for same session and use
|
||||
them. This should take care of all cases.
|
||||
*/
|
||||
if(call->mediaInfo)
|
||||
{
|
||||
pMediaInfo = call->mediaInfo;
|
||||
while(pMediaInfo)
|
||||
{
|
||||
if(!strcmp(pMediaInfo->dir, dir) &&
|
||||
(pMediaInfo->cap == epCap->cap))
|
||||
{
|
||||
break;
|
||||
}
|
||||
pMediaInfo = pMediaInfo->next;
|
||||
}
|
||||
}
|
||||
|
||||
if(pMediaInfo)
|
||||
{
|
||||
OOTRACEDBGC3("Using configured media info (%s, %s)\n", call->callType,
|
||||
call->callToken);
|
||||
pNewChannel->localRtpPort = pMediaInfo->lMediaPort;
|
||||
pNewChannel->localRtcpPort = pMediaInfo->lMediaCntrlPort;
|
||||
/* If user application has not specified a specific ip and is using
|
||||
multihomed mode, substitute appropriate ip.
|
||||
*/
|
||||
if(!strcmp(pMediaInfo->lMediaIP, "0.0.0.0"))
|
||||
strcpy(pNewChannel->localIP, call->localIP);
|
||||
else
|
||||
strcpy(pNewChannel->localIP, pMediaInfo->lMediaIP);
|
||||
}
|
||||
else{
|
||||
OOTRACEDBGC3("Using default media info (%s, %s)\n", call->callType,
|
||||
call->callToken);
|
||||
pNewChannel->localRtpPort = ooGetNextPort (OORTP);
|
||||
|
||||
/* Ensures that RTP port is an even one */
|
||||
if((pNewChannel->localRtpPort & 1) == 1)
|
||||
pNewChannel->localRtpPort = ooGetNextPort (OORTP);
|
||||
|
||||
pNewChannel->localRtcpPort = ooGetNextPort (OORTP);
|
||||
strcpy(pNewChannel->localIP, call->localIP);
|
||||
}
|
||||
|
||||
/* Add new channel to the list */
|
||||
pNewChannel->next = NULL;
|
||||
if(!call->logicalChans) {
|
||||
call->logicalChans = pNewChannel;
|
||||
}
|
||||
else{
|
||||
pChannel = call->logicalChans;
|
||||
while(pChannel->next) pChannel = pChannel->next;
|
||||
pChannel->next = pNewChannel;
|
||||
}
|
||||
|
||||
/* increment logical channels */
|
||||
call->noOfLogicalChannels++;
|
||||
OOTRACEINFO3("Created new logical channel entry (%s, %s)\n", call->callType,
|
||||
call->callToken);
|
||||
return pNewChannel;
|
||||
}
|
||||
|
||||
OOLogicalChannel* ooFindLogicalChannelByLogicalChannelNo(OOH323CallData *call,
|
||||
int ChannelNo)
|
||||
{
|
||||
OOLogicalChannel *pLogicalChannel=NULL;
|
||||
if(!call->logicalChans)
|
||||
{
|
||||
OOTRACEERR3("ERROR: No Open LogicalChannels - Failed "
|
||||
"FindLogicalChannelByChannelNo (%s, %s\n", call->callType,
|
||||
call->callToken);
|
||||
return NULL;
|
||||
}
|
||||
pLogicalChannel = call->logicalChans;
|
||||
while(pLogicalChannel)
|
||||
{
|
||||
if(pLogicalChannel->channelNo == ChannelNo)
|
||||
break;
|
||||
else
|
||||
pLogicalChannel = pLogicalChannel->next;
|
||||
}
|
||||
|
||||
return pLogicalChannel;
|
||||
}
|
||||
|
||||
OOLogicalChannel * ooFindLogicalChannelByOLC(OOH323CallData *call,
|
||||
H245OpenLogicalChannel *olc)
|
||||
{
|
||||
H245DataType * psDataType=NULL;
|
||||
H245H2250LogicalChannelParameters * pslcp=NULL;
|
||||
OOTRACEDBGC4("ooFindLogicalChannel by olc %d (%s, %s)\n",
|
||||
olc->forwardLogicalChannelNumber, call->callType, call->callToken);
|
||||
if(olc->m.reverseLogicalChannelParametersPresent)
|
||||
{
|
||||
OOTRACEDBGC3("Finding receive channel (%s,%s)\n", call->callType,
|
||||
call->callToken);
|
||||
psDataType = &olc->reverseLogicalChannelParameters.dataType;
|
||||
/* Only H2250LogicalChannelParameters are supported */
|
||||
if(olc->reverseLogicalChannelParameters.multiplexParameters.t !=
|
||||
T_H245OpenLogicalChannel_reverseLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters){
|
||||
OOTRACEERR4("Error:Invalid olc %d received (%s, %s)\n",
|
||||
olc->forwardLogicalChannelNumber, call->callType, call->callToken);
|
||||
return NULL;
|
||||
}
|
||||
pslcp = olc->reverseLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;
|
||||
|
||||
return ooFindLogicalChannel(call, pslcp->sessionID, "receive", psDataType);
|
||||
}
|
||||
else{
|
||||
OOTRACEDBGC3("Finding transmit channel (%s, %s)\n", call->callType,
|
||||
call->callToken);
|
||||
psDataType = &olc->forwardLogicalChannelParameters.dataType;
|
||||
/* Only H2250LogicalChannelParameters are supported */
|
||||
if(olc->forwardLogicalChannelParameters.multiplexParameters.t !=
|
||||
T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
|
||||
{
|
||||
OOTRACEERR4("Error:Invalid olc %d received (%s, %s)\n",
|
||||
olc->forwardLogicalChannelNumber, call->callType, call->callToken);
|
||||
return NULL;
|
||||
}
|
||||
pslcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;
|
||||
return ooFindLogicalChannel(call, pslcp->sessionID, "transmit", psDataType);
|
||||
}
|
||||
}
|
||||
|
||||
OOLogicalChannel * ooFindLogicalChannel(OOH323CallData *call, int sessionID,
|
||||
char *dir, H245DataType * dataType)
|
||||
{
|
||||
OOLogicalChannel * pChannel = NULL;
|
||||
pChannel = call->logicalChans;
|
||||
while(pChannel)
|
||||
{
|
||||
OOTRACEDBGC3("ooFindLogicalChannel, checking channel: %d:%s\n",
|
||||
pChannel->sessionID, pChannel->dir);
|
||||
if(pChannel->sessionID == sessionID)
|
||||
{
|
||||
if(!strcmp(pChannel->dir, dir))
|
||||
{
|
||||
OOTRACEDBGC3("ooFindLogicalChannel, comparing channel: %d:%s\n",
|
||||
pChannel->channelNo, pChannel->dir);
|
||||
if(!strcmp(dir, "receive"))
|
||||
{
|
||||
if(ooCapabilityCheckCompatibility(call, pChannel->chanCap,
|
||||
dataType, OORX)) {
|
||||
return pChannel;
|
||||
}
|
||||
}
|
||||
else if(!strcmp(dir, "transmit"))
|
||||
{
|
||||
if(ooCapabilityCheckCompatibility(call, pChannel->chanCap,
|
||||
dataType, OOTX)) {
|
||||
return pChannel;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
pChannel = pChannel->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* This function is used to get a logical channel with a particular session ID */
|
||||
OOLogicalChannel* ooGetLogicalChannel
|
||||
(OOH323CallData *call, int sessionID, char *dir)
|
||||
{
|
||||
OOLogicalChannel * pChannel = NULL;
|
||||
pChannel = call->logicalChans;
|
||||
while(pChannel)
|
||||
{
|
||||
if(pChannel->sessionID == sessionID && !strcmp(pChannel->dir, dir))
|
||||
return pChannel;
|
||||
else
|
||||
pChannel = pChannel->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int ooClearAllLogicalChannels(OOH323CallData *call)
|
||||
{
|
||||
OOLogicalChannel * temp = NULL, *prev = NULL;
|
||||
|
||||
OOTRACEINFO3("Clearing all logical channels (%s, %s)\n", call->callType,
|
||||
call->callToken);
|
||||
|
||||
temp = call->logicalChans;
|
||||
while(temp)
|
||||
{
|
||||
prev = temp;
|
||||
temp = temp->next;
|
||||
ooClearLogicalChannel(call, prev->channelNo);/* TODO: efficiency - This causes re-search
|
||||
of of logical channel in the list. Can be
|
||||
easily improved.*/
|
||||
}
|
||||
call->logicalChans = NULL;
|
||||
return OO_OK;
|
||||
}
|
||||
|
||||
int ooClearLogicalChannel(OOH323CallData *call, int channelNo)
|
||||
{
|
||||
|
||||
OOLogicalChannel *pLogicalChannel = NULL;
|
||||
ooH323EpCapability *epCap=NULL;
|
||||
|
||||
OOTRACEDBGC4("Clearing logical channel number %d. (%s, %s)\n", channelNo,
|
||||
call->callType, call->callToken);
|
||||
|
||||
pLogicalChannel = ooFindLogicalChannelByLogicalChannelNo(call,channelNo);
|
||||
if(!pLogicalChannel)
|
||||
{
|
||||
OOTRACEWARN4("Logical Channel %d doesn't exist, in clearLogicalChannel."
|
||||
" (%s, %s)\n",
|
||||
channelNo, call->callType, call->callToken);
|
||||
return OO_OK;
|
||||
}
|
||||
|
||||
epCap = (ooH323EpCapability*) pLogicalChannel->chanCap;
|
||||
if(!strcmp(pLogicalChannel->dir, "receive"))
|
||||
{
|
||||
if(epCap->stopReceiveChannel)
|
||||
{
|
||||
epCap->stopReceiveChannel(call, pLogicalChannel);
|
||||
OOTRACEINFO4("Stopped Receive channel %d (%s, %s)\n",
|
||||
channelNo, call->callType, call->callToken);
|
||||
}
|
||||
else{
|
||||
OOTRACEERR4("ERROR:No callback registered for stopReceiveChannel %d "
|
||||
"(%s, %s)\n", channelNo, call->callType, call->callToken);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(pLogicalChannel->state == OO_LOGICALCHAN_ESTABLISHED)
|
||||
{
|
||||
if(epCap->stopTransmitChannel)
|
||||
{
|
||||
epCap->stopTransmitChannel(call, pLogicalChannel);
|
||||
OOTRACEINFO4("Stopped Transmit channel %d (%s, %s)\n",
|
||||
channelNo, call->callType, call->callToken);
|
||||
}
|
||||
else{
|
||||
OOTRACEERR4("ERROR:No callback registered for stopTransmitChannel"
|
||||
" %d (%s, %s)\n", channelNo, call->callType,
|
||||
call->callToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
ooRemoveLogicalChannel(call, channelNo);/* TODO: efficiency - This causes re-search of
|
||||
of logical channel in the list. Can be
|
||||
easily improved.*/
|
||||
return OO_OK;
|
||||
}
|
||||
|
||||
int ooRemoveLogicalChannel(OOH323CallData *call, int ChannelNo)
|
||||
{
|
||||
OOLogicalChannel * temp = NULL, *prev=NULL;
|
||||
if(!call->logicalChans)
|
||||
{
|
||||
OOTRACEERR4("ERROR:Remove Logical Channel - Channel %d not found "
|
||||
"Empty channel List(%s, %s)\n", ChannelNo, call->callType,
|
||||
call->callToken);
|
||||
return OO_FAILED;
|
||||
}
|
||||
|
||||
temp = call->logicalChans;
|
||||
while(temp)
|
||||
{
|
||||
if(temp->channelNo == ChannelNo)
|
||||
{
|
||||
if(!prev) call->logicalChans = temp->next;
|
||||
else prev->next = temp->next;
|
||||
memFreePtr(call->pctxt, temp->chanCap);
|
||||
memFreePtr(call->pctxt, temp);
|
||||
OOTRACEDBGC4("Removed logical channel %d (%s, %s)\n", ChannelNo,
|
||||
call->callType, call->callToken);
|
||||
call->noOfLogicalChannels--;
|
||||
return OO_OK;
|
||||
}
|
||||
prev = temp;
|
||||
temp = temp->next;
|
||||
}
|
||||
|
||||
OOTRACEERR4("ERROR:Remove Logical Channel - Channel %d not found "
|
||||
"(%s, %s)\n", ChannelNo, call->callType, call->callToken);
|
||||
return OO_FAILED;
|
||||
}
|
||||
|
||||
/*
|
||||
Change the state of the channel as established and close all other
|
||||
channels with same session IDs. This is useful for handling fastStart,
|
||||
as the endpoint can open multiple logical channels for same sessionID.
|
||||
Once the remote endpoint confirms it's selection, all other channels for
|
||||
the same sessionID must be closed.
|
||||
*/
|
||||
int ooOnLogicalChannelEstablished
|
||||
(OOH323CallData *call, OOLogicalChannel * pChannel)
|
||||
{
|
||||
OOLogicalChannel * temp = NULL, *prev=NULL;
|
||||
OOTRACEDBGC3("In ooOnLogicalChannelEstablished (%s, %s)\n",
|
||||
call->callType, call->callToken);
|
||||
pChannel->state = OO_LOGICALCHAN_ESTABLISHED;
|
||||
temp = call->logicalChans;
|
||||
while(temp)
|
||||
{
|
||||
if(temp->channelNo != pChannel->channelNo &&
|
||||
temp->sessionID == pChannel->sessionID &&
|
||||
!strcmp(temp->dir, pChannel->dir) )
|
||||
{
|
||||
prev = temp;
|
||||
temp = temp->next;
|
||||
ooClearLogicalChannel(call, prev->channelNo);
|
||||
}
|
||||
else
|
||||
temp = temp->next;
|
||||
}
|
||||
return OO_OK;
|
||||
}
|
||||
|
Reference in New Issue
Block a user