OpenSS7 SS7 for the Common Man |
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |
||||||||||||||||||||||||||
Home | Overview | Status | News | Documentation | Resources | About | |||||||||||||||||||||
File /code/strss7/drivers/slsi/sls_tlac.h#ident "@(#) $Id: sls_tlac.h,v 0.8.2.1 2002/10/18 02:40:38 brian Exp $" #ifndef __SLS_TLAC_H__ #define __SLS_TLAC_H__ static inline void lk_mgmt_inhibit_denied(lk_t * lk); static inline void lk_mgmt_link_inhibited(lk_t * lk); static inline void lk_mgmt_uninhibiting_not_possible(lk_t * lk); static inline void lk_mgmt_link_uninhibited(lk_t * lk); static inline void lk_hmrt_inhibit_denied(lk_t * lk); static inline void lk_hmrt_inhibit_signalling_link(lk_t * lk); static inline void lk_hmrt_inhibit_ack(lk_t * lk); static inline void lk_hmrt_emergency_changeover_acknowledgement(lk_t * lk); static inline void lk_hmrt_unihibit_signalling_link(lk_t * lk); static inline void lk_hmrt_unihibit_acknowledgement(lk_t * lk); static inline void lk_hmrt_force_unihibit_signalling_link(lk_t * lk); static inline void lk_hmrt_local_inhibit_test(lk_t * lk); static inline void lk_hmrt_remote_inhibit_test(lk_t * lk); static inline void lk_tsrc_remote_inhibit_request(lk_t * lk); static inline void lk_tsrc_local_inhibit_request(lk_t * lk); static inline void lk_tsrc_link_inhibited(lk_t * lk); static inline void lk_tsrc_signalling_link_unavailable(lk_t * lk); static inline void lk_tsrc_link_in_service_at_level_2(lk_t * lk); static inline void lk_tscr_unihibit_request(lk_t * lk); static inline void lk_tsrc_cancel_link_inhibited(lk_t * lk); static inline void lk_tcoc_signalling_link_unavailable(lk_t * lk); static inline void lk_tcoc_changeover_order(lk_t * lk); static inline void lk_tcoc_emergency_changeover_order(lk_t * lk); static inline void lk_tcbc_signalling_link_available(lk_t * lk); static inline void lk_lsac_changeover_order_received(lk_t * lk); static inline void lk_lsac_local_processor_outage(lk_t * lk); /* national option */ static inline void lk_lsac_continue(lk_t * lk); static inline void lk_lsac_flush_buffers(lk_t * lk); /* * Signalling Traffic Management (STM) * * Link Availability Control (TLAC) Figure 28/Q.704 */ static inline void lk_tlac_remote_inhibit_denied(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk_hmrt_inhibit_denied(lk); break; } } static inline void lk_t22_timeout(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: break; case LK_STATE_UNAVAILABLE: if (lk->statem.locally_inhibited) { lk_hmrt_local_inhibit_test(lk); lk_timer_start(t22); } break; } } static inline void lk_tlac_remote_inhibit_signalling_link(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk_tsrc_remote_inhibit_request(lk); break; case LK_STATE_UNAVAILABLE: if (lk->statem.remotely_inhibited) { lk_hmrt_inhibit_ack(lk); } else { lk->statem.remotely_inhibited = 0; lk_hmrt_inhibit_ack(lk); lk_tsrc_link_inhibited(lk); lk_timer_start(t22); } break; } } static inline void lk_t14_timeout(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: case LK_STATE_UNAVAILABLE: lk->statem.local_inhibit_in_progress = 0; lk_tsrc_local_inhibit_request(lk); break; } } static inline void lk_tlac_local_inhibit_signalling_link(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: case LK_STATE_UNAVAILABLE: lk_tsrc_local_inhibit_request(lk); break; } } static inline void lk_tlac_local_inhibit_allowed(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: case LK_STATE_UNAVAILABLE: lk_hmrt_inhibit_signalling_link(lk); lk->statem.local_inhibit_in_progress = 1; lk_timer_start(t14); break; } } static inline void lk_tlac_local_inhibit_denied(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: case LK_STATE_UNAVAILABLE: lk_mgmt_inhibit_denied(lk); break; } } static inline void lk_tlac_remote_inhibit_denied(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk_mgmt_inhibit_denied(lk); lk->statem.local_inhibit_in_progress = 0; lk_timer_stop(t14); break; } } static inline void __lk_tlac_changeover(lk_t * lk) { if (lk->statem.changeback_in_progress) { lk->statem.unavailable = 1; lk_tsrc_signalling_link_unavailable(lk); } else { lk_tcoc_signalling_link_unavailable(lk); lk_tsrc_signalling_link_unavailable(lk); lk->statem.changeover_in_progress = 1; } lk->statem.tlac_state = LK_STATE_UNAVAILABLE; } static inline void lk_tlac_inhibit_ack(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: if (lk->statem.local_inhibit_in_progress) { lk->statem.locally_inhibited = 1; lk->statem.local_inhibit_in_progress = 0; lk_timer_stop(t14); lk_tsrc_link_inhibited(lk); lk_mgmt_link_inhibited(lk); lk_timer_start(t22); __lk_tlac_changeover(lk); } break; case LK_STATE_UNAVAILABLE: if (lk->statem.local_inhibit_in_progress) { lk->statem.locally_inhibited = 1; lk_tsrc_link_inhibited(lk); lk_mgmt_link_inhibited(lk); lk_timer_stop(t14); lk_timer_start(t22); } break; } } static inline void lk_t23_timeout(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: break; case LK_STATE_UNAVAILABLE: if (lk->statem.remotely_inhibited) { lk_hmrt_remote_inhibit_test(lk); lk_timer_start(t23); } break; } } static inline void lk_tlac_remote_inhibit_allowed(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk->statem.remotely_inhibited = 1; lk_hmrt_inhibit_ack(lk); lk_tsrc_link_inhibited(lk); lk_mgmt_link_inhibited(lk); lk_timer_start(t23); __lk_tlac_changeover(lk); break; } } static inline void lk_tlac_local_processor_outage(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk->statem.local_blocked = 1; __lk_tlac_changeover(lk); break; case LK_STATE_UNAVAILABLE: lk->statem.local_blocked = 1; lk->statem.failed = 0; break; } } static inline void lk_tlac_signalling_link_failed(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk->statem.failed = 1; __lk_tlac_changeover(lk); break; case LK_STATE_UNAVAILABLE: lk->statem.failed = 1; lk->statem.local_blocked = 0; lk->statem.remote_blocked = 0; lk_timer_stop(t24); /* national option */ break; case LK_STATE_SP_RESTARTING: lk->statem.failed = 1; lk->statem.unavailable = 1; lk_tsrc_signalling_link_unavailable(lk); lk_tcoc_signalling_link_unavailable(lk); lk_tprc_signalling_link_unavailable(lk); break; } } static inline void lk_tlac_remote_processor_outage(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk->statem.remote_blocked = 1; lk_lsac_local_processor_outage(lk); /* national option */ __lk_tlac_changeover(lk); break; case LK_STATE_UNAVAILABLE: lk->statem.remote_blocked = 1; lk->statem.failed = 0; break; case LK_STATE_SP_RESTARTING: lk->statem.remote_blocked = 1; lk->statem.unavailable = 1; lk_tsrc_signalling_link_unavailable(lk); lk_tcoc_signalling_link_unavailable(lk); lk_tprc_signalling_link_unavailable(lk); break; } } static inline void lk_tlac_remote_processor_recovered(lk_t * lk) { /* national option */ switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: #if national_option lk->statem.remote_blocked = 0; if (lk->timers.t24) { /* t24 is running */ if (lk->statem.changeover_in_progress) lk_tcoc_signalling_link_available(lk); else { lk_tcbc_signalling_link_available(lk); lk->statem.changeback_in_progress = 1; lk_lsac_signalling_link_available(lk); lk->statem.tlac_state = LK_STATE_AVAILABLE; } } #else lk->statem.remote_blocked = 0; if (!lk->statem.local_blocked) { if (lk->statem.changeover_in_progress) lk_lsac_continue(lk); else lk_lsac_flush_buffers(lk); } #endif break; case LK_STATE_SP_RESTARTING: lk->statem.remote_blocked = 0; lk->statem.unavailable = 0; lk_tsrc_signalling_link_available(lk); lk_tprc_signalling_link_unavailable(lk); break; } } static inline void lk_tlac_local_processor_recovered(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: lk->statem.local_blocked = 0; if (!lk->statem.remote_blocked) { #if national_option #else if (lk->statem.changeover_in_progress) lk_lsac_continue(lk); else lk_lsac_flush_buffers(lk); #endif if (!lk->statem.locally_inhibited && !lk->statem.remotely_inhibited) { if (lk->statem.changeover_in_progress) { lk_tcoc_signalling_link_available(lk); } else { lk_tcbc_signalling_link_available(lk); lk->statem.changeback_in_progress = 1; #if national_option lk_lsac_signalling_link_available(lk); #else lk_tsrc_signalling_link_available(lk); #endif lk->statem.tlac_state = LK_STATE_AVAILABLE; } } } break; } } static inline void lk_tlac_changeover_order(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk->statem.failed = 1; lk_lsac_changeover_order_received(lk); if (lk->statem.changeback_in_progress) { lk->statem.changeover_order = 1; lk_tsrc_signalling_link_unavailable(lk); } else { lk_tcoc_changeover_order(lk); lk->statem.changeover_in_progress = 1; } lk->statem.tlac_state = LK_STATE_UNAVAILABLE; break; case LK_STATE_UNAVAILABLE: if (lk->statem.changeover_in_progress) lk_tcoc_changeover_order(lk); else lk_hmrt_emergency_changeover_acknowledgement(lk); break; } } static inline void lk_tlac_changeback_terminated(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk->statem.changeback_in_progress = 0; lk->statem.tlac_state = LK_STATE_AVAILABLE; break; case LK_STATE_UNAVAILABLE: lk->statem.changeback_in_progress = 0; if (lk->statem.changeover_order) lk_tcoc_changeover_order(lk); else if (lk->statem.emergency_changeover_order) lk_tcoc_emergency_changeover_order(lk); else if (lk->statem.unavailable) lk_tcoc_signalling_link_unavailable(lk); lk->statem.unavailable = 0; lk->statem.emergency_changeover_order = 0; lk->statem.changeover_order = 0; lk->statem.changeover_in_progress = 1; lk->statem.tlac_state = LK_STATE_UNAVAILABLE; break; } } static inline void lk_tlac_emergency_changeover_order(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk->statem.failed = 1; lk_lsac_changeover_order_received(lk); if (lk->statem.changeback_in_progress) { lk->statem.emergency_changeover_order = 1; lk_tsrc_signalling_link_unavailable(lk); } else { lk_tcoc_emergency_changeover_order(lk); lk->statem.changeover_in_progress = 1; } lk->statem.tlac_state = LK_STATE_UNAVAILABLE; break; case LK_STATE_UNAVAILABLE: if (lk->statem.changeover_in_progress) lk_tcoc_emergency_changeover_order(lk); else lk_hmrt_emergency_changeover_acknowledgement(lk); break; } } static inline void lk_tlac_signalling_link_in_service(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: lk->statem.failed = 0; lk_timer_stop(t24); /* national option */ if (!lk->statem.locally_inhibited && !lk->statem.remotely_inhibited) { if (lk->statem.changeover_in_progress) { lk_tcoc_signalling_link_available(lk); } else { lk_tcbc_signalling_link_available(lk); lk->statem.changeback_in_progress = 1; #if national_option lk_lsac_signalling_link_available(lk); #else lk_tsrc_signalling_link_available(lk); #endif lk->statem.tlac_state = LK_STATE_AVAILABLE; } } break; case LK_STATE_SP_RESTARTING: lk->statem.failed = 0; lk->statem.unavailable = 0; lk_tsrc_signalling_link_available(lk); lk_tprc_signalling_link_unavailable(lk); break; } } static inline void lk_tlac_link_in_service_at_level_2(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: case LK_STATE_SP_RESTARTING: lk_tsrc_link_in_service_at_level_2(lk); break; } } static inline void lk_tlac_changeover_not_required(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: lk->statem.changeover_in_progress = 0; #if national_option lk_lsac_signalling_link_available(lk); #else lk_tsrc_signalling_link_available(lk); #endif lk->statem.tlac_state = LK_STATE_AVAILABLE; break; } } #if national_option static inline void lk_t24_timeout(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: if (!lk->statem.locally_inhibited && !lk->statem.remotely_inhibited && !lk->statem.failed && !lk->statem.local_blocked && !lk->statem.remote_blocked) { if (lk->statem.changeback_required) { lk_tcbc_signalling_link_available(lk); lk->statem.changeback_in_progress = 1; lk_lsac_signalling_link_available(lk); } else { lk_lsac_signalling_link_availabled(lk); } lk->statem.tlac_state = LK_STATE_AVAILABLE; } break; } } #endif static inline void lk_tlac_changeover_executed(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: lk->statem.changeover_in_progress = 0; #if national_option lk_lsac_local_processor_recovered(lk); lk_timer_start(t24); lk->statem.changeback_required = 1; #else if (!lk->statem.locally_inhibited && !lk->statem.remotely_inhibited && !(lk->statem.failed && lk->statem.local_blocked) && !(lk->statem.failed && lk->statem.remote_blocked)) { lk_tcbc_signalling_link_available(lk); lk->statem.changeback_in_progress = 1; lk_tsrc_signalling_link_available(lk); lk->statem.tlac_state = LK_STATE_AVAILABLE; } #endif break; } } static inline void lk_t12_timeout(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: lk->statem.unihibit_in_progress = 0; if (lk->statem.second_time_t12_expires) { lk_mgmt_unihibit_not_possible(lk); break; } else { lk->statem.second_time_t12_expires = 1; if (lk->statem.management_request) { lk_tscr_unihibit_request(lk); } else { lk_hmrt_unihibit_signalling_link(lk); lk->statem.unihibit_in_progress = 1; lk_timer_start(t12); } } break; } } static inline void lk_tlac_uninhibiting_not_possible(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: if (lk->statem.failed || lk->statem.local_blocked || lk->statem.remote_blocked) { lk_mgmt_uninhibiting_not_possible(lk); lk->statem.management_request = 0; } else { lk_hmrt_unihibit_signalling_link(lk); lk->statem.uninhibit_in_progress = 1; lk_timer_start(t12); } break; } } static inline void lk_tlac_uninhibiting_possible(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: lk_hmrt_uninhibit_signalling_link(lk); lk->statem.unihibit_in_progress = 1; lk_timer_start(t12); break; } } static inline void lk_tlac_force_unihibit_signalling_link(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk_hmrt_unihibit_signalling_link(lk); break; case LK_STATE_UNAVAILABLE: if (lk->statem.locally_inhibited || lk->statem.remotely_inhibited) { lk_hmrt_unihibit_signalling_link(lk); lk->statem.unihibit_in_progress(lk); lk_timer_start(t12); } else { lk_hmrt_unihibit_signalling_link(lk); } break; } } static inline void lk_tlac_local_unihibit_signalling_link(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: lk->statem.management_request = 1; lk_tsrc_unihibit_request(lk); break; } } static inline void lk_tlac_remote_unihibit_signalling_link(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: if (lk->statem.locally_inhibited || lk->statem.remotely_inhibited) { lk->statem.remotely_inhibited = 0; lk_hmrt_unihibit_acknowledgement(lk); lk_timeout_stop(t13); lk->statem.second_time_t13_expires = 0; if (!lk->statem.locally_inhibited) { lk_tsrc_cancel_link_inhibited(lk); if (!lk->statem.failed && !lk->statem.local_blocked && !lk->statem.remote_blocked) { if (lk->statem.changeover_in_progress) { lk_tcoc_signalling_link_available(lk); } else { lk_tcbc_signalling_link_available(lk); lk->statem.changeback_in_progress = 1; #if national_option lk_lsac_signalling_link_available(lk); #else lk_tsrc_signalling_link_available(lk); #endif lk->statem.tlac_state = LK_STATE_AVAILABLE; } } } } else { lk_hmrt_unihibit_acknowledgement(lk); } break; } } static inline void lk_t13_timeout(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: if (lk->statem.second_time_t13_expires) { } else { lk->statem.second_time_t13_expires = 1; lk_hmrt_force_unihibit_signalling_link(lk); lk_timer_start(t13); } break; } } static inline void lk_tlac_uninhibit_signalling_link(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk_hmrt_uninhibit_ack(lk); break; case LK_STATE_UNAVAILABLE: if (lk->statem.failed || lk->statem.local_blocked || lk->statem.remote_blocked) { if (lk->statem.locally_inhibited) { lk_hmrt_unihibit_signalling_link(lk); lk_timer_start(t12); if (lk->statem.remoted_inhibited) { lk_hmrt_force_unihibit_signalling_link(lk); lk_timer_start(t13); } } break; } } } static inline void lk_tlac_unihibit_ack(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_UNAVAILABLE: if (lk->statem.unihibit_in_progress) { lk->statem.locally_inhibited = 0; lk->statem.management_request = 0; lk_mgmt_link_uninhibited(lk); lk->statem.unihibit_in_progress = 0; lk_timer_stop(t12); lk->statem.second_time_t12_expires = 0; if (!lk->statem.remotely_inhibited) { lk_tsrc_cancel_link_inhibited(lk); if (!lk->statem.failed && !lk->statem.local_blocked && !lk->statem.remote_blocked) { if (lk->statem.changeover_in_progress) { lk_tcoc_signalling_link_available(lk); } else { lk_tcbc_signalling_link_available(lk); lk->statem.changeback_in_progress = 1; #if national_option lk_lsac_signalling_link_available(lk); #else lk_tsrc_signalling_link_available(lk); #endif lk->statem.tlac_state = LK_STATE_AVAILABLE; } } } } break; } } static inline void lk_tlac_unihibit_ack(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: break; } } static inline void lk_tlac_local_inhibit_test(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk_hmrt_force_uninhibit_signalling_link(lk); lk_timer_start(t13); break; case LK_STATE_UNAVAILABLE: if (!lk->statem.remotely_inhibited) { lk_hmrt_force_uninhibit_signalling_link(lk); lk_timer_start(t13); } break; } } static inline void lk_tlac_remote_inhibit_test(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: lk_hmrt_unihibit_signalling_link(lk); lk_timer_start(t12); break; case LK_STATE_UNAVAILABLE: if (!lk->statem.locally_inhibited) { lk_hmrt_unihibit_signalling_link(lk); lk_timer_start(t12); } break; } } static inline void __lk_tlac_cancel_all_marks(lk_t * lk) { lk->statem.local_inhibit_in_progress = 0; lk->statem.unihibit_in_progress = 0; lk->statem.changeover_in_progress = 0; lk->statem.changeover_order = 0; lk->statem.emergency_changeover_order = 0; lk->statem.changeback_in_progress = 0; lk->statem.changeback_required = 0; lk->statem.local_blocked = 0; lk->statem.remote_blocked = 0; lk->statem.locally_inhibited = 0; lk->statem.remotely_inhibited = 0; lk->statem.failed = 0; lk->statem.management_reqest = 0; lk->statem.second_time_t12_expires = 0; lk->statem.second_time_t13_expires = 0; lk->statem.unavailable = 0; } static inline void lk_tlac_restart_begins(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: case LK_STATE_UNAVAILABLE: __lk_tlac_cancel_all_marks(lk); lk->statem.unavailable = 1; lk->statem.tlac_state = LK_STATE_SP_RESTARTING; break; } } static inline void lk_tlac_adjacent_sp_restarting(lk_t * lk) { /* * Only for those links in the direct linkset * to the adjacent, restarting SP */ switch (lk->statem.tlac_state) { case LK_STATE_AVAILABLE: case LK_STATE_UNAVAILABLE: __lk_tlac_cancel_all_marks(lk); lk->statem.unavailable = 1; lk->statem.tlac_state = LK_STATE_SP_RESTARTING; break; case LK_STATE_SP_RESTARTING: if (lk->statem.unavailable) lk->statem.tlac_state = LK_STATE_UNAVAILABLE; else lk->statem.tlac_state = LK_STATE_AVAILABLE; break; } } static inline void lk_tlac_restart_ends(lk_t * lk) { switch (lk->statem.tlac_state) { case LK_STATE_SP_RESTARTING: if (lk->statem.unavailable) lk->statem.tlac_state = LK_STATE_UNAVAILABLE; else lk->statem.tlac_state = LK_STATE_AVAILABLE; break; } } #endif /* __SLS_TLAC_H__ */
|
|||||||||||||||||||||||||||
OpenSS7 SS7 for the Common Man |
Home | Overview | Status | News | Documentation | Resources | About | ||||||||||||||||||||
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |