Files
asterisk/addons/ooh323c/src/ooports.c
Alexandr Anikin 9530310954 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
2009-11-04 22:10:44 +00:00

113 lines
2.7 KiB
C

/*
* 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 <asterisk.h>
#include <asterisk/lock.h>
#include "ooports.h"
#include "ooh323ep.h"
#include "ootrace.h"
/** Global endpoint structure */
extern OOH323EndPoint gH323ep;
extern ast_mutex_t bindPortLock;
/* Get the next port of type TCP/UDP/RTP */
int ooGetNextPort (OOH323PortType type)
{
if(type==OOTCP)
{
if(gH323ep.tcpPorts.current <= gH323ep.tcpPorts.max)
return gH323ep.tcpPorts.current++;
else
{
gH323ep.tcpPorts.current = gH323ep.tcpPorts.start;
return gH323ep.tcpPorts.current++;
}
}
if(type==OOUDP)
{
if(gH323ep.udpPorts.current <= gH323ep.udpPorts.max)
return gH323ep.udpPorts.current++;
else
{
gH323ep.udpPorts.current = gH323ep.udpPorts.start;
return gH323ep.udpPorts.current++;
}
}
if(type==OORTP)
{
if(gH323ep.rtpPorts.current <= gH323ep.rtpPorts.max)
return gH323ep.rtpPorts.current++;
else
{
gH323ep.rtpPorts.current = gH323ep.rtpPorts.start;
return gH323ep.rtpPorts.current++;
}
}
return OO_FAILED;
}
int ooBindPort (OOH323PortType type, OOSOCKET socket, char *ip)
{
int initialPort, bindPort, ret;
OOIPADDR ipAddrs;
ast_mutex_lock(&bindPortLock);
initialPort = ooGetNextPort (type);
bindPort = initialPort;
ret= ooSocketStrToAddr (ip, &ipAddrs);
while(1)
{
if((ret=ooSocketBind(socket, ipAddrs, bindPort))==0)
{
ast_mutex_unlock(&bindPortLock);
return bindPort;
}
else
{
bindPort = ooGetNextPort (type);
if (bindPort == initialPort) { ast_mutex_unlock(&bindPortLock); return OO_FAILED; }
}
}
}
#ifdef _WIN32
int ooBindOSAllocatedPort(OOSOCKET socket, char *ip)
{
OOIPADDR ipAddrs;
int size, ret;
struct sockaddr_in name;
size = sizeof(struct sockaddr_in);
ret= ooSocketStrToAddr (ip, &ipAddrs);
if((ret=ooSocketBind(socket, ipAddrs,
0))==ASN_OK)
{
ret = ooSocketGetSockName(socket, &name, &size);
if(ret == ASN_OK)
{
return name.sin_port;
}
}
return OO_FAILED;
}
#endif