⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sl.c

📁 OpenSS7 This the fourth public release of the OpenSS7 Master Package. See README in the release for
💻 C
📖 第 1 页 / 共 5 页
字号:
			sl_daedt_msu(q, sl, mp);		}		spin_unlock(&sl->tb.q_lock);		return (mp);	}}STATIC INLINE intsl_daedr_start(queue_t *q, struct sl *sl){	return sdt_daedr_start_req(q, sl);}STATIC INLINE intsl_rc_start(queue_t *q, struct sl *sl){	int err;	if (sl->statem.rc_state == SL_STATE_IDLE) {		sl->statem.rx.X.fsn = 0;		sl->statem.rx.X.fib = sl->statem.ib_mask;		sl->statem.rx.F.fsn = 0;		sl->statem.rx.T.fsn = sl->statem.sn_mask;		sl->statem.rtr = 0;	/* Basic only (note 1). */		if (sl->option.pvar == SS7_PVAR_ANSI_92)			sl->statem.msu_fisu_accepted = 1;		else			sl->statem.msu_fisu_accepted = 0;		sl->statem.abnormal_bsnr = 0;		sl->statem.abnormal_fibr = 0;	/* Basic only (note 1). */		sl->statem.congestion_discard = 0;		sl->statem.congestion_accept = 0;		if ((err = sl_daedr_start(q, sl)))			return (err);		sl->statem.rc_state = SL_STATE_IN_SERVICE;		/* 		 *   Note 1 - Although rtr and abnormal_fibr are only		 *   applicable to the Basic procedure (and not PCR), these		 *   state machine variables are never examined by PCR		 *   routines, so PCR and basic can share the same start		 *   procedures.		 */	}	return (QR_DONE);}STATIC INLINE voidsl_rc_reject_msu_fisu(queue_t *q, struct sl *sl){	sl->statem.msu_fisu_accepted = 0;}STATIC INLINE voidsl_rc_accept_msu_fisu(queue_t *q, struct sl *sl){	sl->statem.msu_fisu_accepted = 1;}STATIC INLINE voidsl_rc_retrieve_fsnx(queue_t *q, struct sl *sl){	sl_txc_fsnx_value(q, sl);	/* error in 93 spec */	sl->statem.congestion_discard = 0;	sl->statem.congestion_accept = 0;	sl_cc_normal(q, sl);	sl->statem.rtr = 0;	/* basic only */}STATIC INLINE voidsl_rc_align_fsnx(queue_t *q, struct sl *sl){	sl_txc_fsnx_value(q, sl);}STATIC INLINE intsl_rc_clear_rb(queue_t *q, struct sl *sl){	bufq_purge(&sl->rb);	// flushq(sl->oq, FLUSHDATA);	sl->statem.Cr = 0;	return sl_rb_cleared_ind(q, sl);}STATIC INLINE intsl_rc_retrieve_bsnt(queue_t *q, struct sl *sl){	sl->statem.rx.T.bsn = (sl->statem.rx.X.fsn - 1) & 0x7F;	return sl_bsnt_ind(q, sl, sl->statem.rx.T.bsn);}STATIC INLINE voidsl_cc_busy(queue_t *q, struct sl *sl){	if (sl->statem.cc_state == SL_STATE_NORMAL) {		sl_txc_send_sib(q, sl);		sl_timer_start(sl, t5);		sl->statem.cc_state = SL_STATE_BUSY;	}}STATIC INLINE voidsl_rc_congestion_discard(queue_t *q, struct sl *sl){	sl->statem.congestion_discard = 1;	sl_cc_busy(q, sl);}STATIC INLINE voidsl_rc_congestion_accept(queue_t *q, struct sl *sl){	sl->statem.congestion_accept = 1;	sl_cc_busy(q, sl);}STATIC INLINE voidsl_rc_no_congestion(queue_t *q, struct sl *sl){	sl->statem.congestion_discard = 0;	sl->statem.congestion_accept = 0;	sl_cc_normal(q, sl);	sl_txc_fsnx_value(q, sl);	if (sl->statem.rtr == 1) {	/* rtr never set for PCR */		ctrace(sl_txc_nack_to_be_sent(q, sl));		sl->statem.rx.X.fib = sl->statem.rx.X.fib ? 0 : sl->statem.ib_mask;	}}STATIC INLINE voidsl_lsc_congestion_discard(queue_t *q, struct sl *sl){	sl_rc_congestion_discard(q, sl);	sl->statem.l3_congestion_detect = 1;}STATIC INLINE voidsl_lsc_congestion_accept(queue_t *q, struct sl *sl){	sl_rc_congestion_accept(q, sl);	sl->statem.l3_congestion_detect = 1;}STATIC INLINE voidsl_lsc_no_congestion(queue_t *q, struct sl *sl){	sl_rc_no_congestion(q, sl);	sl->statem.l3_congestion_detect = 0;}STATIC INLINE intsl_lsc_sio(queue_t *q, struct sl *sl){	int err;	switch (sl->statem.lsc_state) {	case SL_STATE_OUT_OF_SERVICE:	case SL_STATE_INITIAL_ALIGNMENT:		break;	default:		sl_timer_stop(sl, t1);	/* ok if not running */		sl_out_of_service_ind(q, sl, SL_FAIL_RECEIVED_SIO);		sl->statem.failure_reason = SL_FAIL_RECEIVED_SIO;		sl_rc_stop(q, sl);		if ((err = sl_suerm_stop(q, sl)))			return (err);		sl_poc_stop(q, sl);	/* ok if ANSI */		sl_txc_send_sios(q, sl);		sl->statem.emergency = 0;		/* 		   FIXME: reinspect */		sl->statem.local_processor_outage = 0;		sl->statem.remote_processor_outage = 0;	/* ok if ITUT */		sl->statem.lsc_state = SL_STATE_OUT_OF_SERVICE;		break;	}	return (QR_DONE);}STATIC INLINE intsl_lsc_alignment_not_possible(queue_t *q, struct sl *sl){	int err;	if ((err = sl_out_of_service_ind(q, sl, SL_FAIL_ALIGNMENT_NOT_POSSIBLE)))		return (err);	sl->statem.failure_reason = SL_FAIL_ALIGNMENT_NOT_POSSIBLE;	sl_rc_stop(q, sl);	sl_txc_send_sios(q, sl);	sl->statem.local_processor_outage = 0;	sl->statem.emergency = 0;	sl->statem.lsc_state = SL_STATE_OUT_OF_SERVICE;	return (QR_DONE);}STATIC INLINE intsl_iac_sio(queue_t *q, struct sl *sl){	int err;	switch (sl->statem.iac_state) {	case SL_STATE_NOT_ALIGNED:		sl_timer_stop(sl, t2);		if (sl->statem.emergency) {			sl->statem.t4v = sl->config.t4e;			printd(("%s: Sending SIE at %lu\n", MOD_NAME, jiffies));			sl_txc_send_sie(q, sl);		} else {			sl->statem.t4v = sl->config.t4n;			sl_txc_send_sin(q, sl);		}		sl_timer_start(sl, t3);		sl->statem.iac_state = SL_STATE_ALIGNED;		break;	case SL_STATE_PROVING:		sl_timer_stop(sl, t4);		if ((err = sl_aerm_stop(q, sl)))			return (err);		sl_timer_start(sl, t3);		sl->statem.iac_state = SL_STATE_ALIGNED;		break;	}	return (QR_DONE);}STATIC INLINE intsl_iac_sios(queue_t *q, struct sl *sl){	int err;	switch (sl->statem.iac_state) {	case SL_STATE_ALIGNED:	case SL_STATE_PROVING:		sl_timer_stop(sl, t4);	/* ok if not running */		if ((err = sl_lsc_alignment_not_possible(q, sl)))			return (err);		if ((err = sl_aerm_stop(q, sl)))	/* ok if not running */			return (err);		sl_timer_stop(sl, t3);	/* ok if not running */		sl->statem.emergency = 0;		sl->statem.iac_state = SL_STATE_IDLE;		break;	}	return (QR_DONE);}STATIC INLINE intsl_lsc_sios(queue_t *q, struct sl *sl){	int err;	switch (sl->statem.lsc_state) {	case SL_STATE_ALIGNED_READY:	case SL_STATE_ALIGNED_NOT_READY:		sl_timer_stop(sl, t1);	/* ok to stop if not running */	case SL_STATE_IN_SERVICE:	case SL_STATE_PROCESSOR_OUTAGE:		sl_out_of_service_ind(q, sl, SL_FAIL_RECEIVED_SIOS);		sl->statem.failure_reason = SL_FAIL_RECEIVED_SIOS;		if ((err = sl_suerm_stop(q, sl)))	/* ok to stop if not running */			return (err);		sl_rc_stop(q, sl);		sl_poc_stop(q, sl);	/* ok if ANSI */		sl_txc_send_sios(q, sl);		sl->statem.emergency = 0;		sl->statem.local_processor_outage = 0;		sl->statem.remote_processor_outage = 0;	/* ok if ITU */		sl->statem.lsc_state = SL_STATE_OUT_OF_SERVICE;		break;	}	return (QR_DONE);}STATIC INLINE voidsl_lsc_no_processor_outage(queue_t *q, struct sl *sl){	if (sl->statem.lsc_state == SL_STATE_PROCESSOR_OUTAGE) {		sl->statem.processor_outage = 0;		if (!sl->statem.l3_indication_received)			return;		sl->statem.l3_indication_received = 0;		sl_txc_send_msu(q, sl);		sl->statem.local_processor_outage = 0;		sl_rc_accept_msu_fisu(q, sl);		sl->statem.lsc_state = SL_STATE_IN_SERVICE;	}}STATIC INLINE voidsl_poc_remote_processor_recovered(queue_t *q, struct sl *sl){	switch (sl->statem.poc_state) {	case SL_STATE_REMOTE_PROCESSOR_OUTAGE:		sl_lsc_no_processor_outage(q, sl);		sl->statem.poc_state = SL_STATE_IDLE;		return;	case SL_STATE_BOTH_PROCESSORS_OUT:		sl->statem.poc_state = SL_STATE_LOCAL_PROCESSOR_OUTAGE;		return;	}}STATIC INLINE intsl_lsc_fisu_msu_received(queue_t *q, struct sl *sl){	int err;	switch (sl->statem.lsc_state) {	case SL_STATE_ALIGNED_READY:		if ((err = sl_in_service_ind(q, sl)))			return (err);		if (sl->option.pvar == SS7_PVAR_ITUT_93)			sl_rc_accept_msu_fisu(q, sl);	/* unnecessary */		sl_timer_stop(sl, t1);		sl_txc_send_msu(q, sl);		sl->statem.lsc_state = SL_STATE_IN_SERVICE;		break;	case SL_STATE_ALIGNED_NOT_READY:		if ((err = sl_in_service_ind(q, sl)))			return (err);		sl_timer_stop(sl, t1);		sl->statem.lsc_state = SL_STATE_PROCESSOR_OUTAGE;		break;	case SL_STATE_PROCESSOR_OUTAGE:		if ((sl->option.pvar & SS7_PVAR_MASK) != SS7_PVAR_ANSI) {			sl_poc_remote_processor_recovered(q, sl);			return sl_remote_processor_recovered_ind(q, sl);		} else {#if 0			sl->statem.remote_processor_outage = 0;			return sl_remote_processor_recovered_ind(q, sl);#else			/* 			 *  A deviation from the SDLs has been placed here to			 *  limit the number of remote processor recovered			 *  indications which are delivered to L3.  One			 *  indication is sufficient.			 */			if (sl->statem.remote_processor_outage) {				sl->statem.remote_processor_outage = 0;				return sl_remote_processor_recovered_ind(q, sl);			}#endif		}		break;	}	return (QR_DONE);}STATIC INLINE voidsl_poc_remote_processor_outage(queue_t *q, struct sl *sl){	switch (sl->statem.poc_state) {	case SL_STATE_IDLE:		sl->statem.poc_state = SL_STATE_REMOTE_PROCESSOR_OUTAGE;		return;	case SL_STATE_LOCAL_PROCESSOR_OUTAGE:		sl->statem.poc_state = SL_STATE_BOTH_PROCESSORS_OUT;		return;	}}STATIC INLINE voidsl_lsc_sib(queue_t *q, struct sl *sl){	switch (sl->statem.lsc_state) {	case SL_STATE_IN_SERVICE:	case SL_STATE_PROCESSOR_OUTAGE:		sl_txc_sib_received(q, sl);		break;	}}STATIC INLINE intsl_lsc_sipo(queue_t *q, struct sl *sl){	int err;	switch (sl->statem.lsc_state) {	case SL_STATE_ALIGNED_READY:		if ((sl->option.pvar & SS7_PVAR_MASK) != SS7_PVAR_ANSI) {			sl_timer_stop(sl, t1);			if ((err = sl_remote_processor_outage_ind(q, sl)))				return (err);			sl_poc_remote_processor_outage(q, sl);			sl->statem.lsc_state = SL_STATE_PROCESSOR_OUTAGE;		} else {			sl_timer_stop(sl, t1);			if ((err = sl_remote_processor_outage_ind(q, sl)))				return (err);			sl->statem.remote_processor_outage = 1;			sl->statem.lsc_state = SL_STATE_PROCESSOR_OUTAGE;		}		break;	case SL_STATE_ALIGNED_NOT_READY:		if ((sl->option.pvar & SS7_PVAR_MASK) != SS7_PVAR_ANSI) {			if ((err = sl_remote_processor_outage_ind(q, sl)))				return (err);			sl_poc_remote_processor_outage(q, sl);			sl_timer_stop(sl, t1);			sl->statem.lsc_state = SL_STATE_PROCESSOR_OUTAGE;		} else {			if ((err = sl_remote_processor_outage_ind(q, sl)))				return (err);			sl->statem.remote_processor_outage = 1;			sl_timer_stop(sl, t1);			sl->statem.lsc_state = SL_STATE_PROCESSOR_OUTAGE;		}		break;	case SL_STATE_IN_SERVICE:		if ((sl->option.pvar & SS7_PVAR_MASK) != SS7_PVAR_ANSI) {			sl_txc_send_fisu(q, sl);			if ((err = sl_remote_processor_outage_ind(q, sl)))				return (err);			sl_poc_remote_processor_outage(q, sl);			sl->statem.processor_outage = 1;	/* remote? */			sl->statem.lsc_state = SL_STATE_PROCESSOR_OUTAGE;		} else {			sl_txc_send_fisu(q, sl);			if ((err = sl_remote_processor_outage_ind(q, sl)))				return (err);			sl->statem.remote_processor_outage = 1;			sl_rc_align_fsnx(q, sl);			sl_cc_stop(q, sl);			sl->statem.lsc_state = SL_STATE_PROCESSOR_OUTAGE;		}		break;	case SL_STATE_PROCESSOR_OUTAGE:		if ((sl->option.pvar & SS7_PVAR_MASK) != SS7_PVAR_ANSI) {			if ((err = sl_remote_processor_outage_ind(q, sl)))				return (err);			sl_poc_remote_processor_outage(q, sl);		} else {#if 0			sl->statem.remote_processor_outage = 1;			return sl_remote_processor_outage_ind(q, sl);#else			/* 			 *  A deviation from the SDLs has been placed here to			 *  limit the number of remote processor outage			 *  indications which are delivered to L3.  One			 *  indication is sufficient.			 */			if (!sl->statem.remote_processor_outage) {				sl->statem.remote_processor_outage = 1;				return sl_remote_processor_outage_ind(q, sl);			}#endif		}		break;	}	return (QR_DONE);}STATIC INLINE voidsl_poc_local_processor_outage(queue_t *q, struct sl *sl){	switch (sl->statem.poc_state) {	case SL_STATE_IDLE:		sl->statem.poc_state = SL_STATE_LOCAL_PROCESSOR_OUTAGE;		return;	case SL_STATE_REMOTE_PROCESSOR_OUTAGE:		sl->statem.poc_state = SL_STATE_BOTH_PROCESSORS_OUT;		return;	}}STATIC INLINE intsl_suerm_start(queue_t *q, struct sl *sl){	return sdt_suerm_start_req(q, sl);}STATIC INLINE intsl_lsc_alignment_complete(queue_t *q, struct sl *sl){	int err;	if (sl->statem.lsc_state == SL_STATE_INITIAL_ALIGNMENT) {		if ((err = sl_suerm_start(q, sl)))			return (err);		sl_timer_start(sl, t1);		if (sl->statem.local_processor_outage) {			if (sl->option.pvar != SS7_PVAR_ANSI_92)				sl_poc_local_processor_outage(q, sl);			sl_txc_send_sipo(q, sl);			if (sl->option.pvar != SS7_PVAR_ITUT_93)	/* possible error */				sl_rc_reject_msu_fisu(q, sl);			sl->statem.lsc_state = SL_STATE_ALIGNED_NOT_READY;		} else {			sl_txc_send_msu(q, sl);	/* changed from send_fisu for Q.781 */			sl_rc_accept_msu_fisu(q, sl);	/* error in ANSI spec? */			sl->statem.lsc_state = SL_STATE_ALIGNED_READY;		}	}	return (QR_DONE);}STATIC INLINE intsl_lsc_sin(queue_t *q, struct sl *sl){	int err;	switch (sl->statem.lsc_state) {	case SL_STATE_IN_SERVICE:		sl_out_of_service_ind(q, sl, SL_FAIL_RECE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -