Added TCAP ANSI support.
git-svn-id: http://yate.null.ro/svn/yate/trunk@4594 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
parent
50658629b1
commit
9ded877a15
|
@ -826,3 +826,48 @@
|
||||||
; have the same ssn
|
; have the same ssn
|
||||||
;ssn=0
|
;ssn=0
|
||||||
|
|
||||||
|
|
||||||
|
; Example of a SS7 Transaction Capabilities Application Part
|
||||||
|
; This component is created when encountering a section of this kind
|
||||||
|
;[ss7tcap]
|
||||||
|
; type: keyword: identifies the component as a SS7 Transfer Capabilities Application Part
|
||||||
|
; type = ss7-tcap-ansi for ANSI TCAP
|
||||||
|
; type = ss7-tcap-itu for ITU TCAP - not implemented yet
|
||||||
|
;type=
|
||||||
|
|
||||||
|
; local_SSN: local SubSystem Number. Mandatory
|
||||||
|
;local_SSN=
|
||||||
|
|
||||||
|
; default_remote_SSN: remote SubSystem Number to provide to SCCP if the application does not provide one
|
||||||
|
;default_remote_SSN=
|
||||||
|
|
||||||
|
; default_remote_pointcode: remote Point Code to provide to SCCP if the application does not provide one
|
||||||
|
;default_remote_pointcode=
|
||||||
|
|
||||||
|
; pointcodetype: remote Point Code type. See above documentation for available types
|
||||||
|
;pointcodetype=
|
||||||
|
|
||||||
|
; sccp: Name of the SCCP component to create and be used by this TCAP
|
||||||
|
; A section with the name given here must exist in order to configure the SCCP level
|
||||||
|
;sccp=
|
||||||
|
|
||||||
|
; transact_timeout: Time in seconds to timeout a TCAP transaction after no more activity was registered on it
|
||||||
|
; Defaults to 300 seconds
|
||||||
|
;transact_timeout=300
|
||||||
|
|
||||||
|
;print-messages: Boolean to enable/disable printing of decoding/encoding of TCAP messages
|
||||||
|
; This option applies on reload
|
||||||
|
;print-messages=false
|
||||||
|
|
||||||
|
;extended-debug: Boolean to enable/disable printing of the step-by-step decoding/encoding of TCAP messages
|
||||||
|
; This option applies on reload. print-messages must be true.
|
||||||
|
;extended-debug=false
|
||||||
|
|
||||||
|
|
||||||
|
[tcapuser_test]
|
||||||
|
; mimicks a TCAP User, which emits and receives TCAP messages in Message form
|
||||||
|
; type is ss7-tcap-user to identify it as the specific user
|
||||||
|
;type=ss7-tcap-user
|
||||||
|
|
||||||
|
; tcap: The TCAP to which this user is to attach itself to it
|
||||||
|
;tcap=
|
||||||
|
|
|
@ -7,11 +7,12 @@ CXX := @CXX@ -Wall
|
||||||
AR := ar
|
AR := ar
|
||||||
DEFS :=
|
DEFS :=
|
||||||
LIBTHR := @THREAD_LIB@
|
LIBTHR := @THREAD_LIB@
|
||||||
INCLUDES := -I@top_srcdir@ -I../.. -I@srcdir@
|
INCLUDES := -I@top_srcdir@ -I../.. -I@srcdir@ -I../yasn
|
||||||
CFLAGS := @CFLAGS@ @MODULE_CPPFLAGS@ @INLINE_FLAGS@
|
CFLAGS := @CFLAGS@ @MODULE_CPPFLAGS@ @INLINE_FLAGS@
|
||||||
LDFLAGS:= @LDFLAGS@
|
LDFLAGS:= @LDFLAGS@
|
||||||
SONAME_OPT := @SONAME_OPT@
|
SONAME_OPT := @SONAME_OPT@
|
||||||
YATELIBS := -L../.. -lyate @LIBS@
|
YATELIBS := -L../.. -lyate @LIBS@
|
||||||
|
YASNLIB := -L../yasn -lyasn
|
||||||
INCFILES := @top_srcdir@/yateclass.h @srcdir@/yatesig.h
|
INCFILES := @top_srcdir@/yateclass.h @srcdir@/yatesig.h
|
||||||
|
|
||||||
PROGS= yate-ss7test
|
PROGS= yate-ss7test
|
||||||
|
@ -24,6 +25,7 @@ OBJS = engine.o address.o sigcall.o sigtran.o \
|
||||||
LIBD_VER:= libyatesig.so.@PACKAGE_VERSION@
|
LIBD_VER:= libyatesig.so.@PACKAGE_VERSION@
|
||||||
LIBD_DEV:= libyatesig.so
|
LIBD_DEV:= libyatesig.so
|
||||||
LIBD:= ../../$(LIBD_VER) ../../$(LIBD_DEV)
|
LIBD:= ../../$(LIBD_VER) ../../$(LIBD_DEV)
|
||||||
|
YASN:= ../yasn/libyasn.a
|
||||||
DOCS = classes.png
|
DOCS = classes.png
|
||||||
|
|
||||||
LOCALFLAGS =
|
LOCALFLAGS =
|
||||||
|
@ -65,8 +67,8 @@ clean:
|
||||||
Makefile: @srcdir@/Makefile.in ../../config.status
|
Makefile: @srcdir@/Makefile.in ../../config.status
|
||||||
cd ../.. && ./config.status
|
cd ../.. && ./config.status
|
||||||
|
|
||||||
../../$(LIBD_VER): $(OBJS)
|
../../$(LIBD_VER): $(OBJS) $(YASN)
|
||||||
$(LINK) -o $@ $(SONAME_OPT)$(LIBD_VER) $^ $(YATELIBS)
|
$(LINK) -o $@ $(SONAME_OPT)$(LIBD_VER) $^ $(YASNLIB) $(YATELIBS)
|
||||||
|
|
||||||
../../$(LIBD_DEV): ../../$(LIBD_VER)
|
../../$(LIBD_DEV): ../../$(LIBD_VER)
|
||||||
cd ../.. && ln -sf $(LIBD_VER) $(LIBD_DEV)
|
cd ../.. && ln -sf $(LIBD_VER) $(LIBD_DEV)
|
||||||
|
@ -77,6 +79,9 @@ yate-%: @srcdir@/main-%.cpp $(MKDEPS) $(LIBS) ../../libyate.so $(INCFILES)
|
||||||
$(LIBS): $(OBJS)
|
$(LIBS): $(OBJS)
|
||||||
$(AR) rcs $@ $^
|
$(AR) rcs $@ $^
|
||||||
|
|
||||||
|
$(YASN):
|
||||||
|
$(MAKE) -C ../yasn
|
||||||
|
|
||||||
yate-ss7test: LOCALLIBS += -L. -lyatesig
|
yate-ss7test: LOCALLIBS += -L. -lyatesig
|
||||||
|
|
||||||
%.png: @srcdir@/%.dia
|
%.png: @srcdir@/%.dia
|
||||||
|
|
2785
libs/ysig/tcap.cpp
2785
libs/ysig/tcap.cpp
File diff suppressed because it is too large
Load Diff
1048
libs/ysig/yatesig.h
1048
libs/ysig/yatesig.h
File diff suppressed because it is too large
Load Diff
|
@ -46,6 +46,9 @@ class SigTrunkThread; // Get events and check timeout for tru
|
||||||
class IsupDecodeHandler; // Handler for "isup.decode" message
|
class IsupDecodeHandler; // Handler for "isup.decode" message
|
||||||
class IsupEncodeHandler; // Handler for "isup.encode" message
|
class IsupEncodeHandler; // Handler for "isup.encode" message
|
||||||
class SigNotifier; // Class for handling received notifications
|
class SigNotifier; // Class for handling received notifications
|
||||||
|
class SigSS7Tcap; // SS7 TCAP - Transaction Capabilities Application Part
|
||||||
|
class SigTCAPUser; // Default TCAP user
|
||||||
|
class TCAPMsgHandler; // TCAP Message handler
|
||||||
|
|
||||||
// The signalling channel
|
// The signalling channel
|
||||||
class SigChannel : public Channel
|
class SigChannel : public Channel
|
||||||
|
@ -538,6 +541,56 @@ private:
|
||||||
unsigned char m_idleValue; // Idle value for source multiplexer to fill when no data
|
unsigned char m_idleValue; // Idle value for source multiplexer to fill when no data
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SigSS7Tcap : public SigTopmost
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
inline SigSS7Tcap(const char* name)
|
||||||
|
: SigTopmost(name), m_tcap(0)
|
||||||
|
{ }
|
||||||
|
// Initialize (create or reload) the TCAP component
|
||||||
|
// Return false on failure
|
||||||
|
virtual bool initialize(NamedList& params);
|
||||||
|
// Return the status of this component
|
||||||
|
virtual void status(String& retVal);
|
||||||
|
protected:
|
||||||
|
virtual void destroyed();
|
||||||
|
private:
|
||||||
|
SS7TCAP* m_tcap;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SigTCAPUser : public SigTopmost, public TCAPUser
|
||||||
|
{
|
||||||
|
YCLASS(SigTCAPUser,TCAPUser)
|
||||||
|
public:
|
||||||
|
inline SigTCAPUser(const char* name)
|
||||||
|
: SigTopmost(name),
|
||||||
|
TCAPUser(name), m_handler(0)
|
||||||
|
{ }
|
||||||
|
virtual ~SigTCAPUser();
|
||||||
|
// { }
|
||||||
|
// Initialize the TCAP user
|
||||||
|
// Return false on failure
|
||||||
|
virtual bool initialize(NamedList& params);
|
||||||
|
virtual bool tcapRequest(NamedList& params);
|
||||||
|
virtual bool tcapIndication(NamedList& params);
|
||||||
|
// Return the status of this component
|
||||||
|
virtual void status(String& retVal);
|
||||||
|
protected:
|
||||||
|
TCAPMsgHandler* m_handler;
|
||||||
|
String m_tcapName;
|
||||||
|
virtual void destroyed();
|
||||||
|
};
|
||||||
|
|
||||||
|
class TCAPMsgHandler : public MessageHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TCAPMsgHandler(SigTCAPUser* user);
|
||||||
|
virtual bool received(Message& msg);
|
||||||
|
virtual void destruct();
|
||||||
|
private:
|
||||||
|
SigTCAPUser* m_user;
|
||||||
|
};
|
||||||
|
|
||||||
// Factory for locally configured components
|
// Factory for locally configured components
|
||||||
class SigFactory : public SignallingFactory
|
class SigFactory : public SignallingFactory
|
||||||
{
|
{
|
||||||
|
@ -567,6 +620,10 @@ public:
|
||||||
SigSS7M2PA = 0x21 | SigOnDemand,
|
SigSS7M2PA = 0x21 | SigOnDemand,
|
||||||
SigSS7M2UA = 0x22 | SigOnDemand,
|
SigSS7M2UA = 0x22 | SigOnDemand,
|
||||||
SigSS7M3UA = 0x23 | SigTopMost,
|
SigSS7M3UA = 0x23 | SigTopMost,
|
||||||
|
SigSS7TCAP = 0x24 | SigTopMost,
|
||||||
|
SigSS7TCAPANSI = 0x25 | SigTopMost,
|
||||||
|
SigSS7TCAPITU = 0x26 | SigTopMost,
|
||||||
|
SigTCAPUser = 0x27 | SigTopMost,
|
||||||
SigISDNIUAClient = 0x31 | SigDefaults,
|
SigISDNIUAClient = 0x31 | SigDefaults,
|
||||||
SigISDNIUAGateway = 0x32 | SigTopMost,
|
SigISDNIUAGateway = 0x32 | SigTopMost,
|
||||||
SigSS7M2UAClient = 0x33 | SigDefaults,
|
SigSS7M2UAClient = 0x33 | SigDefaults,
|
||||||
|
@ -817,6 +874,9 @@ const TokenDict SigFactory::s_compNames[] = {
|
||||||
{ "ss7-sccp-itu-mgm", SigSS7ItuSccpManagement },
|
{ "ss7-sccp-itu-mgm", SigSS7ItuSccpManagement },
|
||||||
{ "ss7-sccp-ansi-mgm",SigSS7AnsiSccpManagement },
|
{ "ss7-sccp-ansi-mgm",SigSS7AnsiSccpManagement },
|
||||||
{ "ss7-gtt", SigSccpGtt },
|
{ "ss7-gtt", SigSccpGtt },
|
||||||
|
{ "ss7-tcap-ansi", SigSS7TCAPANSI },
|
||||||
|
{ "ss7-tcap-itu", SigSS7TCAPITU },
|
||||||
|
{ "ss7-tcap-user", SigTCAPUser },
|
||||||
{ "isdn-pri-net", SigISDNPN },
|
{ "isdn-pri-net", SigISDNPN },
|
||||||
{ "isdn-bri-net", SigISDNBN },
|
{ "isdn-bri-net", SigISDNBN },
|
||||||
{ "isdn-pri-cpe", SigISDNPC },
|
{ "isdn-pri-cpe", SigISDNPC },
|
||||||
|
@ -855,6 +915,10 @@ const TokenDict SigFactory::s_compClass[] = {
|
||||||
MAKE_CLASS(SS7ItuSccpManagement),
|
MAKE_CLASS(SS7ItuSccpManagement),
|
||||||
MAKE_CLASS(SS7AnsiSccpManagement),
|
MAKE_CLASS(SS7AnsiSccpManagement),
|
||||||
MAKE_CLASS(SCCPUserDummy),
|
MAKE_CLASS(SCCPUserDummy),
|
||||||
|
MAKE_CLASS(SS7TCAP),
|
||||||
|
MAKE_CLASS(SS7TCAPANSI),
|
||||||
|
MAKE_CLASS(SS7TCAPITU),
|
||||||
|
MAKE_CLASS(TCAPUser),
|
||||||
MAKE_CLASS(ISDNPN),
|
MAKE_CLASS(ISDNPN),
|
||||||
MAKE_CLASS(ISDNBN),
|
MAKE_CLASS(ISDNBN),
|
||||||
MAKE_CLASS(ISDNPC),
|
MAKE_CLASS(ISDNPC),
|
||||||
|
@ -946,6 +1010,12 @@ SignallingComponent* SigFactory::create(const String& type, const NamedList& nam
|
||||||
return new SS7ItuSccpManagement(*config);
|
return new SS7ItuSccpManagement(*config);
|
||||||
case SigSS7AnsiSccpManagement:
|
case SigSS7AnsiSccpManagement:
|
||||||
return new SS7AnsiSccpManagement(*config);
|
return new SS7AnsiSccpManagement(*config);
|
||||||
|
case SigSS7TCAP:
|
||||||
|
if (ty) {
|
||||||
|
if (*ty == "ss7-tcap-ansi")
|
||||||
|
return new SS7TCAPANSI(*config);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2787,6 +2857,13 @@ bool SigDriver::initTopmost(NamedList& sect, int type)
|
||||||
case SigFactory::SigSccpGtt:
|
case SigFactory::SigSccpGtt:
|
||||||
topmost = new SigSccpGtt(sect);
|
topmost = new SigSccpGtt(sect);
|
||||||
break;
|
break;
|
||||||
|
case SigFactory::SigSS7TCAPANSI:
|
||||||
|
case SigFactory::SigSS7TCAPITU:
|
||||||
|
topmost = new SigSS7Tcap(sect);
|
||||||
|
break;
|
||||||
|
case SigFactory::SigTCAPUser:
|
||||||
|
topmost = new SigTCAPUser(sect);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -3882,6 +3959,118 @@ void SigIsdnMonitor::release()
|
||||||
XDebug(&plugin,DebugAll,"SigIsdnMonitor('%s'). Released [%p]",name().c_str(),this);
|
XDebug(&plugin,DebugAll,"SigIsdnMonitor('%s'). Released [%p]",name().c_str(),this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SigSS7Tcap
|
||||||
|
*/
|
||||||
|
void SigSS7Tcap::destroyed()
|
||||||
|
{
|
||||||
|
DDebug(&plugin,DebugAll,"SigSS7TCAP::destroyed() [%p]",this);
|
||||||
|
TelEngine::destruct(m_tcap);
|
||||||
|
SigTopmost::destroyed();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SigSS7Tcap::initialize(NamedList& params)
|
||||||
|
{
|
||||||
|
if (!m_tcap) {
|
||||||
|
String type = params.getValue("type","");
|
||||||
|
m_tcap = YSIGCREATE(SS7TCAP,¶ms);
|
||||||
|
if (m_tcap)
|
||||||
|
plugin.engine()->insert(m_tcap);
|
||||||
|
}
|
||||||
|
return m_tcap && m_tcap->initialize(¶ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SigSS7Tcap::status(String& retVal)
|
||||||
|
{
|
||||||
|
retVal << "type=" << (m_tcap ? m_tcap->componentType() : "");
|
||||||
|
NamedList p("");
|
||||||
|
m_tcap->status(p);
|
||||||
|
retVal << ",totalIncoming=" << p.getValue("totalIncoming","0");
|
||||||
|
retVal << ",totalOutgoing=" << p.getValue("totalOutgoing","0");
|
||||||
|
retVal << ",totalDiscarded=" << p.getValue("totalDiscarded","0");
|
||||||
|
retVal << ",totalNormal=" << p.getValue("totalNormal","0");
|
||||||
|
retVal << ",totalAbnormal=" << p.getValue("totalAbnormal","0");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SigTCAPUser
|
||||||
|
*/
|
||||||
|
SigTCAPUser::~SigTCAPUser()
|
||||||
|
{
|
||||||
|
DDebug(&plugin,DebugAll,"SigTCAPUser::~SigTCAPUser() [%p]",this);
|
||||||
|
if (!TelEngine::null(m_handler))
|
||||||
|
TelEngine::destruct(m_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SigTCAPUser::initialize(NamedList& params)
|
||||||
|
{
|
||||||
|
DDebug(&plugin,DebugAll,"SigTCAPUser::initialize() [%p]",this);
|
||||||
|
m_tcapName = params.getValue("tcap","");
|
||||||
|
if (!m_handler) {
|
||||||
|
m_handler = new TCAPMsgHandler(this);
|
||||||
|
Engine::install(m_handler);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SigTCAPUser::tcapRequest(NamedList& params)
|
||||||
|
{
|
||||||
|
if (!tcap()) {
|
||||||
|
SignallingComponent* tcap = 0;
|
||||||
|
if (!(tcap = plugin.engine()->find(m_tcapName,"SS7TCAP",tcap))) {
|
||||||
|
//TODO createTCAP ?
|
||||||
|
}
|
||||||
|
else
|
||||||
|
attach(YOBJECT(SS7TCAP,tcap));
|
||||||
|
}
|
||||||
|
if (tcap()) {
|
||||||
|
SS7TCAPError err = tcap()->userRequest(params);
|
||||||
|
return err.error() != SS7TCAPError::NoError;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SigTCAPUser::tcapIndication(NamedList& params)
|
||||||
|
{
|
||||||
|
Message msg("tcap.indication");
|
||||||
|
msg.copyParams(params);
|
||||||
|
return Engine::dispatch(&msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SigTCAPUser::status(String& retVal)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SigTCAPUser::destroyed()
|
||||||
|
{
|
||||||
|
DDebug(&plugin,DebugAll,"SigTCAPUser::destroyed() [%p]",this);
|
||||||
|
Engine::uninstall(m_handler);
|
||||||
|
attach(0);
|
||||||
|
SigTopmost::destroyed();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TCAPMsgHandler
|
||||||
|
*/
|
||||||
|
TCAPMsgHandler::TCAPMsgHandler(SigTCAPUser* user)
|
||||||
|
: MessageHandler("tcap.request"),
|
||||||
|
m_user(user)
|
||||||
|
{
|
||||||
|
DDebug(&plugin,DebugAll,"TCAPMsgHandler created [%p]",this);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCAPMsgHandler::received(Message& msg)
|
||||||
|
{
|
||||||
|
return (m_user && m_user->tcapRequest(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCAPMsgHandler::destruct()
|
||||||
|
{
|
||||||
|
DDebug(&plugin,DebugAll,"TCAPMsgHandler::destroyed() [%p]",this);
|
||||||
|
m_user = 0;
|
||||||
|
MessageHandler::destruct();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SigConsumerMux
|
* SigConsumerMux
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue