Added support for detecting event flood condition on ISUP and ISDN trunks.
git-svn-id: http://voip.null.ro/svn/yate@4435 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
parent
542e4d9056
commit
37845d2107
|
@ -26,6 +26,10 @@
|
||||||
; be sent through the signalling channel if any
|
; be sent through the signalling channel if any
|
||||||
;dtmfinband=no
|
;dtmfinband=no
|
||||||
|
|
||||||
|
; floodevents: int: How many events retrieved in a row trigger a flood warning
|
||||||
|
; Can be overridden in each ss7-isup, isdn-pri-... or isdn-bri-... section
|
||||||
|
;floodevents=20
|
||||||
|
|
||||||
; datafile: string: File to save/restore trunks data (circuits lock status)
|
; datafile: string: File to save/restore trunks data (circuits lock status)
|
||||||
; Defaults to ysigdata.conf located in current config directory
|
; Defaults to ysigdata.conf located in current config directory
|
||||||
; If set the file must contain the path (relative or absolute)
|
; If set the file must contain the path (relative or absolute)
|
||||||
|
@ -155,6 +159,10 @@
|
||||||
; If it fails the correct indication (no inband available) is signaled
|
; If it fails the correct indication (no inband available) is signaled
|
||||||
;ringback=no
|
;ringback=no
|
||||||
|
|
||||||
|
; floodevents: int: How many events retrieved in a row trigger a flood warning
|
||||||
|
; Default value is taken from the [general] section
|
||||||
|
;floodevents=20
|
||||||
|
|
||||||
; print-messages: boolean: Print decoded protocol data units to output
|
; print-messages: boolean: Print decoded protocol data units to output
|
||||||
; This option is applied on reload
|
; This option is applied on reload
|
||||||
; Defaults to no
|
; Defaults to no
|
||||||
|
@ -225,6 +233,10 @@
|
||||||
; Ignored if type is not isdn-pri-mon
|
; Ignored if type is not isdn-pri-mon
|
||||||
;idlevalue=255
|
;idlevalue=255
|
||||||
|
|
||||||
|
; floodevents: int: How many events retrieved in a row trigger a flood warning
|
||||||
|
; Default value is taken from the [general] section
|
||||||
|
;floodevents=20
|
||||||
|
|
||||||
; layer2dump-net: string: Filename to dump NET Q.921 packets to
|
; layer2dump-net: string: Filename to dump NET Q.921 packets to
|
||||||
;layer2dump-net=
|
;layer2dump-net=
|
||||||
|
|
||||||
|
@ -444,6 +456,10 @@
|
||||||
; Defaults to yes if pointcodetype is ANSI or ANSI8, no for other types
|
; Defaults to yes if pointcodetype is ANSI or ANSI8, no for other types
|
||||||
;duplicate-cgb=
|
;duplicate-cgb=
|
||||||
|
|
||||||
|
; floodevents: int: How many events retrieved in a row trigger a flood warning
|
||||||
|
; Default value is taken from the [general] section
|
||||||
|
;floodevents=20
|
||||||
|
|
||||||
; print-messages: boolean: Print decoded protocol data units to output
|
; print-messages: boolean: Print decoded protocol data units to output
|
||||||
; This option is applied on reload
|
; This option is applied on reload
|
||||||
; Defaults to no
|
; Defaults to no
|
||||||
|
|
|
@ -382,7 +382,7 @@ protected:
|
||||||
// Set trunk name and type. Append to plugin list
|
// Set trunk name and type. Append to plugin list
|
||||||
SigTrunk(const char* name, Type type);
|
SigTrunk(const char* name, Type type);
|
||||||
// Start worker thread. Set error on failure
|
// Start worker thread. Set error on failure
|
||||||
bool startThread(String& error, unsigned long sleepUsec);
|
bool startThread(String& error, unsigned long sleepUsec, int floodLimit);
|
||||||
// Create/Reload/Release data
|
// Create/Reload/Release data
|
||||||
virtual bool create(NamedList& params, String& error) { return false; }
|
virtual bool create(NamedList& params, String& error) { return false; }
|
||||||
virtual bool reload(NamedList& params) { return false; }
|
virtual bool reload(NamedList& params) { return false; }
|
||||||
|
@ -620,9 +620,10 @@ class SigTrunkThread : public Thread
|
||||||
{
|
{
|
||||||
friend class SigTrunk; // SigTrunk will set m_timeout when needded
|
friend class SigTrunk; // SigTrunk will set m_timeout when needded
|
||||||
public:
|
public:
|
||||||
inline SigTrunkThread(SigTrunk* trunk, unsigned long sleepUsec)
|
inline SigTrunkThread(SigTrunk* trunk, unsigned long sleepUsec, int floodLimit)
|
||||||
: Thread("YSIG Trunk"),
|
: Thread("YSIG Trunk"),
|
||||||
m_trunk(trunk), m_timeout(0), m_sleepUsec(sleepUsec)
|
m_trunk(trunk), m_timeout(0), m_sleepUsec(sleepUsec),
|
||||||
|
m_floodEvents(floodLimit)
|
||||||
{ }
|
{ }
|
||||||
virtual ~SigTrunkThread();
|
virtual ~SigTrunkThread();
|
||||||
virtual void run();
|
virtual void run();
|
||||||
|
@ -630,6 +631,7 @@ private:
|
||||||
SigTrunk* m_trunk;
|
SigTrunk* m_trunk;
|
||||||
u_int64_t m_timeout;
|
u_int64_t m_timeout;
|
||||||
unsigned long m_sleepUsec;
|
unsigned long m_sleepUsec;
|
||||||
|
int m_floodEvents;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -673,6 +675,7 @@ static SigFactory factory;
|
||||||
static SigNotifier s_notifier;
|
static SigNotifier s_notifier;
|
||||||
static Configuration s_cfg;
|
static Configuration s_cfg;
|
||||||
static const String s_noPrefixParams = "format,earlymedia";
|
static const String s_noPrefixParams = "format,earlymedia";
|
||||||
|
static int s_floodEvents = 20;
|
||||||
|
|
||||||
static const char s_miniHelp[] = "sigdump component [filename]";
|
static const char s_miniHelp[] = "sigdump component [filename]";
|
||||||
static const char s_fullHelp[] = "Command to dump signalling data to a file";
|
static const char s_fullHelp[] = "Command to dump signalling data to a file";
|
||||||
|
@ -2656,6 +2659,7 @@ void SigDriver::initialize()
|
||||||
s_cfg.load();
|
s_cfg.load();
|
||||||
m_dataFile = s_cfg.getValue("general","datafile",Engine::configFile("ysigdata"));
|
m_dataFile = s_cfg.getValue("general","datafile",Engine::configFile("ysigdata"));
|
||||||
Engine::self()->runParams().replaceParams(m_dataFile);
|
Engine::self()->runParams().replaceParams(m_dataFile);
|
||||||
|
s_floodEvents = s_cfg.getIntValue("general","floodevents",20);
|
||||||
// Startup
|
// Startup
|
||||||
if (!m_engine) {
|
if (!m_engine) {
|
||||||
setup();
|
setup();
|
||||||
|
@ -2935,11 +2939,11 @@ void SigTrunk::cleanup()
|
||||||
release();
|
release();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SigTrunk::startThread(String& error, unsigned long sleepUsec)
|
bool SigTrunk::startThread(String& error, unsigned long sleepUsec, int floodLimit)
|
||||||
{
|
{
|
||||||
if (!m_thread) {
|
if (!m_thread) {
|
||||||
if (m_controller)
|
if (m_controller)
|
||||||
m_thread = new SigTrunkThread(this,sleepUsec);
|
m_thread = new SigTrunkThread(this,sleepUsec,floodLimit);
|
||||||
else {
|
else {
|
||||||
Debug(&plugin,DebugNote,
|
Debug(&plugin,DebugNote,
|
||||||
"Trunk('%s'). No worker thread for trunk without call controller [%p]",
|
"Trunk('%s'). No worker thread for trunk without call controller [%p]",
|
||||||
|
@ -3088,7 +3092,8 @@ bool SigSS7Isup::create(NamedList& params, String& error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start thread
|
// Start thread
|
||||||
if (!startThread(error,plugin.engine()->tickDefault()))
|
if (!startThread(error,plugin.engine()->tickDefault(),
|
||||||
|
params.getIntValue("floodevents",s_floodEvents)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -3262,7 +3267,8 @@ bool SigIsdn::create(NamedList& params, String& error)
|
||||||
q931()->initialize(¶ms);
|
q931()->initialize(¶ms);
|
||||||
|
|
||||||
// Start thread
|
// Start thread
|
||||||
if (!startThread(error,plugin.engine()->tickDefault()))
|
if (!startThread(error,plugin.engine()->tickDefault(),
|
||||||
|
params.getIntValue("floodevents",s_floodEvents)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -3499,7 +3505,8 @@ bool SigIsdnMonitor::create(NamedList& params, String& error)
|
||||||
q931()->attach(groupCpe,false);
|
q931()->attach(groupCpe,false);
|
||||||
|
|
||||||
// Start thread
|
// Start thread
|
||||||
if (!startThread(error,plugin.engine()->tickDefault()))
|
if (!startThread(error,plugin.engine()->tickDefault(),
|
||||||
|
params.getIntValue("floodevents",s_floodEvents)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (debugAt(DebugInfo)) {
|
if (debugAt(DebugInfo)) {
|
||||||
|
@ -4013,6 +4020,7 @@ void SigTrunkThread::run()
|
||||||
return;
|
return;
|
||||||
DDebug(&plugin,DebugAll,"%s is running for trunk '%s' [%p]",
|
DDebug(&plugin,DebugAll,"%s is running for trunk '%s' [%p]",
|
||||||
name(),m_trunk->name().c_str(),this);
|
name(),m_trunk->name().c_str(),this);
|
||||||
|
int evCount = 0;
|
||||||
SignallingEvent* event = 0;
|
SignallingEvent* event = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (!event)
|
if (!event)
|
||||||
|
@ -4022,11 +4030,26 @@ void SigTrunkThread::run()
|
||||||
Time time;
|
Time time;
|
||||||
event = m_trunk->controller()->getEvent(time);
|
event = m_trunk->controller()->getEvent(time);
|
||||||
if (event) {
|
if (event) {
|
||||||
XDebug(&plugin,DebugAll,"Trunk('%s'). Got event (%p,'%s',%p,%u)",
|
evCount++;
|
||||||
m_trunk->name().c_str(),event,event->name(),event->call(),
|
XDebug(&plugin,DebugAll,"Trunk('%s'). Got event #%d (%p,'%s',%p,%u)",
|
||||||
|
m_trunk->name().c_str(),evCount,
|
||||||
|
event,event->name(),event->call(),
|
||||||
event->call()?event->call()->refcount():0);
|
event->call()?event->call()->refcount():0);
|
||||||
m_trunk->handleEvent(event);
|
m_trunk->handleEvent(event);
|
||||||
delete event;
|
delete event;
|
||||||
|
if (evCount == m_floodEvents)
|
||||||
|
Debug(&plugin,DebugMild,"Trunk('%s') flooded: %d handled events",
|
||||||
|
m_trunk->name().c_str(),evCount);
|
||||||
|
else if ((evCount % m_floodEvents) == 0)
|
||||||
|
Debug(&plugin,DebugWarn,"Trunk('%s') severe flood: %d events",
|
||||||
|
m_trunk->name().c_str(),evCount);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#ifdef XDEBUG
|
||||||
|
if (evCount)
|
||||||
|
Debug(&plugin,DebugAll,"Trunk('%s'). Got no event",m_trunk->name().c_str());
|
||||||
|
#endif
|
||||||
|
evCount = 0;
|
||||||
}
|
}
|
||||||
// Check timeout if waiting to terminate
|
// Check timeout if waiting to terminate
|
||||||
if (m_timeout && time.msec() > m_timeout) {
|
if (m_timeout && time.msec() > m_timeout) {
|
||||||
|
|
Loading…
Reference in New Issue