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

📄 callc.c

📁 是关于linux2.5.1的完全源码
💻 C
📖 第 1 页 / 共 4 页
字号:
static voidlli_suspend(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	L4L3(chanp->d_st, CC_SUSPEND | REQUEST, chanp->proc);}/* Call clearing */static voidlli_leased_hup(struct FsmInst *fi, struct Channel *chanp){	isdn_ctrl ic;	ic.driver = chanp->cs->myid;	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");	HL_LL(chanp, ISDN_STAT_DHUP);	lli_close(fi);}static voidlli_disconnect_req(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	if (chanp->leased) {		lli_leased_hup(fi, chanp);	} else {		FsmChangeState(fi, ST_WAIT_DRELEASE);		if (chanp->proc)			chanp->proc->para.cause = 0x10;	/* Normal Call Clearing */		L4L3(chanp->d_st, CC_DISCONNECT | REQUEST, chanp->proc);	}}static voidlli_disconnect_reject(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	if (chanp->leased) {		lli_leased_hup(fi, chanp);	} else {		FsmChangeState(fi, ST_WAIT_DRELEASE);		if (chanp->proc)			chanp->proc->para.cause = 0x15;	/* Call Rejected */		L4L3(chanp->d_st, CC_DISCONNECT | REQUEST, chanp->proc);	}}static voidlli_dhup_close(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	if (chanp->leased) {		lli_leased_hup(fi, chanp);	} else {		if (chanp->debug & 1)			link_debug(chanp, 0, "STAT_DHUP");		lli_deliver_cause(chanp);		HL_LL(chanp, ISDN_STAT_DHUP);		lli_close(fi);	}}static voidlli_reject_req(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	if (chanp->leased) {		lli_leased_hup(fi, chanp);		return;	}#ifndef ALERT_REJECT	if (chanp->proc)		chanp->proc->para.cause = 0x15;	/* Call Rejected */	L4L3(chanp->d_st, CC_REJECT | REQUEST, chanp->proc);	lli_dhup_close(fi, event, arg);#else	FsmRestartTimer(&chanp->drel_timer, 40, EV_HANGUP, NULL, 63);	FsmChangeState(fi, ST_IN_ALERT_SENT);	L4L3(chanp->d_st, CC_ALERTING | REQUEST, chanp->proc);#endif}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);	L4L3(chanp->b_st, DL_RELEASE | REQUEST, NULL);}static voidlli_start_disc(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	if (chanp->leased) {		lli_leased_hup(fi, chanp);	} else {		lli_disconnect_req(fi, event, arg);	}}static voidlli_rel_b_disc(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	release_b_st(chanp);	lli_start_disc(fi, event, arg);}static voidlli_bhup_disc(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata; 	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_BHUP");	HL_LL(chanp, ISDN_STAT_BHUP);	lli_rel_b_disc(fi, event, arg);}static voidlli_bhup_rel_b(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	FsmChangeState(fi, ST_WAIT_DCOMMAND);	chanp->data_open = 0;	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_BHUP");	HL_LL(chanp, ISDN_STAT_BHUP);	release_b_st(chanp);}static voidlli_release_bchan(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	chanp->data_open = 0;	FsmChangeState(fi, ST_WAIT_BREL_DISC);	L4L3(chanp->b_st, DL_RELEASE | REQUEST, NULL);}static voidlli_rel_b_dhup(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	release_b_st(chanp);	lli_dhup_close(fi, event, arg);}static voidlli_bhup_dhup(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_BHUP");	HL_LL(chanp, ISDN_STAT_BHUP);	lli_rel_b_dhup(fi, event, arg);}static voidlli_abort(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	chanp->data_open = 0;	L4L3(chanp->b_st, DL_RELEASE | REQUEST, NULL);	lli_bhup_dhup(fi, event, arg);} static voidlli_release_req(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	if (chanp->leased) {		lli_leased_hup(fi, chanp);	} else {		FsmChangeState(fi, ST_WAIT_D_REL_CNF);		L4L3(chanp->d_st, CC_RELEASE | REQUEST,	chanp->proc);	}}static voidlli_rel_b_release_req(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	release_b_st(chanp);	lli_release_req(fi, event, arg);}static voidlli_bhup_release_req(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata; 	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_BHUP");	HL_LL(chanp, ISDN_STAT_BHUP);	lli_rel_b_release_req(fi, event, arg);}/* 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_dchan_not_ready(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	HL_LL(chanp, ISDN_STAT_DHUP); }static voidlli_no_setup_rsp(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_DHUP");	HL_LL(chanp, ISDN_STAT_DHUP);	lli_close(fi); }static voidlli_error(struct FsmInst *fi, int event, void *arg){	FsmChangeState(fi, ST_WAIT_DRELEASE);}static voidlli_failure_l(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	isdn_ctrl ic;	FsmChangeState(fi, ST_NULL);	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);	HL_LL(chanp, ISDN_STAT_DHUP);	chanp->Flags = 0;	chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);}static voidlli_rel_b_fail(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	release_b_st(chanp);	lli_failure_l(fi, event, arg);}static voidlli_bhup_fail(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	if (chanp->debug & 1)		link_debug(chanp, 0, "STAT_BHUP");	HL_LL(chanp, ISDN_STAT_BHUP);	lli_rel_b_fail(fi, event, arg);}static voidlli_failure_a(struct FsmInst *fi, int event, void *arg){	struct Channel *chanp = fi->userdata;	chanp->data_open = 0;	L4L3(chanp->b_st, DL_RELEASE | REQUEST, NULL);	lli_bhup_fail(fi, event, arg);}/* *INDENT-OFF* */static struct FsmNode fnlist[] __initdata ={        {ST_NULL,               EV_DIAL,                lli_prep_dialout},        {ST_NULL,               EV_RESUME,              lli_resume},        {ST_NULL,               EV_SETUP_IND,           lli_deliver_call},        {ST_NULL,               EV_LEASED,              lli_leased_in},        {ST_OUT_DIAL,           EV_SETUP_CNF,           lli_init_bchan_out},        {ST_OUT_DIAL,           EV_HANGUP,              lli_disconnect_req},        {ST_OUT_DIAL,           EV_DISCONNECT_IND,      lli_release_req},        {ST_OUT_DIAL,           EV_RELEASE,             lli_dhup_close},        {ST_OUT_DIAL,           EV_NOSETUP_RSP,         lli_no_setup_rsp},        {ST_OUT_DIAL,           EV_SETUP_ERR,           lli_error},        {ST_IN_WAIT_LL,         EV_LEASED_REL,          lli_failure_l},        {ST_IN_WAIT_LL,         EV_ACCEPTD,             lli_setup_rsp},        {ST_IN_WAIT_LL,         EV_HANGUP,              lli_reject_req},        {ST_IN_WAIT_LL,         EV_DISCONNECT_IND,      lli_release_req},        {ST_IN_WAIT_LL,         EV_RELEASE,             lli_dhup_close},        {ST_IN_WAIT_LL,         EV_SETUP_IND,           lli_deliver_call},        {ST_IN_WAIT_LL,         EV_SETUP_ERR,           lli_error},        {ST_IN_ALERT_SENT,      EV_SETUP_CMPL_IND,      lli_init_bchan_in},        {ST_IN_ALERT_SENT,      EV_ACCEPTD,             lli_send_dconnect},        {ST_IN_ALERT_SENT,      EV_HANGUP,              lli_disconnect_reject},        {ST_IN_ALERT_SENT,      EV_DISCONNECT_IND,      lli_release_req},        {ST_IN_ALERT_SENT,      EV_RELEASE,             lli_dhup_close},	{ST_IN_ALERT_SENT,	EV_REDIR,		lli_send_redir},	{ST_IN_PROCEED_SEND,	EV_REDIR,		lli_send_redir},	{ST_IN_PROCEED_SEND,	EV_ALERT,		lli_send_alert},	{ST_IN_PROCEED_SEND,	EV_ACCEPTD,		lli_send_dconnect},	{ST_IN_PROCEED_SEND,	EV_HANGUP,		lli_disconnect_reject},	{ST_IN_PROCEED_SEND,	EV_DISCONNECT_IND,	lli_dhup_close},        {ST_IN_ALERT_SENT,      EV_RELEASE,             lli_dhup_close},        {ST_IN_WAIT_CONN_ACK,   EV_SETUP_CMPL_IND,      lli_init_bchan_in},        {ST_IN_WAIT_CONN_ACK,   EV_HANGUP,              lli_disconnect_req},        {ST_IN_WAIT_CONN_ACK,   EV_DISCONNECT_IND,      lli_release_req},        {ST_IN_WAIT_CONN_ACK,   EV_RELEASE,             lli_dhup_close},        {ST_IN_WAIT_CONN_ACK,   EV_CONNECT_ERR,         lli_error},        {ST_WAIT_BCONN,         EV_BC_EST,              lli_go_active},        {ST_WAIT_BCONN,         EV_BC_REL,              lli_rel_b_disc},        {ST_WAIT_BCONN,         EV_HANGUP,              lli_rel_b_disc},        {ST_WAIT_BCONN,         EV_DISCONNECT_IND,      lli_rel_b_release_req},        {ST_WAIT_BCONN,         EV_RELEASE,             lli_rel_b_dhup},        {ST_WAIT_BCONN,         EV_LEASED_REL,          lli_rel_b_fail},        {ST_WAIT_BCONN,         EV_CINF,                lli_charge_info},        {ST_ACTIVE,             EV_CINF,                lli_charge_info},        {ST_ACTIVE,             EV_BC_REL,              lli_bhup_rel_b},        {ST_ACTIVE,             EV_SUSPEND,             lli_suspend},        {ST_ACTIVE,             EV_HANGUP,              lli_disconn_bchan},        {ST_ACTIVE,             EV_DISCONNECT_IND,      lli_release_bchan},        {ST_ACTIVE,             EV_RELEASE,             lli_abort},        {ST_ACTIVE,             EV_LEASED_REL,          lli_failure_a},        {ST_WAIT_BRELEASE,      EV_BC_REL,              lli_bhup_disc},        {ST_WAIT_BRELEASE,      EV_DISCONNECT_IND,      lli_bhup_release_req},        {ST_WAIT_BRELEASE,      EV_RELEASE,             lli_bhup_dhup},        {ST_WAIT_BRELEASE,      EV_LEASED_REL,          lli_bhup_fail},        {ST_WAIT_BREL_DISC,     EV_BC_REL,              lli_bhup_release_req},        {ST_WAIT_BREL_DISC,     EV_RELEASE,             lli_bhup_dhup},        {ST_WAIT_DCOMMAND,      EV_HANGUP,              lli_start_disc},        {ST_WAIT_DCOMMAND,      EV_DISCONNECT_IND,      lli_release_req},        {ST_WAIT_DCOMMAND,      EV_RELEASE,             lli_dhup_close},        {ST_WAIT_DCOMMAND,      EV_LEASED_REL,          lli_failure_l},        {ST_WAIT_DRELEASE,      EV_RELEASE,             lli_dhup_close},        {ST_WAIT_DRELEASE,      EV_DIAL,                lli_dchan_not_ready},  /* ETS 300-104 16.1 */        {ST_WAIT_D_REL_CNF,     EV_RELEASE,             lli_dhup_close},        {ST_WAIT_D_REL_CNF,     EV_DIAL,                lli_dchan_not_ready},};/* *INDENT-ON* */#define FNCOUNT (sizeof(fnlist)/sizeof(struct FsmNode))int __initCallcNew(void){	callcfsm.state_count = STATE_COUNT;	callcfsm.event_count = EVENT_COUNT;	callcfsm.strEvent = strEvent;	callcfsm.strState = strState;	return FsmNew(&callcfsm, fnlist, FNCOUNT);}voidCallcFree(void){	FsmFree(&callcfsm);}static voidrelease_b_st(struct Channel *chanp){	struct PStack *st = chanp->b_st;	if(test_and_clear_bit(FLG_START_B, &chanp->Flags)) {		chanp->bcs->BC_Close(chanp->bcs);		switch (chanp->l2_active_protocol) {			case (ISDN_PROTO_L2_X75I):				releasestack_isdnl2(st);				break;			case (ISDN_PROTO_L2_HDLC):			case (ISDN_PROTO_L2_HDLC_56K):			case (ISDN_PROTO_L2_TRANS):			case (ISDN_PROTO_L2_MODEM):			case (ISDN_PROTO_L2_FAX):				releasestack_transl2(st);				break;		}	} }struct Channel*selectfreechannel(struct PStack *st, int bch){	struct IsdnCardState *cs = st->l1.hardware;	struct Channel *chanp = st->lli.userdata;	int i;	if (test_bit(FLG_TWO_DCHAN, &cs->HW_Flags))		i=1;	else		i=0;	if (!bch) {		i = 2; /* virtual channel */		chanp += 2;	}	while (i < ((bch) ? cs->chanlimit : (2 + MAX_WAITING_CALLS))) {		if (chanp->fi.state == ST_NULL)			return (chanp);		chanp++;		i++;	}	if (bch) /* number of channels is limited */ {		i = 2; /* virtual channel */		chanp = st->lli.userdata;		chanp += i;		while (i < (2 + MAX_WAITING_CALLS)) {			if (chanp->fi.state == ST_NULL)				return (chanp);			chanp++;			i++;		}	}

⌨️ 快捷键说明

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