static void lc_release_ind(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; FsmDelTimer(&st->l3.l3m_timer, 52); FsmChangeState(fi, ST_L3_LC_REL); skb_queue_purge(&st->l3.squeue); l3ml3p(st, DL_RELEASE | INDICATION); }
static void dout_underrun(struct FsmInst *fsm, int event, void *arg) { struct st5481_adapter *adapter = fsm->userdata; struct st5481_d_out *d_out = &adapter->d_out; if (test_bit(0, &d_out->busy) || test_bit(1, &d_out->busy)) { FsmChangeState(&d_out->fsm, ST_DOUT_WAIT_FOR_NOT_BUSY); } else { dout_stop(fsm, event, arg); } }
static void l1_go_f3(struct FsmInst *fi, int event, void *arg) { struct st5481_adapter *adapter = fi->userdata; if (fi->state == ST_L1_F7) ph_disconnect(adapter); FsmChangeState(fi, ST_L1_F3); D_L1L2(adapter, PH_DEACTIVATE | INDICATION, NULL); }
static void lc_start_delay_check(struct FsmInst *fi, int event, void *arg) /* 20/09/00 - GE timer not user for NI-1 as layer 2 should stay up */ { struct PStack *st = fi->userdata; FsmChangeState(fi, ST_L3_LC_REL_DELAY); /* 19/09/00 - GE timer not user for NI-1 */ if (st->protocol != ISDN_PTYPE_NI1) FsmAddTimer(&st->l3.l3m_timer, DREL_TIMER_VALUE, EV_TIMEOUT, NULL, 50); }
static void l1_activate(struct FsmInst *fi, int event, void *arg) { struct st5481_adapter *adapter = fi->userdata; st5481_ph_command(adapter, ST5481_CMD_DR); st5481_ph_command(adapter, ST5481_CMD_PUP); FsmRestartTimer(&adapter->timer, TIMER3_VALUE, EV_TIMER3, NULL, 2); st5481_ph_command(adapter, ST5481_CMD_AR8); FsmChangeState(fi, ST_L1_F4); }
static void l2_st6_dm_release(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct sk_buff *skb = arg; if (get_PollFlagFree(st, skb)) { stop_t200(st, 8); lapb_dl_release_l2l3(st, CONFIRM); FsmChangeState(fi, ST_L2_4); } }
static void lc_connect(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct sk_buff *skb = arg; FsmChangeState(fi, ST_L3_LC_ESTAB); while ((skb = skb_dequeue(&st->l3.squeue))) { st->l3.l3l2(st, DL_DATA | REQUEST, skb); } st->l3.l3l4(st, DL_ESTABLISH | INDICATION, NULL); }
static void l2_st6_dm_release(struct FsmInst *fi, int event, void *arg) { layer2_t *l2 = fi->userdata; msg_t *msg = arg; if (get_PollFlagFree(l2, msg)) { stop_t200(l2, 8); lapb_dl_release_l2l3(l2, CONFIRM); FsmChangeState(fi, ST_L2_4); } }
static void l2_disconnect(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; skb_queue_purge(&st->l2.i_queue); freewin(st); FsmChangeState(fi, ST_L2_6); st->l2.rc = 0; send_uframe(st, DISC | 0x10, CMD); FsmDelTimer(&st->l2.t203, 1); restart_t200(st, 2); }
static void tei_id_verify(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; if (st->ma.debug) st->ma.tei_m.printdebug(&st->ma.tei_m, "id verify request for tei %d", st->l2.tei); put_tei_msg(st, ID_VERIFY, 0, st->l2.tei); FsmChangeState(&st->ma.tei_m, ST_TEI_IDVERIFY); FsmAddTimer(&st->ma.t202, st->ma.T202, EV_T202, NULL, 2); st->ma.N202 = 2; }
static void l2_queue_ui_assign(struct FsmInst *fi, int event, void *arg) { layer2_t *l2 = fi->userdata; msg_t *msg = arg; msg_queue_tail(&l2->ui_queue, msg); FsmChangeState(fi, ST_L2_2); if ((msg = create_link_msg(MDL_ASSIGN | INDICATION, 0, 0, NULL, 0))) { if (l2_tei(l2->tm, msg)) free_msg(msg); } }
static void l2_mdl_assign(struct FsmInst *fi, int event, void *arg) { layer2_t *l2 = fi->userdata; msg_t *msg = arg; mISDNuser_head_t *hh; FsmChangeState(fi, ST_L2_3); msg_trim(msg, 0); hh = (mISDNuser_head_t *)msg_put(msg, mISDNUSER_HEAD_SIZE); hh->prim = MDL_ASSIGN | INDICATION; hh->dinfo = 0; if (l2_tei(l2->tm, msg)) free_msg(msg); }
static void l2_released(struct FsmInst *fi, int event, void *arg) { layer2_t *l2 = fi->userdata; msg_t *msg = arg; if (!get_PollFlag(l2, msg)) { l2_mdl_error_ua(fi, event, arg); return; } free_msg(msg); stop_t200(l2, 6); lapb_dl_release_l2l3(l2, CONFIRM); FsmChangeState(fi, ST_L2_4); }
static void lc_release_req(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; if (test_bit(FLG_L2BLOCK, &st->l2.flag)) { if (st->l3.debug) l3_debug(st, "lc_release_req: l2 blocked"); /* restart release timer */ FsmAddTimer(&st->l3.l3m_timer, DREL_TIMER_VALUE, EV_TIMEOUT, NULL, 51); } else { FsmChangeState(fi, ST_L3_LC_REL_WAIT); st->l3.l3l2(st, DL_RELEASE | REQUEST, NULL); } }
static void l2_stop_multi(struct FsmInst *fi, int event, void *arg) { layer2_t *l2 = fi->userdata; msg_t *msg = arg; FsmChangeState(fi, ST_L2_4); FsmDelTimer(&l2->t203, 3); stop_t200(l2, 4); send_uframe(l2, msg, UA | get_PollFlag(l2, msg), RSP); msg_queue_purge(&l2->i_queue); freewin(l2); lapb_dl_release_l2l3(l2, INDICATION); }
static void establishlink(struct FsmInst *fi) { struct PStack *st = fi->userdata; u_char cmd; clear_exception(&st->l2); st->l2.rc = 0; cmd = (test_bit(FLG_MOD128, &st->l2.flag) ? SABME : SABM) | 0x10; send_uframe(st, cmd, CMD); FsmDelTimer(&st->l2.t203, 1); restart_t200(st, 1); test_and_clear_bit(FLG_PEND_REL, &st->l2.flag); freewin(st); FsmChangeState(fi, ST_L2_5); }
static void l2_stop_multi(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct sk_buff *skb = arg; FsmChangeState(fi, ST_L2_4); FsmDelTimer(&st->l2.t203, 3); stop_t200(st, 4); send_uframe(st, UA | get_PollFlagFree(st, skb), RSP); skb_queue_purge(&st->l2.i_queue); freewin(st); lapb_dl_release_l2l3(st, INDICATION); }
static void establishlink(struct FsmInst *fi) { layer2_t *l2 = fi->userdata; u_char cmd; clear_exception(l2); l2->rc = 0; cmd = (test_bit(FLG_MOD128, &l2->flag) ? SABME : SABM) | 0x10; send_uframe(l2, NULL, cmd, CMD); FsmDelTimer(&l2->t203, 1); restart_t200(l2, 1); test_and_clear_bit(FLG_PEND_REL, &l2->flag); freewin(l2); FsmChangeState(fi, ST_L2_5); }
static void l2_released(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct sk_buff *skb = arg; if (!get_PollFlag(st, skb)) { l2_mdl_error_ua(fi, event, arg); return; } dev_kfree_skb(skb); stop_t200(st, 6); lapb_dl_release_l2l3(st, CONFIRM); FsmChangeState(fi, ST_L2_4); }
static void l2_disconnect(struct FsmInst *fi, int event, void *arg) { layer2_t *l2 = fi->userdata; msg_t *msg = arg; msg_queue_purge(&l2->i_queue); freewin(l2); FsmChangeState(fi, ST_L2_6); l2->rc = 0; send_uframe(l2, NULL, DISC | 0x10, CMD); FsmDelTimer(&l2->t203, 1); restart_t200(l2, 2); if (msg) free_msg(msg); }
static void l2_st5_dm_release(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct sk_buff *skb = arg; if (get_PollFlagFree(st, skb)) { stop_t200(st, 7); if (!test_bit(FLG_L3_INIT, &st->l2.flag)) skb_queue_purge(&st->l2.i_queue); if (test_bit(FLG_LAPB, &st->l2.flag)) st->l2.l2l1(st, PH_DEACTIVATE | REQUEST, NULL); st5_dl_release_l2l3(st); FsmChangeState(fi, ST_L2_4); } }
static void l2_st5_dm_release(struct FsmInst *fi, int event, void *arg) { layer2_t *l2 = fi->userdata; msg_t *msg = arg; if (get_PollFlagFree(l2, msg)) { stop_t200(l2, 7); if (!test_bit(FLG_L3_INIT, &l2->flag)) msg_queue_purge(&l2->i_queue); if (test_bit(FLG_LAPB, &l2->flag)) l2down_create(l2, PH_DEACTIVATE | REQUEST, 0, 0, NULL); st5_dl_release_l2l3(l2); FsmChangeState(fi, ST_L2_4); } }
static void tei_id_chk_req(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct sk_buff *skb = arg; int tei; tei = skb->data[4] >> 1; if (st->ma.debug) st->ma.tei_m.printdebug(&st->ma.tei_m, "identity check req tei %d", tei); if ((st->l2.tei != -1) && ((tei == GROUP_TEI) || (tei == st->l2.tei))) { FsmDelTimer(&st->ma.t202, 4); FsmChangeState(&st->ma.tei_m, ST_TEI_NOP); put_tei_msg(st, ID_CHK_RES, random_ri(), st->l2.tei); } }
static void l2_start_multi(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct sk_buff *skb = arg; send_uframe(st, UA | get_PollFlagFree(st, skb), RSP); clear_exception(&st->l2); st->l2.vs = 0; st->l2.va = 0; st->l2.vr = 0; st->l2.sow = 0; FsmChangeState(fi, ST_L2_7); FsmAddTimer(&st->l2.t203, st->l2.T203, EV_L2_T203, NULL, 3); st->l2.l2l3(st, DL_ESTABLISH | INDICATION, NULL); }
static void lc_connect(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct sk_buff *skb = arg; int dequeued = 0; FsmChangeState(fi, ST_L3_LC_ESTAB); while ((skb = skb_dequeue(&st->l3.squeue))) { st->l3.l3l2(st, DL_DATA | REQUEST, skb); dequeued++; } if ((!st->l3.proc) && dequeued) { if (st->l3.debug) l3_debug(st, "lc_connect: release link"); FsmEvent(&st->l3.l3m, EV_RELEASE_REQ, NULL); } else l3ml3p(st, DL_ESTABLISH | INDICATION); }
static void l2_start_multi(struct FsmInst *fi, int event, void *arg) { layer2_t *l2 = fi->userdata; msg_t *msg = arg; send_uframe(l2, NULL, UA | get_PollFlag(l2, msg), RSP); clear_exception(l2); l2->vs = 0; l2->va = 0; l2->vr = 0; l2->sow = 0; FsmChangeState(fi, ST_L2_7); FsmAddTimer(&l2->t203, l2->T203, EV_L2_T203, NULL, 3); msg_trim(msg, 0); msg_push(msg, mISDNUSER_HEAD_SIZE); if (l2up(l2, DL_ESTABLISH | INDICATION, CES(l2), msg)) free_msg(msg); }
static void tei_id_request(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; if (st->l2.tei != -1) { st->ma.tei_m.printdebug(&st->ma.tei_m, "assign request for already assigned tei %d", st->l2.tei); return; } st->ma.ri = random_ri(); if (st->ma.debug) st->ma.tei_m.printdebug(&st->ma.tei_m, "assign request ri %d", st->ma.ri); put_tei_msg(st, ID_REQUEST, st->ma.ri, 127); FsmChangeState(&st->ma.tei_m, ST_TEI_IDREQ); FsmAddTimer(&st->ma.t202, st->ma.T202, EV_T202, NULL, 1); st->ma.N202 = 3; }
static void tei_id_remove(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct sk_buff *skb = arg; struct IsdnCardState *cs; int tei; tei = skb->data[4] >> 1; if (st->ma.debug) st->ma.tei_m.printdebug(&st->ma.tei_m, "identity remove tei %d", tei); if ((st->l2.tei != -1) && ((tei == GROUP_TEI) || (tei == st->l2.tei))) { FsmDelTimer(&st->ma.t202, 5); FsmChangeState(&st->ma.tei_m, ST_TEI_NOP); L3L2(st, MDL_REMOVE | REQUEST, 0); cs = (struct IsdnCardState *) st->l1.hardware; mdl_remove(cs); } }
static void tei_id_req_tout(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct IsdnCardState *cs; if (--st->ma.N202) { st->ma.ri = random_ri(); if (st->ma.debug) st->ma.tei_m.printdebug(&st->ma.tei_m, "assign req(%d) ri %d", 4 - st->ma.N202, st->ma.ri); put_tei_msg(st, ID_REQUEST, st->ma.ri, 127); FsmAddTimer(&st->ma.t202, st->ma.T202, EV_T202, NULL, 3); } else { st->ma.tei_m.printdebug(&st->ma.tei_m, "assign req failed"); L3L2(st, MDL_ERROR | RESPONSE, 0); cs = (struct IsdnCardState *) st->l1.hardware; mdl_remove(cs); FsmChangeState(fi, ST_TEI_NOP); } }
static void tei_id_ver_tout(struct FsmInst *fi, int event, void *arg) { struct PStack *st = fi->userdata; struct IsdnCardState *cs; if (--st->ma.N202) { if (st->ma.debug) st->ma.tei_m.printdebug(&st->ma.tei_m, "id verify req(%d) for tei %d", 3 - st->ma.N202, st->l2.tei); put_tei_msg(st, ID_VERIFY, 0, st->l2.tei); FsmAddTimer(&st->ma.t202, st->ma.T202, EV_T202, NULL, 4); } else { st->ma.tei_m.printdebug(&st->ma.tei_m, "verify req for tei %d failed", st->l2.tei); L3L2(st, MDL_REMOVE | REQUEST, 0); cs = (struct IsdnCardState *) st->l1.hardware; mdl_remove(cs); FsmChangeState(fi, ST_TEI_NOP); } }