Fixed the alternate route detection algorithm.
Always recompute all views including itself as in alternate routing a notification may be sent back. git-svn-id: http://yate.null.ro/svn/yate/trunk@3750 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
parent
0796eb7010
commit
653e3e14a2
|
@ -1002,8 +1002,6 @@ void SS7Router::routeChanged(const SS7Route* route, SS7PointCode::Type type,
|
||||||
continue;
|
continue;
|
||||||
if (!((forced && onlyPC) || (*l3p)->operational()))
|
if (!((forced && onlyPC) || (*l3p)->operational()))
|
||||||
continue;
|
continue;
|
||||||
if (!(*l3p)->getRoutePriority(type,remotePC))
|
|
||||||
continue;
|
|
||||||
for (ObjList* v = l3p->view(type).skipNull(); v; v = v->skipNext()) {
|
for (ObjList* v = l3p->view(type).skipNull(); v; v = v->skipNext()) {
|
||||||
SS7Route* r = static_cast<SS7Route*>(v->get());
|
SS7Route* r = static_cast<SS7Route*>(v->get());
|
||||||
if (r->packed() != route->packed())
|
if (r->packed() != route->packed())
|
||||||
|
@ -1076,6 +1074,7 @@ SS7Route::State SS7Router::getRouteView(SS7PointCode::Type type, unsigned int pa
|
||||||
unsigned int routePrio = route ? route->priority() : (unsigned int)-1;
|
unsigned int routePrio = route ? route->priority() : (unsigned int)-1;
|
||||||
// combine all matching routes not on current network
|
// combine all matching routes not on current network
|
||||||
SS7Route::State best = SS7Route::Unknown;
|
SS7Route::State best = SS7Route::Unknown;
|
||||||
|
bool thisIsCurrent = (routeState & (SS7Route::NotProhibited|SS7Route::Unknown)) != 0;
|
||||||
for (ObjList* o = m_layer3.skipNull(); o; o = o->skipNext()) {
|
for (ObjList* o = m_layer3.skipNull(); o; o = o->skipNext()) {
|
||||||
SS7Layer3* l3 = *static_cast<L3ViewPtr*>(o->get());
|
SS7Layer3* l3 = *static_cast<L3ViewPtr*>(o->get());
|
||||||
if (!l3 || (l3 == network))
|
if (!l3 || (l3 == network))
|
||||||
|
@ -1090,16 +1089,12 @@ SS7Route::State SS7Router::getRouteView(SS7PointCode::Type type, unsigned int pa
|
||||||
DDebug(this,DebugAll,"Operational '%s' is load sharing with '%s'",
|
DDebug(this,DebugAll,"Operational '%s' is load sharing with '%s'",
|
||||||
l3->toString().c_str(),network->toString().c_str());
|
l3->toString().c_str(),network->toString().c_str());
|
||||||
best = SS7Route::Prohibited;
|
best = SS7Route::Prohibited;
|
||||||
break;
|
thisIsCurrent = false;
|
||||||
}
|
|
||||||
if ((r->priority() > routePrio) && (routeState & SS7Route::NotProhibited)) {
|
|
||||||
// alternate - current is not allowed to send through us
|
|
||||||
DDebug(this,DebugAll,"Operational '%s' is alternate to %s '%s'",
|
|
||||||
l3->toString().c_str(),SS7Route::stateName(routeState),network->toString().c_str());
|
|
||||||
best = SS7Route::Prohibited;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
state = r->state();
|
state = r->state();
|
||||||
|
if ((r->priority() < routePrio || SS7Route::Unknown == routeState) && (state & SS7Route::NotProhibited))
|
||||||
|
thisIsCurrent = false;
|
||||||
DDebug(this,DebugAll,"Operational '%s' contributed state %s",
|
DDebug(this,DebugAll,"Operational '%s' contributed state %s",
|
||||||
l3->toString().c_str(),SS7Route::stateName(state));
|
l3->toString().c_str(),SS7Route::stateName(state));
|
||||||
}
|
}
|
||||||
|
@ -1111,6 +1106,10 @@ SS7Route::State SS7Router::getRouteView(SS7PointCode::Type type, unsigned int pa
|
||||||
if ((state & SS7Route::KnownState) > (best & SS7Route::KnownState))
|
if ((state & SS7Route::KnownState) > (best & SS7Route::KnownState))
|
||||||
best = state;
|
best = state;
|
||||||
}
|
}
|
||||||
|
if (thisIsCurrent && (routePrio != (unsigned int)-1)) {
|
||||||
|
DDebug(this,DebugAll,"Route is current in an alternative set");
|
||||||
|
best = SS7Route::Prohibited;
|
||||||
|
}
|
||||||
DDebug(this,DebugInfo,"Route view of %u from %u%s%s: %s",
|
DDebug(this,DebugInfo,"Route view of %u from %u%s%s: %s",
|
||||||
packedPC,remotePC,(network ? " on " : ""),
|
packedPC,remotePC,(network ? " on " : ""),
|
||||||
(network ? network->toString().c_str() : ""),SS7Route::stateName(best));
|
(network ? network->toString().c_str() : ""),SS7Route::stateName(best));
|
||||||
|
@ -1495,15 +1494,15 @@ void SS7Router::clearRoutes(SS7Layer3* network, bool ok)
|
||||||
unsigned int adjacent = 0;
|
unsigned int adjacent = 0;
|
||||||
for (; l; l = l->skipNext()) {
|
for (; l; l = l->skipNext()) {
|
||||||
SS7Route* r = static_cast<SS7Route*>(l->get());
|
SS7Route* r = static_cast<SS7Route*>(l->get());
|
||||||
if (ok && (r->state() != SS7Route::Prohibited))
|
|
||||||
continue;
|
|
||||||
if (!r->priority())
|
if (!r->priority())
|
||||||
adjacent = r->packed();
|
adjacent = r->packed();
|
||||||
|
if (ok && (r->state() != SS7Route::Prohibited))
|
||||||
|
continue;
|
||||||
// if an adjacent node is operational but not in service we may have a chance
|
// if an adjacent node is operational but not in service we may have a chance
|
||||||
SS7Route::State state = (ok || !r->priority()) ? SS7Route::Unknown : SS7Route::Prohibited;
|
SS7Route::State state = (ok || !r->priority()) ? SS7Route::Unknown : SS7Route::Prohibited;
|
||||||
DDebug(DebugInfo,"Clearing route %u/%u of %s to %s",
|
DDebug(DebugInfo,"Clearing route %u/%u of %s by %u to %s",
|
||||||
r->packed(),r->priority(),network->toString().c_str(),
|
r->packed(),r->priority(),network->toString().c_str(),
|
||||||
SS7Route::stateName(state));
|
adjacent,SS7Route::stateName(state));
|
||||||
setRouteSpecificState(type,r->packed(),adjacent,state,network);
|
setRouteSpecificState(type,r->packed(),adjacent,state,network);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue