diff --git a/libs/ysig/isup.cpp b/libs/ysig/isup.cpp index aabf6ca7..102ab827 100644 --- a/libs/ysig/isup.cpp +++ b/libs/ysig/isup.cpp @@ -3816,32 +3816,33 @@ bool SS7ISUP::control(NamedList& params) // Process a notification generated by the attached network layer void SS7ISUP::notify(SS7Layer3* link, int sls) { - if (!link) + if (!(link && network())) return; Lock mylock(this); - // Ignore links not routing our remote point code - if (!m_remotePoint) - return; - if ((unsigned int)-1 == link->getRoutePriority(m_type,m_remotePoint->pack(m_type))) - return; + SS7Route::State state = m_remotePoint ? + network()->getRouteState(m_type,*m_remotePoint) : SS7Route::Unknown; bool linkTmp = m_l3LinkUp; + bool partAvail = m_userPartAvail; // Copy linkset operational state - m_l3LinkUp = link->operational(); + m_l3LinkUp = network()->operational(); // Reset remote user part's availability state if supported // Force UPT re-send - if (m_uptTimer.interval() && !m_l3LinkUp) { + if (m_uptTimer.interval() && (!m_l3LinkUp || (SS7Route::Prohibited == state))) { m_uptTimer.stop(); m_userPartAvail = false; } Debug(this,DebugInfo, - "L3 (%p,'%s') is %soperational sls=%d. Remote User Part is %savailable", - link,link->toString().safe(), - (m_l3LinkUp ? "" : "not "),sls, + "L3 '%s' sls=%d is %soperational.%s Route is %s. Remote User Part is %savailable", + link->toString().safe(),sls, + (link->operational() ? "" : "not "), + (network() == link ? "" : (m_l3LinkUp ? " L3 is up." : " L3 is down.")), + SS7Route::stateName(state), (m_userPartAvail ? "" : "un")); - if (linkTmp != m_l3LinkUp) { + if (linkTmp != m_l3LinkUp || partAvail != m_userPartAvail) { NamedList params(""); params.addParam("type","trunk"); params.addParam("operational",String::boolText(m_l3LinkUp)); + params.addParam("available",String::boolText(m_userPartAvail)); params.addParam("from",link->toString()); engine()->notify(this,params); }