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

📄 callc.c

📁 arm平台上的uclinux系统全部源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
	} else {		chanp->d_st->lli.l4l3(chanp->d_st, CC_IGNORE | REQUEST, chanp->proc);		chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);		FsmChangeState(fi, ST_NULL);		if (test_bit(FLG_ESTAB_D, &chanp->Flags) &&			!test_bit(FLG_PTP, &chanp->d_st->l2.flag))			FsmRestartTimer(&chanp->drel_timer, DREL_TIMER_VALUE, EV_SHUTDOWN_D, NULL, 62);	}}static voidlli_establish_d(struct FsmInst *fi, int event, void *arg){	/* This establish the D-channel for pending L3 messages	 * without blocking the channel	 */	struct Channel *chanp = fi->userdata;	test_and_set_bit(FLG_DO_ESTAB, &chanp->Flags);	FsmChangeState(fi, ST_IN_WAIT_D);	test_and_set_bit(FLG_START_D, &chanp->Flags);	chanp->d_st->lli.l4l3(chanp->d_st, DL_ESTABLISH | REQUEST, NULL);}static voidlli_do_action(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	test_and_set_bit(FLG_ESTAB_D, &chanp->Flags);	if (chanp->leased) {		FsmChangeState(fi, ST_IN_WAIT_CONN_ACK);		test_and_clear_bit(FLG_DO_ALERT, &chanp->Flags);		test_and_clear_bit(FLG_DO_CONNECT, &chanp->Flags);		FsmEvent(&chanp->fi, EV_SETUP_CMPL_IND, NULL);	} else if (test_and_clear_bit(FLG_DO_CONNECT, &chanp->Flags) &&		!test_bit(FLG_DO_HANGUP, &chanp->Flags)) {		FsmChangeState(fi, ST_IN_WAIT_CONN_ACK);		test_and_clear_bit(FLG_DO_ALERT, &chanp->Flags);		chanp->d_st->lli.l4l3(chanp->d_st, CC_SETUP | RESPONSE, chanp->proc);	} else if (test_and_clear_bit(FLG_DO_ALERT, &chanp->Flags)) {		if (test_bit(FLG_DO_HANGUP, &chanp->Flags))			FsmRestartTimer(&chanp->drel_timer, 40, EV_HANGUP, NULL, 63);		FsmChangeState(fi, ST_IN_ALERT_SEND);		test_and_set_bit(FLG_CALL_ALERT, &chanp->Flags);		chanp->d_st->lli.l4l3(chanp->d_st, CC_ALERTING | REQUEST, chanp->proc);	} else if (test_and_clear_bit(FLG_DO_HANGUP, &chanp->Flags)) {		FsmChangeState(fi, ST_WAIT_DRELEASE);		chanp->proc->para.cause = 0x15;		/* Call Rejected */		chanp->d_st->lli.l4l3(chanp->d_st, CC_REJECT | REQUEST, chanp->proc);		test_and_set_bit(FLG_DISC_SEND, &chanp->Flags);	}}static voidlli_send_dconnect(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	FsmChangeState(fi, ST_IN_WAIT_CONN_ACK);	chanp->d_st->lli.l4l3(chanp->d_st, CC_SETUP | RESPONSE, chanp->proc);}static voidlli_init_bchan_in(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	FsmChangeState(fi, ST_WAIT_BCONN);	test_and_set_bit(FLG_LL_DCONN, &chanp->Flags);	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DCONN");	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_DCONN;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);	chanp->l2_active_protocol = chanp->l2_protocol;	chanp->incoming = !0;	init_b_st(chanp, !0);	test_and_set_bit(FLG_START_B, &chanp->Flags);	chanp->b_st->lli.l4l3(chanp->b_st, DL_ESTABLISH | REQUEST, NULL);}/* Call suspend */static voidlli_suspend(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	chanp->d_st->lli.l4l3(chanp->d_st, CC_SUSPEND | REQUEST, chanp->proc);}/* Call clearing */static voidlli_cancel_call(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	FsmChangeState(fi, ST_WAIT_DRELEASE);	if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {		if (chanp->debug & 1)			link_debug(chanp, 0, "STAT_BHUP");		ic.driver = chanp->cs->myid;		ic.command = ISDN_STAT_BHUP;		ic.arg = chanp->chan;		chanp->cs->iif.statcallb(&ic);	}	if (test_and_clear_bit(FLG_START_B, &chanp->Flags))		release_b_st(chanp);	chanp->proc->para.cause = 0x10;		/* Normal Call Clearing */	chanp->d_st->lli.l4l3(chanp->d_st, CC_DISCONNECT | REQUEST, chanp->proc);	test_and_set_bit(FLG_DISC_SEND, &chanp->Flags);}static voidlli_shutdown_d(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	FsmDelTimer(&chanp->drel_timer, 62);	if (test_bit(FLG_PTP, &chanp->d_st->l2.flag)) {		FsmChangeState(fi, ST_NULL);	} else {		if (!test_bit(FLG_TWO_DCHAN, &chanp->cs->HW_Flags)) {			if (chanp->chan) {				if (chanp->cs->channel[0].fi.state != ST_NULL)					return;			} else {				if (chanp->cs->channel[1].fi.state != ST_NULL)					return;			}		}		FsmChangeState(fi, ST_WAIT_DSHUTDOWN);		test_and_clear_bit(FLG_ESTAB_D, &chanp->Flags);		chanp->d_st->lli.l4l3(chanp->d_st, DL_RELEASE | REQUEST, NULL);	}}static voidlli_timeout_d(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	lli_deliver_cause(chanp, &ic);	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_DHUP;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);	FsmChangeState(fi, ST_NULL);	chanp->Flags = 0;	test_and_set_bit(FLG_ESTAB_D, &chanp->Flags);	if (!test_bit(FLG_PTP, &chanp->d_st->l2.flag))		FsmAddTimer(&chanp->drel_timer, DREL_TIMER_VALUE, EV_SHUTDOWN_D, NULL, 60);	chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);}static voidlli_go_null(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	FsmChangeState(fi, ST_NULL);	chanp->Flags = 0;	FsmDelTimer(&chanp->drel_timer, 63);	chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);}static voidlli_disconn_bchan(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	chanp->data_open = 0;	FsmChangeState(fi, ST_WAIT_BRELEASE);	test_and_clear_bit(FLG_CONNECT_B, &chanp->Flags);	chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);}static voidlli_send_d_disc(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	if (test_bit(FLG_DISC_REC, &chanp->Flags) ||		test_bit(FLG_REL_REC, &chanp->Flags))		return;	FsmChangeState(fi, ST_WAIT_DRELEASE);	if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {		if (chanp->debug & 1)			link_debug(chanp, 0, "STAT_BHUP");		ic.driver = chanp->cs->myid;		ic.command = ISDN_STAT_BHUP;		ic.arg = chanp->chan;		chanp->cs->iif.statcallb(&ic);	}	if (test_and_clear_bit(FLG_START_B, &chanp->Flags))		release_b_st(chanp);	if (chanp->leased) {		ic.command = ISDN_STAT_CAUSE;		ic.arg = chanp->chan;		sprintf(ic.parm.num, "L0010");		chanp->cs->iif.statcallb(&ic);		if (chanp->debug & 1)			link_debug(chanp, 0, "STAT_DHUP");		ic.driver = chanp->cs->myid;		ic.command = ISDN_STAT_DHUP;		ic.arg = chanp->chan;		chanp->cs->iif.statcallb(&ic);		FsmChangeState(fi, ST_WAIT_DSHUTDOWN);		test_and_clear_bit(FLG_ESTAB_D, &chanp->Flags);		chanp->d_st->lli.l4l3(chanp->d_st, DL_RELEASE | REQUEST, NULL);	} else {		if (test_and_clear_bit(FLG_DO_HANGUP, &chanp->Flags))			chanp->proc->para.cause = 0x15;		/* Call Reject */		else			chanp->proc->para.cause = 0x10;		/* Normal Call Clearing */		chanp->d_st->lli.l4l3(chanp->d_st, CC_DISCONNECT | REQUEST, chanp->proc);		test_and_set_bit(FLG_DISC_SEND, &chanp->Flags);	}}static voidlli_released_bchan(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	FsmChangeState(fi, ST_WAIT_DCOMMAND);	chanp->data_open = 0;	if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {		if (chanp->debug & 1)			link_debug(chanp, 0, "STAT_BHUP");		ic.driver = chanp->cs->myid;		ic.command = ISDN_STAT_BHUP;		ic.arg = chanp->chan;		chanp->cs->iif.statcallb(&ic);	}	release_b_st(chanp);	test_and_clear_bit(FLG_START_B, &chanp->Flags);}static voidlli_release_bchan(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	chanp->data_open = 0;	test_and_set_bit(FLG_DISC_REC, &chanp->Flags);	FsmChangeState(fi, ST_WAIT_BREL_DISC);	test_and_clear_bit(FLG_CONNECT_B, &chanp->Flags);	chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);}static voidlli_received_d_rel(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	chanp->data_open = 0;	FsmChangeState(fi, ST_NULL);	test_and_set_bit(FLG_REL_REC, &chanp->Flags);	if (test_and_clear_bit(FLG_CONNECT_B, &chanp->Flags)) {		chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);	}	if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {		if (chanp->debug & 1)			link_debug(chanp, 0, "STAT_BHUP");		ic.driver = chanp->cs->myid;		ic.command = ISDN_STAT_BHUP;		ic.arg = chanp->chan;		chanp->cs->iif.statcallb(&ic);	}	if (test_and_clear_bit(FLG_START_B, &chanp->Flags))		release_b_st(chanp);	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	lli_deliver_cause(chanp, &ic);	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_DHUP;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);	test_and_clear_bit(FLG_DISC_SEND, &chanp->Flags);	test_and_clear_bit(FLG_CALL_REC, &chanp->Flags);	test_and_clear_bit(FLG_CALL_ALERT, &chanp->Flags);	test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);	test_and_clear_bit(FLG_CALL_SEND, &chanp->Flags);	lli_timeout_d(fi, event, arg);}static voidlli_received_d_relcnf(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	chanp->data_open = 0;	FsmChangeState(fi, ST_NULL);	if (test_and_clear_bit(FLG_CONNECT_B, &chanp->Flags)) {		chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);	}	if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {		if (chanp->debug & 1)			link_debug(chanp, 0, "STAT_BHUP");		ic.driver = chanp->cs->myid;		ic.command = ISDN_STAT_BHUP;		ic.arg = chanp->chan;		chanp->cs->iif.statcallb(&ic);	}	if (test_and_clear_bit(FLG_START_B, &chanp->Flags))		release_b_st(chanp);	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	lli_deliver_cause(chanp, &ic);	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_DHUP;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);	test_and_clear_bit(FLG_DISC_SEND, &chanp->Flags);	test_and_clear_bit(FLG_CALL_REC, &chanp->Flags);	test_and_clear_bit(FLG_CALL_ALERT, &chanp->Flags);	test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);	test_and_clear_bit(FLG_CALL_SEND, &chanp->Flags);	lli_timeout_d(fi, event, arg);}static voidlli_received_d_disc(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	chanp->data_open = 0;	FsmChangeState(fi, ST_WAIT_D_REL_CNF);	test_and_set_bit(FLG_DISC_REC, &chanp->Flags);	if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {		if (chanp->debug & 1)			link_debug(chanp, 0, "STAT_BHUP");		ic.driver = chanp->cs->myid;		ic.command = ISDN_STAT_BHUP;		ic.arg = chanp->chan;		chanp->cs->iif.statcallb(&ic);	}	if (test_and_clear_bit(FLG_START_B, &chanp->Flags))		release_b_st(chanp);	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	lli_deliver_cause(chanp, &ic);	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_DHUP;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);	test_and_clear_bit(FLG_CALL_ALERT, &chanp->Flags);	test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);	test_and_clear_bit(FLG_CALL_SEND, &chanp->Flags);	chanp->d_st->lli.l4l3(chanp->d_st, CC_RELEASE | REQUEST, chanp->proc);}/* processing charge info */static voidlli_charge_info(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_CINF;	ic.arg = chanp->chan;	sprintf(ic.parm.num, "%d", chanp->proc->para.chargeinfo);	chanp->cs->iif.statcallb(&ic);}/* error procedures */static voidlli_no_dchan(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_NODCH");	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_NODCH;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);	chanp->Flags = 0;	FsmChangeState(fi, ST_NULL);	chanp->d_st->lli.l4l3(chanp->d_st, DL_RELEASE | REQUEST, NULL);}static voidlli_no_dchan_ready(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_DHUP;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);}static voidlli_no_dchan_in(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_DHUP;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);	chanp->d_st->lli.l4l3(chanp->d_st, CC_DLRL | REQUEST, chanp->proc);	chanp->Flags = 0;	FsmChangeState(fi, ST_NULL);	chanp->d_st->lli.l4l3(chanp->d_st, DL_RELEASE | REQUEST, NULL);}static voidlli_no_setup_rsp(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	FsmChangeState(fi, ST_NULL);	test_and_clear_bit(FLG_CALL_SEND, &chanp->Flags);	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_DHUP;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);	lli_shutdown_d(fi, event, arg);}static voidlli_setup_err(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	FsmChangeState(fi, ST_WAIT_DRELEASE);	test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	lli_deliver_cause(chanp, &ic);	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_DHUP;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);	test_and_set_bit(FLG_DISC_SEND, &chanp->Flags);	/* DISCONN was sent from L3 */}static voidlli_connect_err(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	FsmChangeState(fi, ST_WAIT_DRELEASE);	test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	lli_deliver_cause(chanp, &ic);	ic.driver = chanp->cs->myid;	ic.command = ISDN_STAT_DHUP;	ic.arg = chanp->chan;	chanp->cs->iif.statcallb(&ic);	test_and_set_bit(FLG_DISC_SEND, &chanp->Flags);	/* DISCONN was sent from L3 */}static voidlli_got_dlrl(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	chanp->data_open = 0;	FsmChangeState(fi, ST_NULL);	if (test_and_clear_bit(FLG_CONNECT_B, &chanp->Flags)) {		chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);	}	if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {		if (chanp->debug & 1)			link_debug(chanp, 0, "STAT_BHUP");		ic.driver = chanp->cs->myid;		ic.command = ISDN_STAT_BHUP;		ic.arg = chanp->chan;		chanp->cs->iif.statcallb(&ic);	}	if (test_and_clear_bit(FLG_START_B, &chanp->Flags))		release_b_st(chanp);	if (chanp->leased) {		ic.driver = chanp->cs->myid;		ic.command = ISDN_STAT_CAUSE;		ic.arg = chanp->chan;		sprintf(ic.parm.num, "L%02X%02X", 0, 0x2f);		chanp->cs->iif.statcallb(&ic);

⌨️ 快捷键说明

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