diff options
Diffstat (limited to '1.2-netsec/channels/h323')
-rw-r--r-- | 1.2-netsec/channels/h323/ChangeLog | 43 | ||||
-rw-r--r-- | 1.2-netsec/channels/h323/INSTALL.openh323 | 18 | ||||
-rw-r--r-- | 1.2-netsec/channels/h323/Makefile | 41 | ||||
-rw-r--r-- | 1.2-netsec/channels/h323/README | 142 | ||||
-rw-r--r-- | 1.2-netsec/channels/h323/TODO | 14 | ||||
-rw-r--r-- | 1.2-netsec/channels/h323/ast_h323.cpp | 1532 | ||||
-rw-r--r-- | 1.2-netsec/channels/h323/ast_h323.h | 239 | ||||
-rw-r--r-- | 1.2-netsec/channels/h323/chan_h323.h | 232 | ||||
-rw-r--r-- | 1.2-netsec/channels/h323/h323.conf.sample | 123 |
9 files changed, 0 insertions, 2384 deletions
diff --git a/1.2-netsec/channels/h323/ChangeLog b/1.2-netsec/channels/h323/ChangeLog deleted file mode 100644 index ddbf08193..000000000 --- a/1.2-netsec/channels/h323/ChangeLog +++ /dev/null @@ -1,43 +0,0 @@ -Build - -- Hold lock when creating new H.323 channel to sync the audio channels - -- Decrement usage counter when appropriate - -- Actually unregister everything in unload_module - -- Add IP based authentication using 'host'in type=user's -0.1.0 - -- Intergration into the mainline Asterisk codebase - -- Remove reduandant debug info - -- Add Caller*id support - -- Inband DTMF - -- Retool port usage (to avoid possible seg fault condition) -0.0.6 - -- Configurable support for user-input (DTMF) - -- Reworked Gatekeeper support - -- Native bridging (but is still broken, help!) - -- Locally implement a non-broken G.723.1 Capability - -- Utilize the cleaner RTP method implemented by Mark - -- AllowGkRouted, thanks to Panny from http://hotlinks.co.uk - -- Clened up inbound call flow - -- Prefix, E.164 and Gateway support - -- Multi-homed support - -- Killed more seg's -0.0.5 - -- Added H.323 Alias support - -- Clened up inbound call flow - -- Fixed RTP port logic - -- Stomped on possible seg fault conditions thanks to Iain Stevenson -0.0.4 - -- Fixed one-way audio on inbound calls. Found - race condition in monitor thread. - -0.0.3 - -- Changed name to chan_h323 - -- Also renamed file names to futher avoid confusion - -0.0.2 - -- First public offering - -- removed most hardcoded values - -- lots of changes to alias/exension operation - -0.0.1 - -- initial build, lots of hardcoded crap - -- Proof of concept for External RTP diff --git a/1.2-netsec/channels/h323/INSTALL.openh323 b/1.2-netsec/channels/h323/INSTALL.openh323 deleted file mode 100644 index f46c37905..000000000 --- a/1.2-netsec/channels/h323/INSTALL.openh323 +++ /dev/null @@ -1,18 +0,0 @@ -To build Open H.323 see: - -http://www.openh323.org/build.html#unix - -You only need to do 'make opt'. Anything else you will be simply waisting time and HD space. -Also, you will notice they never tell you to 'make install' so don't do it. - - -On FreeBSD, the Makefiles are configured to -locate the compiled openh323 port, if it has -been built. Here is one way to build -openh323 and ptlib on such that the Makefiles -find it: - # cd /usr/ports/net/openh323 - # make -It is not necessary to install the port. The -asterisk makefiles do not use any files -installed by the port. diff --git a/1.2-netsec/channels/h323/Makefile b/1.2-netsec/channels/h323/Makefile deleted file mode 100644 index 0e9266164..000000000 --- a/1.2-netsec/channels/h323/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -# -# Makefile -# -# Make file for OpenH323 support layer -# - -# Verify those options with main Makefile -STDCCFLAGS += -DNDEBUG -STDCCFLAGS += $(shell grep ^DEBUG_THREADS ../../Makefile | sed -e "s/^DEBUG_THREADS[ ]*=//" -e "s/\([^\#]*\)\#.*/\1/") -STDCCFLAGS += -I../../include -STDCCFLAGS += -Wmissing-prototypes -STDCCFLAGS += -fPIC -#OPTCCFLAGS += -CFLAGS += -pipe -TARGET += libchanh323.a -TARGET += Makefile.ast -SOURCES = ast_h323.cxx -OBJDIR = . - -ifndef OPENH323DIR -OPENH323DIR=$(HOME)/openh323 -endif - -include $(OPENH323DIR)/openh323u.mak - -$(SOURCES):: $(SOURCES:.cxx=.cpp) - ln -f $< $@ - -$(SOURCES):: Makefile ../../Makefile - touch $(SOURCES) - -libchanh323.a: $(OBJS) - ar crv $@ $(OBJS) - -Makefile.ast: FORCE - @echo H323CFLAGS = $(STDCCFLAGS) $(OPTCCFLAGS) $(CFLAGS) >$@.tmp - @echo H323LDFLAGS = $(CFLAGS) $(LDFLAGS) >>$@.tmp - @echo H323LDLIBS = $(LDLIBS) $(ENDLDLIBS) $(ENDLDFLAGS) >>$@.tmp - @if [ -r $@ ] && cmp -s $@ $@.tmp; then rm -f $@.tmp; else mv -f $@.tmp $@; fi - -FORCE: diff --git a/1.2-netsec/channels/h323/README b/1.2-netsec/channels/h323/README deleted file mode 100644 index ff94bc42e..000000000 --- a/1.2-netsec/channels/h323/README +++ /dev/null @@ -1,142 +0,0 @@ - Open H.323 Channel Driver for Asterisk - By Jeremy McNamara - For The NuFone Network - - First public release on November 10th, 2002 - - Dependancies: openssl-0.9.6b+ - openssl-devel-0.9.6b+ - expat-1.95+ - expat-dev-1.95+ - -Tested with Open H.323 version v1.17.1, PWLib v1.9.0 and GCC v3.2.2. Usage of any -other versions is not supported. - -NOTICE: Whatever you do, DO NOT USE distrubution specific installs -of Open H.323 and PWLib. In fact, you should check to make sure -your distro did not install them for you without your knowledge. - - -To compile this code --------------------- -Once PWLib and Open H.323 have been compiled per their specific build -instructions, issue a make in the asterisk/channels/h323 directory with -argument used to build PWLib and OpenH323 (for example, make opt), then go -back to the Asterisk source top level directory and issue a make install. - - -The most common compile error ----------------------------- -If you receive ANYTHING that says 'undefined symbol' you are experiencing -typical version skew. For example: - -libh323_linux_x86_r.so.1: undefined symbol: GetNumberValueAt__C14PAbstractArrayi - -You need to search and destroy every version of libh323 and libpt then -completely recompile everything - -Example commands to make sure everything gets cleaned and then -rebult in proper order: - -cd /path/to/pwlib -./configure -make clean opt -cd /path/to/openh323 -./configure -make clean opt -cd /path/to/asterisk/channels/h323 -make opt -cd /path/to/asterisk -make install - - -Most common run-time error -------------------------- -libpt_linux_x86_r.so.1: cannot open shared object file: No such -file or directory - -You have not set the LD_LIBRARY_PATH environment variable. - -Example environment for sh/bash: - -PWLIBDIR=$HOME/pwlib -export PWLIBDIR -OPENH323DIR=$HOME/openh323 -export OPENH323DIR -LD_LIBRARY_PATH=$PWLIBDIR/lib:$OPENH323DIR/lib -export LD_LIBRARY_PATH - -We recomend puting the above directives into your /etc/profile so -you do not have to remember to export those values every time you -want to recompile. Make sure to logout and log back in, so your -envrionment can pick up the new variables. - - -Upgrading Asterisk ------------------ -After you cvs update (or make update) Asterisk you have to go into -asterisk/channels/h323 and issue a make clean all, before compiling the -rest of asterisk. Doing this process every time you upgrade Asterisk -will ensure a sane build. - - -Dialing an H.323 channel ------------------------- -Without a gatekeeper: -exten => _1NXXNXXXXXX,1,Dial,H323/${EXTEN}@peer -or -exten => _1NXXNXXXXXX,1,Dial,H323/${EXTEN}@ip.or.hostname - -'peer' is defined in h323.conf as: - -[peer] -type=peer -host=1.2.3.4 -disallow=all -allow=ulaw - -Using a gatekeeper: -exten => _1NXXNXXXXXX,1,Dial,H323/${EXTEN} - -When using a gatekeeper you cannot utilize the type=peer features, -since the H.323 spec states that when a Gatekeeper is part of an H.323 network, -the Gatekeeper shall be used for all communication. - - -Developer Contact ----------------- -If you have trouble contact 'JerJer' in #Asterisk on -irc.freenode.net and/or send reasonable debug information to support@nufone.net. - -If are lucky enough to segfault this code please run a -backtrace and send the gory details. Segmentation faults are not -tolerated, no matter what Distro you run (even debian)! - -a simple bt example: - -# /usr/sbin/asterisk -vvvgc -... -[chan_h323.so] -Segmentation Fault (core dumped) - -# ls core.* -core.1976 - -# gdb /usr/sbin/asterisk core.1976 -...lots of useless garbage here... -(gdb) bt - -Send whatever shows up right after the 'bt' - -Also, a full debug screen output is almost needed. Make sure you are -in the full console mode (-c) and turn on 'h.323 debug' or worst case -senerio 'h.323 trace 4'. A nice way to capture debug info is with -script (man script). - -If you are motivated to update/fix this code please submit a -disclaimer along with the patch to the Asterisk bug -tracker: http://bugs.digium.com/ - - -Jeremy McNamara -The NuFone Network diff --git a/1.2-netsec/channels/h323/TODO b/1.2-netsec/channels/h323/TODO deleted file mode 100644 index b72a9f1d1..000000000 --- a/1.2-netsec/channels/h323/TODO +++ /dev/null @@ -1,14 +0,0 @@ -The NuFone Network's Open H.323 Channel Driver for Asterisk - - TODO: - - - Fix Gatekeeper re-registration seg (HELP) - - - Track down why calls to invalid extensions always - get sent to 's' in context 'default' - - - H.323 Native Bridging - - - Gatekeeping support (started) - - - Acutally implement the options for broken H.323 stacks diff --git a/1.2-netsec/channels/h323/ast_h323.cpp b/1.2-netsec/channels/h323/ast_h323.cpp deleted file mode 100644 index bb4145088..000000000 --- a/1.2-netsec/channels/h323/ast_h323.cpp +++ /dev/null @@ -1,1532 +0,0 @@ -#define _GNU_SOURCE -/* - * ast_h323.cpp - * - * OpenH323 Channel Driver for ASTERISK PBX. - * By Jeremy McNamara - * For The NuFone Network - * - * chan_h323 has been derived from code created by - * Michael Manousos and Mark Spencer - * - * This file is part of the chan_h323 driver for Asterisk - * - * chan_h323 is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * chan_h323 is distributed WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Version Info: $Id$ - */ -#include <arpa/inet.h> - -#include <list> -#include <string> -#include <algorithm> - -#include <ptlib.h> -#include <h323.h> -#include <h323pdu.h> -#include <mediafmt.h> -#include <lid.h> - -#ifdef __cplusplus -extern "C" { -#endif -#include "asterisk/logger.h" -#include "asterisk/channel.h" -#ifdef __cplusplus -} -#endif - -#include "chan_h323.h" -#include "ast_h323.h" - -/* PWlib Required Components */ -#define MAJOR_VERSION 1 -#define MINOR_VERSION 0 -#define BUILD_TYPE ReleaseCode -#define BUILD_NUMBER 0 - -/** Counter for the number of connections */ -int channelsOpen; - -/* DTMF Mode */ -int mode = H323_DTMF_RFC2833; - -/** - * We assume that only one endPoint should exist. - * The application cannot run the h323_end_point_create() more than once - * FIXME: Singleton this, for safety - */ -MyH323EndPoint *endPoint = NULL; - -/** PWLib entry point */ -MyProcess *localProcess = NULL; - -class PAsteriskLog : public PObject, public iostream { - PCLASSINFO(PAsteriskLog, PObject); - - public: - PAsteriskLog() : iostream(cout.rdbuf()) { init(&buffer); } - ~PAsteriskLog() { flush(); } - - private: - PAsteriskLog(const PAsteriskLog &) : iostream(cout.rdbuf()) { } - PAsteriskLog & operator=(const PAsteriskLog &) { return *this; } - - class Buffer : public streambuf { - public: - virtual int overflow(int=EOF); - virtual int underflow(); - virtual int sync(); - PString string; - } buffer; - friend class Buffer; -}; - -static PAsteriskLog *logstream = NULL; - -int PAsteriskLog::Buffer::overflow(int c) -{ - if (pptr() >= epptr()) { - int ppos = pptr() - pbase(); - char *newptr = string.GetPointer(string.GetSize() + 2000); - setp(newptr, newptr + string.GetSize() - 1); - pbump(ppos); - } - if (c != EOF) { - *pptr() = (char)c; - pbump(1); - } - return 0; -} - -int PAsteriskLog::Buffer::underflow() -{ - return EOF; -} - -int PAsteriskLog::Buffer::sync() -{ - char *str = strdup(string); - char *s, *s1; - char c; - - /* Pass each line with different ast_verbose() call */ - for (s = str; s && *s; s = s1) { - s1 = strchr(s, '\n'); - if (!s1) - s1 = s + strlen(s); - else - s1++; - c = *s1; - *s1 = '\0'; - ast_verbose("%s", s); - *s1 = c; - } - free(str); - - string = PString(); - char *base = string.GetPointer(2000); - setp(base, base + string.GetSize() - 1); - return 0; -} - -#define cout (*logstream) - -MyProcess::MyProcess(): PProcess("The NuFone Network's", "H.323 Channel Driver for Asterisk", - MAJOR_VERSION, MINOR_VERSION, BUILD_TYPE, BUILD_NUMBER) -{ - /* Fix missed one in PWLib */ - PX_firstTimeStart = FALSE; - Resume(); -} - -void MyProcess::Main() -{ - cout << " == Creating H.323 Endpoint" << endl; - endPoint = new MyH323EndPoint(); - /* Due to a bug in the H.323 recomendation/stack we should request a sane - amount of bandwidth from the GK - this function is ignored if not using a GK - We are requesting 128 (64k in each direction), which is the worst case codec. */ - endPoint->SetInitialBandwidth(1280); - - PTrace::Initialise(0, NULL, PTrace::Timestamp | PTrace::Thread | PTrace::FileAndLine); - PTrace::SetStream(logstream); -} - -void PAssertFunc(const char *msg) -{ - ast_log(LOG_ERROR, "%s\n", msg); - /* XXX: Probably we need to crash here */ -} - -H323_REGISTER_CAPABILITY(H323_G7231Capability, OPAL_G7231); -H323_REGISTER_CAPABILITY(AST_G729Capability, OPAL_G729); -H323_REGISTER_CAPABILITY(AST_G729ACapability, OPAL_G729A); - -H323_G7231Capability::H323_G7231Capability(BOOL annexA_) - : H323AudioCapability(7, 4) -{ - annexA = annexA_; -} - -PObject::Comparison H323_G7231Capability::Compare(const PObject & obj) const -{ - Comparison result = H323AudioCapability::Compare(obj); - if (result != EqualTo) { - return result; - } - PINDEX otherAnnexA = ((const H323_G7231Capability &)obj).annexA; - if (annexA < otherAnnexA) { - return LessThan; - } - if (annexA > otherAnnexA) { - return GreaterThan; - } - return EqualTo; -} - -PObject * H323_G7231Capability::Clone() const -{ - return new H323_G7231Capability(*this); -} - -PString H323_G7231Capability::GetFormatName() const -{ - return OPAL_G7231; -} - -unsigned H323_G7231Capability::GetSubType() const -{ - return H245_AudioCapability::e_g7231; -} - -BOOL H323_G7231Capability::OnSendingPDU(H245_AudioCapability & cap, - unsigned packetSize) const -{ - cap.SetTag(H245_AudioCapability::e_g7231); - H245_AudioCapability_g7231 & g7231 = cap; - g7231.m_maxAl_sduAudioFrames = packetSize; - g7231.m_silenceSuppression = annexA; - return TRUE; -} - -BOOL H323_G7231Capability::OnReceivedPDU(const H245_AudioCapability & cap, - unsigned & packetSize) -{ - if (cap.GetTag() != H245_AudioCapability::e_g7231) { - return FALSE; - } - const H245_AudioCapability_g7231 & g7231 = cap; - packetSize = g7231.m_maxAl_sduAudioFrames; - annexA = g7231.m_silenceSuppression; - return TRUE; -} - -H323Codec * H323_G7231Capability::CreateCodec(H323Codec::Direction direction) const -{ - return NULL; -} - -AST_G729Capability::AST_G729Capability() - : H323AudioCapability(24, 2) -{ -} - -PObject * AST_G729Capability::Clone() const -{ - return new AST_G729Capability(*this); -} - -unsigned AST_G729Capability::GetSubType() const -{ - return H245_AudioCapability::e_g729; -} - -PString AST_G729Capability::GetFormatName() const -{ - return OPAL_G729; -} - -H323Codec * AST_G729Capability::CreateCodec(H323Codec::Direction direction) const -{ - return NULL; -} - -AST_G729ACapability::AST_G729ACapability() - : H323AudioCapability(24, 6) -{ -} - -PObject * AST_G729ACapability::Clone() const -{ - return new AST_G729ACapability(*this); -} - -unsigned AST_G729ACapability::GetSubType() const -{ - return H245_AudioCapability::e_g729AnnexA; -} - -PString AST_G729ACapability::GetFormatName() const -{ - return OPAL_G729A; -} - -H323Codec * AST_G729ACapability::CreateCodec(H323Codec::Direction direction) const -{ - return NULL; -} - -/** MyH323EndPoint - */ -MyH323EndPoint::MyH323EndPoint() - : H323EndPoint() -{ - // Capabilities will be negotiated on per-connection basis - capabilities.RemoveAll(); -} - -/** The fullAddress parameter is used directly in the MakeCall method so - * the General form for the fullAddress argument is : - * [alias@][transport$]host[:port] - * default values: alias = the same value as host. - * transport = ip. - * port = 1720. - */ -int MyH323EndPoint::MakeCall(const PString & dest, PString & token, unsigned int *callReference, call_options_t *opts) -{ - PString fullAddress; - MyH323Connection * connection; - - /* Determine whether we are using a gatekeeper or not. */ - if (GetGatekeeper()) { - fullAddress = dest; - if (h323debug) { - cout << " -- Making call to " << fullAddress << " using gatekeeper." << endl; - } - } else { - fullAddress = dest; - if (h323debug) { - cout << " -- Making call to " << fullAddress << " without gatekeeper." << endl; - } - } - if (!(connection = (MyH323Connection *)H323EndPoint::MakeCallLocked(fullAddress, token, opts))) { - if (h323debug) { - cout << "Error making call to \"" << fullAddress << '"' << endl; - } - return 1; - } - *callReference = connection->GetCallReference(); - - if (opts->cid_num) { - connection->ast_cid_num = PString(opts->cid_num); - } - if (opts->cid_name) { - connection->ast_cid_name = PString(opts->cid_name); - connection->SetLocalPartyName(connection->ast_cid_name); - } - - connection->dtmfCodec = (RTP_DataFrame::PayloadTypes)opts->dtmfcodec; - - if (h323debug) { - cout << "\t-- " << GetLocalUserName() << " is calling host " << fullAddress << endl; - cout << "\t-- Call token is " << (const char *)token << endl; - cout << "\t-- Call reference is " << *callReference << endl; - cout << "\t-- DTMF Payload is " << connection->dtmfCodec << endl; - } - connection->Unlock(); - return 0; -} - -void MyH323EndPoint::SetEndpointTypeInfo( H225_EndpointType & info ) const -{ - H323EndPoint::SetEndpointTypeInfo(info); - - if (terminalType == e_GatewayOnly){ - info.RemoveOptionalField(H225_EndpointType::e_terminal); - info.IncludeOptionalField(H225_EndpointType::e_gateway); - } - - info.m_gateway.IncludeOptionalField(H225_GatewayInfo::e_protocol); - info.m_gateway.m_protocol.SetSize(1); - H225_SupportedProtocols &protocol=info.m_gateway.m_protocol[0]; - protocol.SetTag(H225_SupportedProtocols::e_voice); - PINDEX as=SupportedPrefixes.GetSize(); - ((H225_VoiceCaps &)protocol).m_supportedPrefixes.SetSize(as); - for (PINDEX p=0; p<as; p++) { - H323SetAliasAddress(SupportedPrefixes[p], ((H225_VoiceCaps &)protocol).m_supportedPrefixes[p].m_prefix, H225_AliasAddress::e_dialedDigits); - } -} - -void MyH323EndPoint::SetGateway(void) -{ - terminalType = e_GatewayOnly; -} - -BOOL MyH323EndPoint::ClearCall(const PString & token, H323Connection::CallEndReason reason) -{ - if (h323debug) { - cout << "\t-- ClearCall: Request to clear call with token " << token << ", cause " << reason << endl; - } - return H323EndPoint::ClearCall(token, reason); -} - -BOOL MyH323EndPoint::ClearCall(const PString & token) -{ - if (h323debug) { - cout << "\t-- ClearCall: Request to clear call with token " << token << endl; - } - return H323EndPoint::ClearCall(token, H323Connection::EndedByLocalUser); -} - -void MyH323EndPoint::SendUserTone(const PString &token, char tone) -{ - H323Connection *connection = NULL; - - connection = FindConnectionWithLock(token); - if (connection != NULL) { - connection->SendUserInputTone(tone, 500); - connection->Unlock(); - } -} - -void MyH323EndPoint::OnClosedLogicalChannel(H323Connection & connection, const H323Channel & channel) -{ - channelsOpen--; - if (h323debug) { - cout << "\t\tchannelsOpen = " << channelsOpen << endl; - } - H323EndPoint::OnClosedLogicalChannel(connection, channel); -} - -BOOL MyH323EndPoint::OnConnectionForwarded(H323Connection & connection, - const PString & forwardParty, - const H323SignalPDU & pdu) - { - if (h323debug) { - cout << "\t-- Call Forwarded to " << forwardParty << endl; - } - return FALSE; - } - -BOOL MyH323EndPoint::ForwardConnection(H323Connection & connection, - const PString & forwardParty, - const H323SignalPDU & pdu) -{ - if (h323debug) { - cout << "\t-- Forwarding call to " << forwardParty << endl; - } - return H323EndPoint::ForwardConnection(connection, forwardParty, pdu); -} - -void MyH323EndPoint::OnConnectionEstablished(H323Connection & connection, const PString & estCallToken) -{ - if (h323debug) { - cout << "\t=-= In OnConnectionEstablished for call " << connection.GetCallReference() << endl; - cout << "\t\t-- Connection Established with \"" << connection.GetRemotePartyName() << "\"" << endl; - } - on_connection_established(connection.GetCallReference(), (const char *)connection.GetCallToken()); -} - -/** OnConnectionCleared callback function is called upon the dropping of an established - * H323 connection. - */ -void MyH323EndPoint::OnConnectionCleared(H323Connection & connection, const PString & clearedCallToken) -{ - PString remoteName = connection.GetRemotePartyName(); - - switch (connection.GetCallEndReason()) { - case H323Connection::EndedByCallForwarded: - if (h323debug) { - cout << "-- " << remoteName << " has forwarded the call" << endl; - } - break; - case H323Connection::EndedByRemoteUser: - if (h323debug) { - cout << "-- " << remoteName << " has cleared the call" << endl; - } - break; - case H323Connection::EndedByCallerAbort: - if (h323debug) { - cout << "-- " << remoteName << " has stopped calling" << endl; - } - break; - case H323Connection::EndedByRefusal: - if (h323debug) { - cout << "-- " << remoteName << " did not accept your call" << endl; - } - break; - case H323Connection::EndedByRemoteBusy: - if (h323debug) { - cout << "-- " << remoteName << " was busy" << endl; - } - break; - case H323Connection::EndedByRemoteCongestion: - if (h323debug) { - cout << "-- Congested link to " << remoteName << endl; - } - break; - case H323Connection::EndedByNoAnswer: - if (h323debug) { - cout << "-- " << remoteName << " did not answer your call" << endl; - } - break; - case H323Connection::EndedByTransportFail: - if (h323debug) { - cout << "-- Call with " << remoteName << " ended abnormally" << endl; - } - break; - case H323Connection::EndedByCapabilityExchange: - if (h323debug) { - cout << "-- Could not find common codec with " << remoteName << endl; - } - break; - case H323Connection::EndedByNoAccept: - if (h323debug) { - cout << "-- Did not accept incoming call from " << remoteName << endl; - } - break; - case H323Connection::EndedByAnswerDenied: - if (h323debug) { - cout << "-- Refused incoming call from " << remoteName << endl; - } - break; - case H323Connection::EndedByNoUser: - if (h323debug) { - cout << "-- Remote endpoint could not find user: " << remoteName << endl; - } - break; - case H323Connection::EndedByNoBandwidth: - if (h323debug) { - cout << "-- Call to " << remoteName << " aborted, insufficient bandwidth." << endl; - } - break; - case H323Connection::EndedByUnreachable: - if (h323debug) { - cout << "-- " << remoteName << " could not be reached." << endl; - } - break; - case H323Connection::EndedByHostOffline: - if (h323debug) { - cout << "-- " << remoteName << " is not online." << endl; - } - break; - case H323Connection::EndedByNoEndPoint: - if (h323debug) { - cout << "-- No phone running for " << remoteName << endl; - } - break; - case H323Connection::EndedByConnectFail: - if (h323debug) { - cout << "-- Transport error calling " << remoteName << endl; - } - break; - default: - if (h323debug) - cout << " -- Call with " << remoteName << " completed (" << connection.GetCallEndReason() << ")" << endl; - - } - - if (connection.IsEstablished()) { - if (h323debug) { - cout << "\t-- Call duration " << setprecision(0) << setw(5) << (PTime() - connection.GetConnectionStartTime()) << endl; - } - } - /* Invoke the PBX application registered callback */ - on_connection_cleared(connection.GetCallReference(), clearedCallToken); - return; -} - -H323Connection * MyH323EndPoint::CreateConnection(unsigned callReference, void *o) -{ - unsigned options = 0; - call_options_t *opts = (call_options_t *)o; - - if (opts && opts->noFastStart) { - options |= H323Connection::FastStartOptionDisable; - } else { - options |= H323Connection::FastStartOptionEnable; - } - if (opts && opts->noH245Tunneling) { - options |= H323Connection::H245TunnelingOptionDisable; - } else { - options |= H323Connection::H245TunnelingOptionEnable; - } -/* Disable until I can figure out the proper way to deal with this */ -#if 0 - if (opts->noSilenceSuppression) { - options |= H323Connection::SilenceSuppresionOptionDisable; - } else { - options |= H323Connection::SilenceSUppressionOptionEnable; - } -#endif - return new MyH323Connection(*this, callReference, options); -} - -/* MyH323Connection Implementation */ -MyH323Connection::MyH323Connection(MyH323EndPoint & ep, unsigned callReference, - unsigned options) - : H323Connection(ep, callReference, options) -{ - cause = -1; - if (h323debug) { - cout << " == New H.323 Connection created." << endl; - } - return; -} - -MyH323Connection::~MyH323Connection() -{ - if (h323debug) { - cout << " == H.323 Connection deleted." << endl; - } - return; -} - -BOOL MyH323Connection::OnReceivedProgress(const H323SignalPDU &pdu) -{ - BOOL isInband; - unsigned pi; - - if (!H323Connection::OnReceivedProgress(pdu)) { - return FALSE; - } - - if (!pdu.GetQ931().GetProgressIndicator(pi)) - pi = 0; - if (h323debug) { - cout << "\t- Progress Indicator: " << pi << endl; - } - - switch(pi) { - case Q931::ProgressNotEndToEndISDN: - case Q931::ProgressInbandInformationAvailable: - isInband = TRUE; - break; - default: - isInband = FALSE; - } - on_progress(GetCallReference(), (const char *)GetCallToken(), isInband); - - return connectionState != ShuttingDownConnection; -} - -H323Connection::AnswerCallResponse MyH323Connection::OnAnswerCall(const PString & caller, - const H323SignalPDU & setupPDU, - H323SignalPDU & /*connectPDU*/) -{ - unsigned pi; - - if (h323debug) { - cout << "\t=-= In OnAnswerCall for call " << GetCallReference() << endl; - } - - if (connectionState == ShuttingDownConnection) - return H323Connection::AnswerCallDenied; - - if (!setupPDU.GetQ931().GetProgressIndicator(pi)) { - pi = 0; - } - if (h323debug) { - cout << "\t\t- Progress Indicator: " << pi << endl; - } - if (progressAlert) { - pi = progressAlert; - } else if (pi == Q931::ProgressOriginNotISDN) { - pi = Q931::ProgressInbandInformationAvailable; - } - if (pi) { - alertingPDU->GetQ931().SetProgressIndicator(pi); - } - if (h323debug) { - cout << "\t\t- Inserting PI of " << pi << " into ALERTING message" << endl; - } - - if (!on_answer_call(GetCallReference(), (const char *)GetCallToken())) { - return H323Connection::AnswerCallDenied; - } - /* The call will be answered later with "AnsweringCall()" function. - */ - return H323Connection::AnswerCallDeferredWithMedia; -} - -BOOL MyH323Connection::OnAlerting(const H323SignalPDU & alertingPDU, const PString & username) -{ - if (h323debug) { - cout << "\t=-= In OnAlerting for call " << GetCallReference() - << ": sessionId=" << sessionId << endl; - cout << "\t-- Ringing phone for \"" << username << "\"" << endl; - } - - if (on_progress) { - BOOL isInband; - unsigned alertingPI; - - if (!alertingPDU.GetQ931().GetProgressIndicator(alertingPI)) { - alertingPI = 0; - } - if (h323debug) { - cout << "\t\t- Progress Indicator: " << alertingPI << endl; - } - - switch(alertingPI) { - case Q931::ProgressNotEndToEndISDN: - case Q931::ProgressInbandInformationAvailable: - isInband = TRUE; - break; - default: - isInband = FALSE; - } - on_progress(GetCallReference(), (const char *)GetCallToken(), isInband); - } - on_chan_ringing(GetCallReference(), (const char *)GetCallToken() ); - return connectionState != ShuttingDownConnection; -} - -BOOL MyH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU) -{ - call_details_t cd; - PString sourceE164; - PString destE164; - PString sourceName; - PString sourceAliases; - PString destAliases; - PIPSocket::Address Ip; - WORD sourcePort; - char *s, *s1; - - if (h323debug) { - cout << ("\t--Received SETUP message\n"); - } - - if (connectionState == ShuttingDownConnection) - return FALSE; - - sourceAliases = setupPDU.GetSourceAliases(); - destAliases = setupPDU.GetDestinationAlias(); - - sourceE164 = ""; - setupPDU.GetSourceE164(sourceE164); - sourceName = ""; - sourceName=setupPDU.GetQ931().GetDisplayName(); - destE164 = ""; - setupPDU.GetDestinationE164(destE164); - - /* Convert complex strings */ - // FIXME: deal more than one source alias - if ((s = strchr(sourceAliases, ' ')) != NULL) { - *s = '\0'; - } - if ((s = strchr(sourceAliases, '\t')) != NULL) { - *s = '\0'; - } - if ((s1 = strchr(destAliases, ' ')) != NULL) { - *s1 = '\0'; - } - if ((s1 = strchr(destAliases, '\t')) != NULL) { - *s1 = '\0'; - } - - memset(&cd, 0, sizeof(cd)); - cd.call_reference = GetCallReference(); - cd.call_token = strdup((const char *)GetCallToken()); - cd.call_source_aliases = strdup((const char *)sourceAliases); - cd.call_dest_alias = strdup((const char *)destAliases); - cd.call_source_e164 = strdup((const char *)sourceE164); - cd.call_dest_e164 = strdup((const char *)destE164); - cd.call_source_name = strdup((const char *)sourceName); - - GetSignallingChannel()->GetRemoteAddress().GetIpAndPort(Ip, sourcePort); - cd.sourceIp = strdup((const char *)Ip.AsString()); - - /* Notify Asterisk of the request */ - call_options_t *res = on_incoming_call(&cd); - - if (!res) { - if (h323debug) { - cout << " -- Call Failed" << endl; - } - return FALSE; - } - - progressSetup = res->progress_setup; - progressAlert = res->progress_alert; - dtmfCodec = (RTP_DataFrame::PayloadTypes)res->dtmfcodec; - - - return H323Connection::OnReceivedSignalSetup(setupPDU); -} - -BOOL MyH323Connection::OnSendSignalSetup(H323SignalPDU & setupPDU) -{ - call_details_t cd; - char *s, *s1; - - if (h323debug) { - cout << " -- Sending SETUP message" << endl; - } - - if (connectionState == ShuttingDownConnection) - return FALSE; - - if (!ast_cid_num.IsEmpty()) { - setupPDU.GetQ931().SetCallingPartyNumber(ast_cid_num); - } - - if (!ast_cid_name.IsEmpty()) { - setupPDU.GetQ931().SetDisplayName(ast_cid_name); - } - - sourceAliases = setupPDU.GetSourceAliases(); - destAliases = setupPDU.GetDestinationAlias(); - - sourceE164 = ""; - setupPDU.GetSourceE164(sourceE164); - destE164 = ""; - setupPDU.GetDestinationE164(destE164); - - /* Convert complex strings */ - // FIXME: deal more than one source alias - - if ((s = strchr(sourceAliases, ' ')) != NULL) { - *s = '\0'; - } - if ((s = strchr(sourceAliases, '\t')) != NULL) { - *s = '\0'; - } - if ((s1 = strchr(destAliases, ' ')) != NULL) { - *s1 = '\0'; - } - if ((s1 = strchr(destAliases, '\t')) != NULL) { - *s1 = '\0'; - } - - memset(&cd, 0, sizeof(cd)); - cd.call_reference = GetCallReference(); - cd.call_token = strdup((const char *)GetCallToken()); - cd.call_source_aliases = strdup((const char *)sourceAliases); - cd.call_dest_alias = strdup((const char *)destAliases); - cd.call_source_e164 = strdup((const char *)sourceE164); - cd.call_dest_e164 = strdup((const char *)destE164); - - int res = on_outgoing_call(&cd); - if (!res) { - if (h323debug) { - cout << "\t-- Call Failed" << endl; - } - return FALSE; - } - - if (progressSetup) { - setupPDU.GetQ931().SetProgressIndicator(progressSetup); - } - return H323Connection::OnSendSignalSetup(setupPDU); -} - -BOOL MyH323Connection::OnSendReleaseComplete(H323SignalPDU & releaseCompletePDU) -{ - if (h323debug) { - cout << "\t-- Sending RELEASE COMPLETE" << endl; - } - if (cause > 0) - releaseCompletePDU.GetQ931().SetCause((Q931::CauseValues)cause); - return H323Connection::OnSendReleaseComplete(releaseCompletePDU); -} - -BOOL MyH323Connection::OnReceivedFacility(const H323SignalPDU & pdu) -{ - if (h323debug) { - cout << "\t-- Received Facility message... " << endl; - } - return H323Connection::OnReceivedFacility(pdu); -} - -void MyH323Connection::OnReceivedReleaseComplete(const H323SignalPDU & pdu) -{ - if (h323debug) { - cout << "\t-- Received RELEASE COMPLETE message..." << endl; - } - if (on_hangup) - on_hangup(GetCallReference(), (const char *)GetCallToken(), pdu.GetQ931().GetCause()); - return H323Connection::OnReceivedReleaseComplete(pdu); -} - -BOOL MyH323Connection::OnClosingLogicalChannel(H323Channel & channel) -{ - if (h323debug) { - cout << "\t-- Closing logical channel..." << endl; - } - return H323Connection::OnClosingLogicalChannel(channel); -} - -void MyH323Connection::SendUserInputTone(char tone, unsigned duration) -{ - if (h323debug) { - cout << "\t-- Sending user input tone (" << tone << ") to remote" << endl; - } - on_send_digit(GetCallReference(), tone, (const char *)GetCallToken()); - H323Connection::SendUserInputTone(tone, duration); -} - -void MyH323Connection::OnUserInputTone(char tone, unsigned duration, unsigned logicalChannel, unsigned rtpTimestamp) -{ - if (mode == H323_DTMF_INBAND) { - if (h323debug) { - cout << "\t-- Received user input tone (" << tone << ") from remote" << endl; - } - on_send_digit(GetCallReference(), tone, (const char *)GetCallToken()); - } - H323Connection::OnUserInputTone(tone, duration, logicalChannel, rtpTimestamp); -} - -void MyH323Connection::OnUserInputString(const PString &value) -{ - if (mode == H323_DTMF_RFC2833) { - if (h323debug) { - cout << "\t-- Received user input string (" << value << ") from remote." << endl; - } - on_send_digit(GetCallReference(), value[0], (const char *)GetCallToken()); - } -} - -void MyH323Connection::OnSendCapabilitySet(H245_TerminalCapabilitySet & pdu) -{ - PINDEX i; - - H323Connection::OnSendCapabilitySet(pdu); - - H245_ArrayOf_CapabilityTableEntry & tables = pdu.m_capabilityTable; - for(i = 0; i < tables.GetSize(); i++) - { - H245_CapabilityTableEntry & entry = tables[i]; - if (entry.HasOptionalField(H245_CapabilityTableEntry::e_capability)) { - H245_Capability & cap = entry.m_capability; - if (cap.GetTag() == H245_Capability::e_receiveRTPAudioTelephonyEventCapability) { - H245_AudioTelephonyEventCapability & atec = cap; - atec.m_dynamicRTPPayloadType = dtmfCodec; - on_set_rfc2833_payload(GetCallReference(), (const char *)GetCallToken(), (int)dtmfCodec); - if (h323debug) { - cout << "\t-- Transmitting RFC2833 on payload " << - atec.m_dynamicRTPPayloadType << endl; - } - } - } - } -} - -void MyH323Connection::OnSetLocalCapabilities() -{ - if (on_setcapabilities) - on_setcapabilities(GetCallReference(), (const char *)callToken); -} - -BOOL MyH323Connection::OnReceivedCapabilitySet(const H323Capabilities & remoteCaps, - const H245_MultiplexCapability * muxCap, - H245_TerminalCapabilitySetReject & reject) -{ - if (!H323Connection::OnReceivedCapabilitySet(remoteCaps, muxCap, reject)) { - return FALSE; - } - - const H323Capability * cap = remoteCaps.FindCapability(H323_UserInputCapability::SubTypeNames[H323_UserInputCapability::SignalToneRFC2833]); - if (cap != NULL) { - RTP_DataFrame::PayloadTypes pt = ((H323_UserInputCapability*)cap)->GetPayloadType(); - on_set_rfc2833_payload(GetCallReference(), (const char *)GetCallToken(), (int)pt); - if (h323debug) { - cout << "\t-- Inbound RFC2833 on payload " << pt << endl; - } - } - return TRUE; -} - -H323Channel * MyH323Connection::CreateRealTimeLogicalChannel(const H323Capability & capability, - H323Channel::Directions dir, - unsigned sessionID, - const H245_H2250LogicalChannelParameters * /*param*/, - RTP_QOS * /*param*/ ) -{ - return new MyH323_ExternalRTPChannel(*this, capability, dir, sessionID); -} - -/** This callback function is invoked once upon creation of each - * channel for an H323 session - */ -BOOL MyH323Connection::OnStartLogicalChannel(H323Channel & channel) -{ - /* Increase the count of channels we have open */ - channelsOpen++; - - if (h323debug) { - cout << "\t-- Started logical channel: "; - cout << ((channel.GetDirection()==H323Channel::IsTransmitter)?"sending ":((channel.GetDirection()==H323Channel::IsReceiver)?"receiving ":" ")); - cout << (const char *)(channel.GetCapability()).GetFormatName() << endl; - cout << "\t\t-- channelsOpen = " << channelsOpen << endl; - } - return connectionState != ShuttingDownConnection; -} - -void MyH323Connection::SetCapabilities(int cap, int dtmfMode) -{ - int g711Frames = 20; -// int gsmFrames = 4; - PINDEX lastcap = -1; /* last common capability index */ - -#if 0 - if (cap & AST_FORMAT_SPEEX) { - /* Not real sure if Asterisk acutally supports all - of the various different bit rates so add them - all and figure it out later*/ - - localCapabilities.SetCapability(0, 0, new SpeexNarrow2AudioCapability()); - localCapabilities.SetCapability(0, 0, new SpeexNarrow3AudioCapability()); - localCapabilities.SetCapability(0, 0, new SpeexNarrow4AudioCapability()); - localCapabilities.SetCapability(0, 0, new SpeexNarrow5AudioCapability()); - localCapabilities.SetCapability(0, 0, new SpeexNarrow6AudioCapability()); - } -#endif - if (cap & AST_FORMAT_G729A) { - AST_G729ACapability *g729aCap; - AST_G729Capability *g729Cap; - lastcap = localCapabilities.SetCapability(0, 0, g729aCap = new AST_G729ACapability); - lastcap = localCapabilities.SetCapability(0, 0, g729Cap = new AST_G729Capability); - } - - if (cap & AST_FORMAT_G723_1) { - H323_G7231Capability *g7231Cap; - lastcap = localCapabilities.SetCapability(0, 0, g7231Cap = new H323_G7231Capability); - } -#if 0 - if (cap & AST_FORMAT_GSM) { - H323_GSM0610Capability *gsmCap; - lastcap = localCapabilities.SetCapability(0, 0, gsmCap = new H323_GSM0610Capability); - gsmCap->SetTxFramesInPacket(gsmFrames); - } -#endif - if (cap & AST_FORMAT_ULAW) { - H323_G711Capability *g711uCap; - lastcap = localCapabilities.SetCapability(0, 0, g711uCap = new H323_G711Capability(H323_G711Capability::muLaw)); - g711uCap->SetTxFramesInPacket(g711Frames); - } - - if (cap & AST_FORMAT_ALAW) { - H323_G711Capability *g711aCap; - lastcap = localCapabilities.SetCapability(0, 0, g711aCap = new H323_G711Capability(H323_G711Capability::ALaw)); - g711aCap->SetTxFramesInPacket(g711Frames); - } - - lastcap++; - lastcap = localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::HookFlashH245)); - - lastcap++; - mode = dtmfMode; - if (dtmfMode == H323_DTMF_INBAND) { - localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::SignalToneH245)); - sendUserInputMode = SendUserInputAsTone; - } else { - localCapabilities.SetCapability(0, lastcap, new H323_UserInputCapability(H323_UserInputCapability::SignalToneRFC2833)); - sendUserInputMode = SendUserInputAsInlineRFC2833; - } - - if (h323debug) { - cout << "Allowed Codecs:\n\t" << setprecision(2) << localCapabilities << endl; - } -} - -/* MyH323_ExternalRTPChannel */ -MyH323_ExternalRTPChannel::MyH323_ExternalRTPChannel(MyH323Connection & connection, - const H323Capability & capability, - Directions direction, - unsigned id) - : H323_ExternalRTPChannel::H323_ExternalRTPChannel(connection, capability, direction, id) -{ - struct rtp_info *info; - - /* Determine the Local (A side) IP Address and port */ - info = on_external_rtp_create(connection.GetCallReference(), (const char *)connection.GetCallToken()); - if (!info) { - cout << "\tERROR: on_external_rtp_create failure" << endl; - return; - } else { - localIpAddr = info->addr; - localPort = info->port; - /* tell the H.323 stack */ - SetExternalAddress(H323TransportAddress(localIpAddr, localPort), H323TransportAddress(localIpAddr, localPort + 1)); - /* clean up allocated memory */ - free(info); - } - - /* Get the payload code */ - OpalMediaFormat format(capability.GetFormatName(), FALSE); - payloadCode = format.GetPayloadType(); -} - -MyH323_ExternalRTPChannel::~MyH323_ExternalRTPChannel() -{ - if (h323debug) { - cout << "\tExternalRTPChannel Destroyed" << endl; - } -} - -BOOL MyH323_ExternalRTPChannel::Start(void) -{ - /* Call ancestor first */ - if (!H323_ExternalRTPChannel::Start()) { - return FALSE; - } - - if (h323debug) { - cout << "\t\tExternal RTP Session Starting" << endl; - cout << "\t\tRTP channel id " << sessionID << " parameters:" << endl; - } - - /* Collect the remote information */ - H323_ExternalRTPChannel::GetRemoteAddress(remoteIpAddr, remotePort); - - if (h323debug) { - cout << "\t\t-- remoteIpAddress: " << remoteIpAddr << endl; - cout << "\t\t-- remotePort: " << remotePort << endl; - cout << "\t\t-- ExternalIpAddress: " << localIpAddr << endl; - cout << "\t\t-- ExternalPort: " << localPort << endl; - } - /* Notify Asterisk of remote RTP information */ - on_start_rtp_channel(connection.GetCallReference(), (const char *)remoteIpAddr.AsString(), remotePort, - (const char *)connection.GetCallToken(), (int)payloadCode); - return TRUE; -} - -BOOL MyH323_ExternalRTPChannel::OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param) -{ - PIPSocket::Address remoteIpAddress; - WORD remotePort; - - if (h323debug) { - cout << " MyH323_ExternalRTPChannel::OnReceivedAckPDU" << endl; - } - - if (H323_ExternalRTPChannel::OnReceivedAckPDU(param)) { - GetRemoteAddress(remoteIpAddress, remotePort); - if (h323debug) { - cout << " -- remoteIpAddress: " << remoteIpAddress << endl; - cout << " -- remotePort: " << remotePort << endl; - } - on_start_rtp_channel(connection.GetCallReference(), (const char *)remoteIpAddress.AsString(), - remotePort, (const char *)connection.GetCallToken(), (int)payloadCode); - return TRUE; - } - return FALSE; -} - -/** IMPLEMENTATION OF C FUNCTIONS */ - -/** - * The extern "C" directive takes care for - * the ANSI-C representation of linkable symbols - */ - -extern "C" { - -int h323_end_point_exist(void) -{ - if (!endPoint) { - return 0; - } - return 1; -} - -void h323_end_point_create(void) -{ - channelsOpen = 0; - logstream = new PAsteriskLog(); - localProcess = new MyProcess(); - localProcess->Main(); -} - -void h323_gk_urq(void) -{ - if (!h323_end_point_exist()) { - cout << " ERROR: [h323_gk_urq] No Endpoint, this is bad" << endl; - return; - } - endPoint->RemoveGatekeeper(); -} - -void h323_debug(int flag, unsigned level) -{ - if (flag) { - PTrace:: SetLevel(level); - } else { - PTrace:: SetLevel(0); - } -} - -/** Installs the callback functions on behalf of the PBX application */ -void h323_callback_register(setup_incoming_cb ifunc, - setup_outbound_cb sfunc, - on_rtp_cb rtpfunc, - start_rtp_cb lfunc, - clear_con_cb clfunc, - chan_ringing_cb rfunc, - con_established_cb efunc, - send_digit_cb dfunc, - answer_call_cb acfunc, - progress_cb pgfunc, - rfc2833_cb dtmffunc, - hangup_cb hangupfunc, - setcapabilities_cb capabilityfunc) -{ - on_incoming_call = ifunc; - on_outgoing_call = sfunc; - on_external_rtp_create = rtpfunc; - on_start_rtp_channel = lfunc; - on_connection_cleared = clfunc; - on_chan_ringing = rfunc; - on_connection_established = efunc; - on_send_digit = dfunc; - on_answer_call = acfunc; - on_progress = pgfunc; - on_set_rfc2833_payload = dtmffunc; - on_hangup = hangupfunc; - on_setcapabilities = capabilityfunc; -} - -/** - * Add capability to the capability table of the end point. - */ -int h323_set_capabilities(const char *token, int cap, int dtmfMode) -{ - MyH323Connection *conn; - - if (!h323_end_point_exist()) { - cout << " ERROR: [h323_set_capablities] No Endpoint, this is bad" << endl; - return 1; - } - if (!token || !*token) { - cout << " ERROR: [h323_set_capabilities] Invalid call token specified." << endl; - return 1; - } - - PString myToken(token); - conn = (MyH323Connection *)endPoint->FindConnectionWithLock(myToken); - if (!conn) { - cout << " ERROR: [h323_set_capabilities] Unable to find connection " << token << endl; - return 1; - } - conn->SetCapabilities(cap, dtmfMode); - conn->Unlock(); - - return 0; -} - -/** Start the H.323 listener */ -int h323_start_listener(int listenPort, struct sockaddr_in bindaddr) -{ - - if (!h323_end_point_exist()) { - cout << "ERROR: [h323_start_listener] No Endpoint, this is bad!" << endl; - return 1; - } - - PIPSocket::Address interfaceAddress(bindaddr.sin_addr); - if (!listenPort) { - listenPort = 1720; - } - /** H.323 listener */ - H323ListenerTCP *tcpListener; - tcpListener = new H323ListenerTCP(*endPoint, interfaceAddress, (WORD)listenPort); - if (!endPoint->StartListener(tcpListener)) { - cout << "ERROR: Could not open H.323 listener port on " << ((H323ListenerTCP *) tcpListener)->GetListenerPort() << endl; - delete tcpListener; - return 1; - - } - cout << " == H.323 listener started" << endl; - return 0; -}; - -int h323_set_alias(struct oh323_alias *alias) -{ - char *p; - char *num; - PString h323id(alias->name); - PString e164(alias->e164); - char *prefix; - - if (!h323_end_point_exist()) { - cout << "ERROR: [h323_set_alias] No Endpoint, this is bad!" << endl; - return 1; - } - - cout << "== Adding alias \"" << h323id << "\" to endpoint" << endl; - endPoint->AddAliasName(h323id); - endPoint->RemoveAliasName(localProcess->GetUserName()); - - if (!e164.IsEmpty()) { - cout << "== Adding E.164 \"" << e164 << "\" to endpoint" << endl; - endPoint->AddAliasName(e164); - } - if (strlen(alias->prefix)) { - p = prefix = strdup(alias->prefix); - while((num = strsep(&p, ",")) != (char *)NULL) { - cout << "== Adding Prefix \"" << num << "\" to endpoint" << endl; - endPoint->SupportedPrefixes += PString(num); - endPoint->SetGateway(); - } - if (prefix) - free(prefix); - } - return 0; -} - -void h323_set_id(char *id) -{ - PString h323id(id); - - if (h323debug) { - cout << " == Using '" << h323id << "' as our H.323ID for this call" << endl; - } - /* EVIL HACK */ - endPoint->SetLocalUserName(h323id); -} - -void h323_show_tokens(void) -{ - cout << "Current call tokens: " << setprecision(2) << endPoint->GetAllConnections() << endl; -} - -/** Establish Gatekeeper communiations, if so configured, - * register aliases for the H.323 endpoint to respond to. - */ -int h323_set_gk(int gatekeeper_discover, char *gatekeeper, char *secret) -{ - PString gkName = PString(gatekeeper); - PString pass = PString(secret); - H323TransportUDP *rasChannel; - - if (!h323_end_point_exist()) { - cout << "ERROR: [h323_set_gk] No Endpoint, this is bad!" << endl; - return 1; - } - - if (!gatekeeper) { - cout << "Error: Gatekeeper cannot be NULL" << endl; - return 1; - } - if (strlen(secret)) { - endPoint->SetGatekeeperPassword(pass); - } - if (gatekeeper_discover) { - /* discover the gk using multicast */ - if (endPoint->DiscoverGatekeeper(new H323TransportUDP(*endPoint))) { - cout << "== Using " << (endPoint->GetGatekeeper())->GetName() << " as our Gatekeeper." << endl; - } else { - cout << "Warning: Could not find a gatekeeper." << endl; - return 1; - } - } else { - rasChannel = new H323TransportUDP(*endPoint); - - if (!rasChannel) { - cout << "Error: No RAS Channel, this is bad" << endl; - return 1; - } - if (endPoint->SetGatekeeper(gkName, rasChannel)) { - cout << "== Using " << (endPoint->GetGatekeeper())->GetName() << " as our Gatekeeper." << endl; - } else { - cout << "Error registering with gatekeeper \"" << gkName << "\". " << endl; - /* XXX Maybe we should fire a new thread to attempt to re-register later and not kill asterisk here? */ - return 1; - } - } - return 0; -} - -/** Send a DTMF tone over the H323Connection with the - * specified token. - */ -void h323_send_tone(const char *call_token, char tone) -{ - if (!h323_end_point_exist()) { - cout << "ERROR: [h323_send_tone] No Endpoint, this is bad!" << endl; - return; - } - PString token = PString(call_token); - endPoint->SendUserTone(token, tone); -} - -/** Make a call to the remote endpoint. - */ -int h323_make_call(char *dest, call_details_t *cd, call_options_t *call_options) -{ - int res; - PString token; - PString host(dest); - - if (!h323_end_point_exist()) { - return 1; - } - - res = endPoint->MakeCall(host, token, &cd->call_reference, call_options); - memcpy((char *)(cd->call_token), (const unsigned char *)token, token.GetLength()); - return res; -}; - -int h323_clear_call(const char *call_token, int cause) -{ - H225_ReleaseCompleteReason dummy; - H323Connection::CallEndReason r = H323Connection::EndedByLocalUser; - MyH323Connection *connection; - const PString currentToken(call_token); - - if (!h323_end_point_exist()) { - return 1; - } - - if (cause) { - r = H323TranslateToCallEndReason((Q931::CauseValues)(cause), dummy); - } - - connection = (MyH323Connection *)endPoint->FindConnectionWithLock(currentToken); - if (connection) { - connection->SetCause(cause); - connection->SetCallEndReason(r); - connection->Unlock(); - } - endPoint->ClearCall(currentToken, r); - return 0; -}; - -/* Send Alerting PDU to H.323 caller */ -int h323_send_alerting(const char *token) -{ - const PString currentToken(token); - H323Connection * connection; - - if (h323debug) { - cout << "\tSending alerting\n" << endl; - } - connection = endPoint->FindConnectionWithLock(currentToken); - if (!connection) { - cout << "No connection found for " << token << endl; - return -1; - } - connection->AnsweringCall(H323Connection::AnswerCallPending); - connection->Unlock(); - return 0; - -} - -/* Send Progress PDU to H.323 caller */ -int h323_send_progress(const char *token) -{ - const PString currentToken(token); - H323Connection * connection; - - connection = endPoint->FindConnectionWithLock(currentToken); - if (!connection) { - cout << "No connection found for " << token << endl; - return -1; - } - connection->AnsweringCall(H323Connection::AnswerCallDeferredWithMedia); - connection->Unlock(); - return 0; -} - -/** This function tells the h.323 stack to either - answer or deny an incoming call */ -int h323_answering_call(const char *token, int busy) -{ - const PString currentToken(token); - H323Connection * connection; - - connection = endPoint->FindConnectionWithLock(currentToken); - - if (!connection) { - cout << "No connection found for " << token << endl; - return -1; - } - if (!busy) { - if (h323debug) { - cout << "\tAnswering call " << token << endl; - } - connection->AnsweringCall(H323Connection::AnswerCallNow); - } else { - if (h323debug) { - cout << "\tdenying call " << token << endl; - } - connection->AnsweringCall(H323Connection::AnswerCallDenied); - } - connection->Unlock(); - return 0; -} - -int h323_show_codec(int fd, int argc, char *argv[]) -{ - cout << "Allowed Codecs:\n\t" << setprecision(2) << endPoint->GetCapabilities() << endl; - return 0; -} - -int h323_soft_hangup(const char *data) -{ - PString token(data); - BOOL result; - cout << "Soft hangup" << endl; - result = endPoint->ClearCall(token); - return result; -} - -/* alas, this doesn't work :( */ -void h323_native_bridge(const char *token, const char *them, char *capability) -{ - H323Channel *channel; - MyH323Connection *connection = (MyH323Connection *)endPoint->FindConnectionWithLock(token); - - if (!connection) { - cout << "ERROR: No connection found, this is bad\n"; - return; - } - - cout << "Native Bridge: them [" << them << "]" << endl; - - channel = connection->FindChannel(connection->sessionId, TRUE); - connection->bridging = TRUE; - connection->CloseLogicalChannelNumber(channel->GetNumber()); - - connection->Unlock(); - return; - -} - -#undef cout -void h323_end_process(void) -{ - if (endPoint) { - endPoint->ClearAllCalls(); - endPoint->RemoveListener(NULL); - delete endPoint; - endPoint = NULL; - } - if (localProcess) { - delete localProcess; - localProcess = NULL; - } - PTrace::SetLevel(0); - PTrace::SetStream(&cout); - if (logstream) { - delete logstream; - logstream = NULL; - } -} - -} /* extern "C" */ - diff --git a/1.2-netsec/channels/h323/ast_h323.h b/1.2-netsec/channels/h323/ast_h323.h deleted file mode 100644 index 5bab9fc3b..000000000 --- a/1.2-netsec/channels/h323/ast_h323.h +++ /dev/null @@ -1,239 +0,0 @@ -/* - * ast_h323.h - * - * OpenH323 Channel Driver for ASTERISK PBX. - * By Jeremy McNamara - * For The NuFone Network - * - * This code has been derived from code created by - * Michael Manousos and Mark Spencer - * - * This file is part of the chan_h323 driver for Asterisk - * - * chan_h323 is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * chan_h323 is distributed WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Version Info: $Id$ - */ - -#ifndef AST_H323_H -#define AST_H323_H - -/** These need to be redefined here because the C++ - side of this driver is blind to the asterisk headers */ -/*! G.723.1 compression */ -#define AST_FORMAT_G723_1 (1 << 0) -/*! GSM compression */ -#define AST_FORMAT_GSM (1 << 1) -/*! Raw mu-law data (G.711) */ -#define AST_FORMAT_ULAW (1 << 2) -/*! Raw A-law data (G.711) */ -#define AST_FORMAT_ALAW (1 << 3) -/*! MPEG-2 layer 3 */ -#define AST_FORMAT_MP3 (1 << 4) -/*! ADPCM (whose?) */ -#define AST_FORMAT_ADPCM (1 << 5) -/*! Raw 16-bit Signed Linear (8000 Hz) PCM */ -#define AST_FORMAT_SLINEAR (1 << 6) -/*! LPC10, 180 samples/frame */ -#define AST_FORMAT_LPC10 (1 << 7) -/*! G.729A audio */ -#define AST_FORMAT_G729A (1 << 8) -/*! SpeeX Free Compression */ -#define AST_FORMAT_SPEEX (1 << 9) -/*! ILBC Free Codec */ -#define AST_FORMAT_ILBC (1 << 10) - -/**This class describes the G.723.1 codec capability. - */ -class H323_G7231Capability : public H323AudioCapability -{ - PCLASSINFO(H323_G7231Capability, H323AudioCapability); - public: - H323_G7231Capability(BOOL annexA = TRUE); - Comparison Compare(const PObject & obj) const; - PObject * Clone() const; - virtual H323Codec * CreateCodec(H323Codec::Direction direction) const; - unsigned GetSubType() const; - PString GetFormatName() const; - BOOL OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const; - BOOL OnReceivedPDU(const H245_AudioCapability & pdu, unsigned & packetSize); - protected: - BOOL annexA; -}; - -/**This class describes the (fake) G729 codec capability. - */ -class AST_G729Capability : public H323AudioCapability -{ - PCLASSINFO(AST_G729Capability, H323AudioCapability); - - public: - AST_G729Capability(); - /* Create a copy of the object. */ - virtual PObject * Clone() const; - - /* Create the codec instance, allocating resources as required. */ - virtual H323Codec * CreateCodec(H323Codec::Direction direction) const; - - /* Get the sub-type of the capability. This is a code dependent on the - main type of the capability. - - This returns one of the four possible combinations of mode and speed - using the enum values of the protocol ASN H245_AudioCapability class. */ - virtual unsigned GetSubType() const; - - /* Get the name of the media data format this class represents. */ - virtual PString GetFormatName() const; - -}; - -/* This class describes the VoiceAge G729A codec capability. */ -class AST_G729ACapability : public H323AudioCapability -{ - PCLASSINFO(AST_G729ACapability, H323AudioCapability); - - public: - /* Create a new G.729A capability. */ - AST_G729ACapability(); - - /* Create a copy of the object. */ - virtual PObject * Clone() const; - /* Create the codec instance, allocating resources as required. */ - virtual H323Codec * CreateCodec(H323Codec::Direction direction) const; - - /* Get the sub-type of the capability. This is a code dependent on the - main type of the capability. - - This returns one of the four possible combinations of mode and speed - using the enum values of the protocol ASN H245_AudioCapability class. */ - virtual unsigned GetSubType() const; - - /* Get the name of the media data format this class represents. */ - virtual PString GetFormatName() const; -}; - -class MyH323EndPoint : public H323EndPoint { - - PCLASSINFO(MyH323EndPoint, H323EndPoint); - - public: - MyH323EndPoint(); - int MakeCall(const PString &, PString &, unsigned int *, call_options_t *opts); - BOOL ClearCall(const PString &, H323Connection::CallEndReason reason); - BOOL ClearCall(const PString &); - - void OnClosedLogicalChannel(H323Connection &, const H323Channel &); - void OnConnectionEstablished(H323Connection &, const PString &); - void OnConnectionCleared(H323Connection &, const PString &); - H323Connection * CreateConnection(unsigned, void *); - void SendUserTone(const PString &, char); - BOOL OnConnectionForwarded(H323Connection &, const PString &, const H323SignalPDU &); - BOOL ForwardConnection(H323Connection &, const PString &, const H323SignalPDU &); - void SetEndpointTypeInfo( H225_EndpointType & info ) const; - void SetGateway(void); - PStringArray SupportedPrefixes; -}; - -class MyH323Connection : public H323Connection { - - PCLASSINFO(MyH323Connection, H323Connection); - - public: - MyH323Connection(MyH323EndPoint &, unsigned, unsigned); - ~MyH323Connection(); - H323Channel * CreateRealTimeLogicalChannel(const H323Capability &, - H323Channel::Directions, - unsigned, - const H245_H2250LogicalChannelParameters *, - RTP_QOS *); - H323Connection::AnswerCallResponse OnAnswerCall(const PString &, - const H323SignalPDU &, - H323SignalPDU &); - void OnReceivedReleaseComplete(const H323SignalPDU &); - BOOL OnAlerting(const H323SignalPDU &, const PString &); - BOOL OnSendReleaseComplete(H323SignalPDU &); - BOOL OnReceivedSignalSetup(const H323SignalPDU &); - BOOL OnReceivedFacility(const H323SignalPDU &); - BOOL OnSendSignalSetup(H323SignalPDU &); - BOOL OnStartLogicalChannel(H323Channel &); - BOOL OnClosingLogicalChannel(H323Channel &); - void SendUserInputTone(char, unsigned); - void OnUserInputTone(char, unsigned, unsigned, unsigned); - void OnUserInputString(const PString &value); - BOOL OnReceivedProgress(const H323SignalPDU &); - void OnSendCapabilitySet(H245_TerminalCapabilitySet &); - void OnSetLocalCapabilities(); - void SetCapabilities(int, int); - BOOL OnReceivedCapabilitySet(const H323Capabilities &, const H245_MultiplexCapability *, - H245_TerminalCapabilitySetReject &); - void SetCause(int _cause) { cause = _cause; }; - - PString sourceAliases; - PString destAliases; - PString sourceE164; - PString destE164; - - WORD sessionId; - BOOL bridging; - - unsigned progressSetup; - unsigned progressAlert; - int cause; - - RTP_DataFrame::PayloadTypes dtmfCodec; - - PString ast_cid_num; - PString ast_cid_name; -}; - -class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel { - - PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel); - - public: - MyH323_ExternalRTPChannel( - MyH323Connection & connection, - const H323Capability & capability, - Directions direction, - unsigned sessionID); - - ~MyH323_ExternalRTPChannel(); - - /* Overrides */ - BOOL Start(void); - BOOL OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param); - - protected: - BYTE payloadCode; - - PIPSocket::Address localIpAddr; - PIPSocket::Address remoteIpAddr; - WORD localPort; - WORD remotePort; -}; - -/** - * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint - * objected to be created from within that class. (Solves the who owns main() problem). - */ -class MyProcess : public PProcess { - - PCLASSINFO(MyProcess, PProcess); - - public: - MyProcess(); - void Main(); -}; - -#endif /* !defined AST_H323_H */ diff --git a/1.2-netsec/channels/h323/chan_h323.h b/1.2-netsec/channels/h323/chan_h323.h deleted file mode 100644 index 1ca681c77..000000000 --- a/1.2-netsec/channels/h323/chan_h323.h +++ /dev/null @@ -1,232 +0,0 @@ -/* - * chan_h323.h - * - * OpenH323 Channel Driver for ASTERISK PBX. - * By Jeremy McNamara - * For The NuFone Network - * - * This code has been derived from code created by - * Michael Manousos and Mark Spencer - * - * This file is part of the chan_h323 driver for Asterisk - * - * chan_h323 is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * chan_h323 is distributed WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Version Info: $Id$ - */ - -#include <arpa/inet.h> - -/** call_option struct holds various bits - * of information for each call */ -typedef struct call_options { - char cid_num[80]; - char cid_name[80]; - int noFastStart; - int noH245Tunneling; - int noSilenceSuppression; - int progress_setup; - int progress_alert; - int progress_audio; - int dtmfcodec; - int dtmfmode; - int capability; - int bridge; - int nat; -} call_options_t; - -/* structure to hold the valid asterisk users */ -struct oh323_user { - char name[80]; - char context[80]; - char secret[80]; - char callerid[80]; - char accountcode[AST_MAX_ACCOUNT_CODE]; - int amaflags; - int host; - struct sockaddr_in addr; - struct ast_ha *ha; - call_options_t options; - struct oh323_user *next; -}; - -/* structure to hold the valid asterisk peers - All peers are registered to a GK if there is one */ -struct oh323_peer { - char name[80]; - char mailbox[80]; - int delme; - struct sockaddr_in addr; - struct ast_ha *ha; - call_options_t options; - struct oh323_peer *next; -}; - -/* structure to hold the H.323 aliases which get registered to - the H.323 endpoint and gatekeeper */ -struct oh323_alias { - char name[80]; - char e164[20]; /* tells a GK to route this E.164 to this alias */ - char prefix[500]; /* tells a GK this alias supports these prefixes */ - char secret[20]; /* the H.235 password to send to the GK for authentication */ - char context[80]; - struct oh323_alias *next; -}; - -/** call_details struct call detail records - to asterisk for processing and used for matching up - asterisk channels to acutal h.323 connections */ -typedef struct call_details { - unsigned int call_reference; - char *call_token; - char *call_source_aliases; - char *call_dest_alias; - char *call_source_name; - char *call_source_e164; - char *call_dest_e164; - int presentation; - int screening; - char *sourceIp; -} call_details_t; - -typedef struct rtp_info { - char addr[32]; - unsigned int port; -} rtp_info_t; - -/* This is a callback prototype function, called pass - DTMF down the RTP. */ -typedef int (*send_digit_cb)(unsigned, char, const char *); -extern send_digit_cb on_send_digit; - -/* This is a callback prototype function, called to collect - the external RTP port from Asterisk. */ -typedef rtp_info_t *(*on_rtp_cb)(unsigned, const char *); -extern on_rtp_cb on_external_rtp_create; - -/* This is a callback prototype function, called to send - the remote IP and RTP port from H.323 to Asterisk */ -typedef void (*start_rtp_cb)(unsigned int, const char *, int, const char *, int); -extern start_rtp_cb on_start_rtp_channel; - -/* This is a callback that happens when call progress is - * made, and handles inband progress */ -typedef int (*progress_cb)(unsigned, const char *, int); -extern progress_cb on_progress; - -/* This is a callback prototype function, called upon - an incoming call happens. */ -typedef call_options_t *(*setup_incoming_cb)(call_details_t *); -extern setup_incoming_cb on_incoming_call; - -/* This is a callback prototype function, called upon - an outbound call. */ -typedef int (*setup_outbound_cb)(call_details_t *); -extern setup_outbound_cb on_outgoing_call; - -/* This is a callback prototype function, called when - OnAlerting is invoked */ -typedef void (*chan_ringing_cb)(unsigned, const char *); -extern chan_ringing_cb on_chan_ringing; - -/* This is a callback protoype function, called when - OnConnectionEstablished is inovked */ -typedef void (*con_established_cb)(unsigned, const char *); -extern con_established_cb on_connection_established; - -/* This is a callback prototype function, called when - OnConnectionCleared callback is invoked */ -typedef void (*clear_con_cb)(unsigned, const char *); -extern clear_con_cb on_connection_cleared; - -/* This is a callback prototype function, called when - an H.323 call is answered */ -typedef int (*answer_call_cb)(unsigned, const char *); -extern answer_call_cb on_answer_call; - -/* This is a callback prototype function, called when - we know which RTP payload type RFC2833 will be - transmitted */ -typedef void (*rfc2833_cb)(unsigned, const char *, int); -extern rfc2833_cb on_set_rfc2833_payload; - -typedef void (*hangup_cb)(unsigned, const char *, int); -extern hangup_cb on_hangup; - -typedef void (*setcapabilities_cb)(unsigned, const char *); -extern setcapabilities_cb on_setcapabilities; - -/* debug flag */ -extern int h323debug; - -#define H323_DTMF_RFC2833 (1 << 0) -#define H323_DTMF_INBAND (1 << 1) - -#ifndef BOOL -#define BOOL int -#endif - -#ifdef __cplusplus -extern "C" { -#endif - - void h323_gk_urq(void); - void h323_end_point_create(void); - void h323_end_process(void); - int h323_end_point_exist(void); - - void h323_debug(int, unsigned); - - /* callback function handler*/ - void h323_callback_register(setup_incoming_cb, - setup_outbound_cb, - on_rtp_cb, - start_rtp_cb, - clear_con_cb, - chan_ringing_cb, - con_established_cb, - send_digit_cb, - answer_call_cb, - progress_cb, - rfc2833_cb, - hangup_cb, - setcapabilities_cb); - int h323_set_capabilities(const char *, int, int); - int h323_set_alias(struct oh323_alias *); - int h323_set_gk(int, char *, char *); - void h323_set_id(char *); - void h323_show_tokens(void); - - /* H323 listener related funcions */ - int h323_start_listener(int, struct sockaddr_in); - - void h323_native_bridge(const char *, const char *, char *); - - /* Send a DTMF tone to remote endpoint */ - void h323_send_tone(const char *call_token, char tone); - - /* H323 create and destroy sessions */ - int h323_make_call(char *dest, call_details_t *cd, call_options_t *); - int h323_clear_call(const char *, int cause); - - /* H.323 alerting and progress */ - int h323_send_alerting(const char *token); - int h323_send_progress(const char *token); - int h323_answering_call(const char *token, int); - int h323_soft_hangup(const char *data); - int h323_show_codec(int fd, int argc, char *argv[]); - -#ifdef __cplusplus -} -#endif diff --git a/1.2-netsec/channels/h323/h323.conf.sample b/1.2-netsec/channels/h323/h323.conf.sample deleted file mode 100644 index 42858ed74..000000000 --- a/1.2-netsec/channels/h323/h323.conf.sample +++ /dev/null @@ -1,123 +0,0 @@ -; The NuFone Network's -; Open H.323 driver configuration -; -[general] -port = 1720 -bindaddr = 1.2.3.4 ; this SHALL contain a single, valid IP address for this machine -;tos=lowdelay -; -; You may specify a global default AMA flag for iaxtel calls. It must be -; one of 'default', 'omit', 'billing', or 'documentation'. These flags -; are used in the generation of call detail records. -; -;amaflags = default -; -; You may specify a default account for Call Detail Records in addition -; to specifying on a per-user basis -; -;accountcode=lss0101 -; -; You can fine tune codecs here using "allow" and "disallow" clauses -; with specific codecs. Use "all" to represent all formats. -; -disallow=all -;allow=all ; turns on all installed codecs -;disallow=g723.1 ; Hm... Proprietary, don't use it... -allow=gsm ; Always allow GSM, it's cool :) -; -; User-Input Mode (DTMF) -; -; valid entries are: rfc2833, inband -; default is rfc2833 -;dtmfmode=rfc2833 -; -; Default RTP Payload to send RFC2833 DTMF on. This is used to -; interoperate with broken gateways which cannot successfully -; negotiate a RFC2833 payload type in the TerminalCapabilitySet. -; -; You may also specify on either a per-peer or per-user basis below. -;dtmfcodec=101 -; -; Set the gatekeeper -; DISCOVER - Find the Gk address using multicast -; DISABLE - Disable the use of a GK -; <IP address> or <Host name> - The acutal IP address or hostname of your GK -;gatekeeper = DISABLE -; -; -; Tell Asterisk whether or not to accept Gatekeeper -; routed calls or not. Normally this should always -; be set to yes, unless you want to have finer control -; over which users are allowed access to Asterisk. -; Default: YES -; -;AllowGKRouted = yes -; -; Optionally you can determine a user by Source IP versus its H.323 alias. -; Default behavour is to determine user by H.323 alias. -;UserByAlias=no -; -; Default context gets used in siutations where you are using -; the GK routed model or no type=user was found. This gives you -; the ability to either play an invalid message or to simply not -; use user authentication at all. -; -;context=default -; -; H.323 Alias definitions -; -; Type 'h323' will register aliases to the endpoint -; and Gatekeeper, if there is one. -; -; Example: if someone calls time@your.asterisk.box.com -; Asterisk will send the call to the extension 'time' -; in the context default -; -; [default] -; exten => time,1,Answer -; exten => time,2,Playback,current-time -; -; Keyword's 'prefix' and 'e164' are only make sense when -; used with a gatekeeper. You can specify either a prefix -; or E.164 this endpoint is responsible for terminating. -; -; Example: The H.323 alias 'det-gw' will tell the gatekeeper -; to route any call with the prefix 1248 to this alias. Keyword -; e164 is used when you want to specifiy a full telephone -; number. So a call to the number 18102341212 would be -; routed to the H.323 alias 'time'. -; -;[time] -;type=h323 -;e164=18102341212 -;context=default -; -;[det-gw] -;type=h323 -;prefix=1248,1313 -;context=detroit -; -; -; Inbound H.323 calls from BillyBob would land in the incoming -; context with a maximum of 4 concurrent incoming calls -; -; -; Note: If keyword 'incominglimit' are omitted Asterisk will not -; enforce any maximum number of concurrent calls. -; -;[BillyBob] -;type=user -;host=192.168.1.1 -;context=incoming -;incominglimit=4 -; -; -; Outbound H.323 call to Larry using SlowStart -; -[Larry] -type=peer -host=192.168.2.1 -noFastStart=yes - - - |