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