Fixed the component name matching in control operations.
Implemented control of MTP3 with notification to Layer 4 about operational changes caused by management inhibiting. git-svn-id: http://yate.null.ro/svn/yate/trunk@2807 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
parent
a695b1e0e8
commit
ed4762b3f7
|
@ -194,11 +194,11 @@ bool SS7Layer2::control(NamedList& params)
|
||||||
{
|
{
|
||||||
String* ret = params.getParam("completion");
|
String* ret = params.getParam("completion");
|
||||||
const String* oper = params.getParam("operation");
|
const String* oper = params.getParam("operation");
|
||||||
|
const char* cmp = params.getValue("component");
|
||||||
int cmd = oper ? oper->toInteger(s_dict_control,-1) : -1;
|
int cmd = oper ? oper->toInteger(s_dict_control,-1) : -1;
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (oper && (cmd < 0))
|
if (oper && (cmd < 0))
|
||||||
return false;
|
return false;
|
||||||
const char* cmp = params.getValue("component");
|
|
||||||
String part = params.getValue("partword");
|
String part = params.getValue("partword");
|
||||||
if (cmp) {
|
if (cmp) {
|
||||||
if (toString() != cmp)
|
if (toString() != cmp)
|
||||||
|
@ -209,6 +209,8 @@ bool SS7Layer2::control(NamedList& params)
|
||||||
}
|
}
|
||||||
return Module::itemComplete(*ret,toString(),part);
|
return Module::itemComplete(*ret,toString(),part);
|
||||||
}
|
}
|
||||||
|
if (!(cmp && toString() == cmp))
|
||||||
|
return false;
|
||||||
return (cmd >= 0) && control((Operation)cmd,¶ms);
|
return (cmd >= 0) && control((Operation)cmd,¶ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,12 +23,18 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "yatesig.h"
|
#include "yatesig.h"
|
||||||
|
#include <yatephone.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace TelEngine;
|
using namespace TelEngine;
|
||||||
|
|
||||||
|
static const TokenDict s_dict_control[] = {
|
||||||
|
{ "pause", SS7MTP3::Pause },
|
||||||
|
{ "resume", SS7MTP3::Resume },
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
typedef GenPointer<SS7Layer2> L2Pointer;
|
typedef GenPointer<SS7Layer2> L2Pointer;
|
||||||
|
|
||||||
void SS7L3User::notify(SS7Layer3* network, int sls)
|
void SS7L3User::notify(SS7Layer3* network, int sls)
|
||||||
|
@ -341,7 +347,7 @@ SS7MTP3::SS7MTP3(const NamedList& params)
|
||||||
: SignallingComponent(params.safe("SS7MTP3"),¶ms),
|
: SignallingComponent(params.safe("SS7MTP3"),¶ms),
|
||||||
SignallingDumpable(SignallingDumper::Mtp3),
|
SignallingDumpable(SignallingDumper::Mtp3),
|
||||||
Mutex(true,"SS7MTP3"),
|
Mutex(true,"SS7MTP3"),
|
||||||
m_total(0), m_active(0)
|
m_total(0), m_active(0), m_inhibit(false)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (debugAt(DebugAll)) {
|
if (debugAt(DebugAll)) {
|
||||||
|
@ -410,6 +416,8 @@ unsigned int SS7MTP3::countLinks()
|
||||||
|
|
||||||
bool SS7MTP3::operational(int sls) const
|
bool SS7MTP3::operational(int sls) const
|
||||||
{
|
{
|
||||||
|
if (m_inhibit)
|
||||||
|
return false;
|
||||||
if (sls < 0)
|
if (sls < 0)
|
||||||
return (m_active != 0);
|
return (m_active != 0);
|
||||||
const ObjList* l = &m_links;
|
const ObjList* l = &m_links;
|
||||||
|
@ -479,6 +487,56 @@ void SS7MTP3::detach(SS7Layer2* link)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SS7MTP3::control(Operation oper, NamedList* params)
|
||||||
|
{
|
||||||
|
bool ok = operational();
|
||||||
|
switch (oper) {
|
||||||
|
case Pause:
|
||||||
|
if (!m_inhibit) {
|
||||||
|
m_inhibit = true;
|
||||||
|
if (ok)
|
||||||
|
SS7Layer3::notify(-1);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
case Resume:
|
||||||
|
if (m_inhibit) {
|
||||||
|
m_inhibit = false;
|
||||||
|
if (ok != operational())
|
||||||
|
SS7Layer3::notify(-1);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
case Status:
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SS7MTP3::control(NamedList& params)
|
||||||
|
{
|
||||||
|
String* ret = params.getParam("completion");
|
||||||
|
const String* oper = params.getParam("operation");
|
||||||
|
const char* cmp = params.getValue("component");
|
||||||
|
int cmd = oper ? oper->toInteger(s_dict_control,-1) : -1;
|
||||||
|
if (ret) {
|
||||||
|
if (oper && (cmd < 0))
|
||||||
|
return false;
|
||||||
|
String part = params.getValue("partword");
|
||||||
|
if (cmp) {
|
||||||
|
if (toString() != cmp)
|
||||||
|
return false;
|
||||||
|
for (const TokenDict* d = s_dict_control; d->token; d++)
|
||||||
|
Module::itemComplete(*ret,d->token,part);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return Module::itemComplete(*ret,toString(),part);
|
||||||
|
}
|
||||||
|
if (!(cmp && toString() == cmp))
|
||||||
|
return false;
|
||||||
|
if (cmd >= 0)
|
||||||
|
return control((Operation)cmd,¶ms);
|
||||||
|
return SignallingDumpable::control(params,this);
|
||||||
|
}
|
||||||
|
|
||||||
// Configure and initialize MTP3 and its links
|
// Configure and initialize MTP3 and its links
|
||||||
bool SS7MTP3::initialize(const NamedList* config)
|
bool SS7MTP3::initialize(const NamedList* config)
|
||||||
{
|
{
|
||||||
|
|
|
@ -4903,6 +4903,18 @@ class YSIG_API SS7MTP3 : public SS7Layer3, public SS7L2User, public SignallingDu
|
||||||
{
|
{
|
||||||
YCLASS(SS7MTP3,SS7Layer3)
|
YCLASS(SS7MTP3,SS7Layer3)
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* Control primitives
|
||||||
|
*/
|
||||||
|
enum Operation {
|
||||||
|
// take linkset out of service
|
||||||
|
Pause = 0x100,
|
||||||
|
// start linkset operation
|
||||||
|
Resume = 0x200,
|
||||||
|
// get operational status
|
||||||
|
Status = 0x400,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
* @param params Layer's parameters
|
* @param params Layer's parameters
|
||||||
|
@ -4937,6 +4949,15 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual bool operational(int sls = -1) const;
|
virtual bool operational(int sls = -1) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute a control operation on the linkset
|
||||||
|
* @param oper Operation to execute
|
||||||
|
* @param params Optional parameters for the operation
|
||||||
|
* @return True if the command completed successfully, for query operations
|
||||||
|
* also indicates the linkset is enabled and operational
|
||||||
|
*/
|
||||||
|
virtual bool control(Operation oper, NamedList* params = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attach a SS7 Layer 2 (data link) to the network transport. Attach itself to the link
|
* Attach a SS7 Layer 2 (data link) to the network transport. Attach itself to the link
|
||||||
* @param link Pointer to data link to attach
|
* @param link Pointer to data link to attach
|
||||||
|
@ -4949,6 +4970,13 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void detach(SS7Layer2* link);
|
virtual void detach(SS7Layer2* link);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query or modify layer's settings or operational parameters
|
||||||
|
* @param params The list of parameters to query or change
|
||||||
|
* @return True if the control operation was executed
|
||||||
|
*/
|
||||||
|
virtual bool control(NamedList& params);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the total number of links attached
|
* Get the total number of links attached
|
||||||
* @return Number of attached data links
|
* @return Number of attached data links
|
||||||
|
@ -4992,13 +5020,13 @@ protected:
|
||||||
unsigned int countLinks();
|
unsigned int countLinks();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual bool control(NamedList& params)
|
|
||||||
{ return SignallingDumpable::control(params,this); }
|
|
||||||
ObjList m_links;
|
ObjList m_links;
|
||||||
// total links in linkset
|
// total links in linkset
|
||||||
unsigned int m_total;
|
unsigned int m_total;
|
||||||
// currently active links
|
// currently active links
|
||||||
unsigned int m_active;
|
unsigned int m_active;
|
||||||
|
// inhibited flag
|
||||||
|
bool m_inhibit;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue