OpenSS7
SS7 for the
Common Man

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified:

Home Overview Status News Documentation Resources About
   
 Overview
 Status
 News
 Documentation
 Resources
 About

   
Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/slsi/sls_tlac.h


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__ */


Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/slsi/sls_tlac.h

OpenSS7
SS7 for the
Common Man
Home Overview Status News Documentation Resources About

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified: