📄 callc.c
字号:
} 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 + -