static void tei_id_ver_tout(struct FsmInst *fi, int event, void *arg) { teimgr_t *tm = fi->userdata; struct sk_buff *skb; if (--tm->N202) { if (tm->debug) tm->tei_m.printdebug(fi, "id verify req(%d) for tei %d", 3 - tm->N202, tm->l2->tei); put_tei_msg(tm, ID_VERIFY, 0, tm->l2->tei); mISDN_FsmAddTimer(&tm->t202, tm->T202, EV_T202, NULL, 4); } else { tm->tei_m.printdebug(fi, "verify req for tei %d failed", tm->l2->tei); skb = create_link_skb(MDL_REMOVE | REQUEST, 0, 0, NULL, 0); if (!skb) return; if (tei_l2(tm->l2, skb)) dev_kfree_skb(skb); // cs->cardmsg(cs, MDL_REMOVE | REQUEST, NULL); mISDN_FsmChangeState(fi, ST_TEI_NOP); } }
static void lc_start_delay(struct FsmInst *fi, int event, void *arg) { layer3_t *l3 = fi->userdata; mISDN_FsmChangeState(fi, ST_L3_LC_REL_DELAY); mISDN_FsmAddTimer(&l3->l3m_timer, DREL_TIMER_VALUE, EV_TIMEOUT, NULL, 50); }
static void tei_id_verify(struct FsmInst *fi, int event, void *arg) { teimgr_t *tm = fi->userdata; if (tm->debug) tm->tei_m.printdebug(fi, "id verify request for tei %d", tm->l2->tei); put_tei_msg(tm, ID_VERIFY, 0, tm->l2->tei); mISDN_FsmChangeState(&tm->tei_m, ST_TEI_IDVERIFY); mISDN_FsmAddTimer(&tm->t202, tm->T202, EV_T202, NULL, 2); tm->N202 = 2; }
static void lc_release_req(struct FsmInst *fi, int event, void *arg) { layer3_t *l3 = fi->userdata; if (test_bit(FLG_L2BLOCK, &l3->Flag)) { if (l3->debug) l3m_debug(fi, "lc_release_req: l2 blocked"); /* restart release timer */ mISDN_FsmAddTimer(&l3->l3m_timer, DREL_TIMER_VALUE, EV_TIMEOUT, NULL, 51); } else { mISDN_FsmChangeState(fi, ST_L3_LC_REL_WAIT); l3down(l3, DL_RELEASE | REQUEST, 0, NULL); } }
static void l2_start_multi(struct FsmInst *fi, int event, void *arg) { struct layer2 *l2 = fi->userdata; struct sk_buff *skb = arg; l2->vs = 0; l2->va = 0; l2->vr = 0; l2->sow = 0; clear_exception(l2); send_uframe(l2, NULL, UA | get_PollFlag(l2, skb), RSP); mISDN_FsmChangeState(fi, ST_L2_7); mISDN_FsmAddTimer(&l2->t203, l2->T203, EV_L2_T203, NULL, 3); skb_trim(skb, 0); l2up(l2, DL_ESTABLISH_IND, skb); if (l2->tm) l2_tei(l2, MDL_STATUS_UP_IND, 0); }
static void tei_id_request(struct FsmInst *fi, int event, void *arg) { teimgr_t *tm = fi->userdata; if (tm->l2->tei != -1) { tm->tei_m.printdebug(&tm->tei_m, "assign request for allready assigned tei %d", tm->l2->tei); return; } tm->ri = random_ri(); if (tm->debug) tm->tei_m.printdebug(&tm->tei_m, "assign request ri %d", tm->ri); put_tei_msg(tm, ID_REQUEST, tm->ri, 127); mISDN_FsmChangeState(fi, ST_TEI_IDREQ); mISDN_FsmAddTimer(&tm->t202, tm->T202, EV_T202, NULL, 1); tm->N202 = 3; }
static void l2_connected(struct FsmInst *fi, int event, void *arg) { struct layer2 *l2 = fi->userdata; struct sk_buff *skb = arg; int pr = -1; if (!get_PollFlag(l2, skb)) { l2_mdl_error_ua(fi, event, arg); return; } dev_kfree_skb(skb); if (test_and_clear_bit(FLG_PEND_REL, &l2->flag)) l2_disconnect(fi, event, NULL); if (test_and_clear_bit(FLG_L3_INIT, &l2->flag)) { pr = DL_ESTABLISH_CNF; } else if (l2->vs != l2->va) { skb_queue_purge(&l2->i_queue); pr = DL_ESTABLISH_IND; } stop_t200(l2, 5); l2->vr = 0; l2->vs = 0; l2->va = 0; l2->sow = 0; mISDN_FsmChangeState(fi, ST_L2_7); mISDN_FsmAddTimer(&l2->t203, l2->T203, EV_L2_T203, NULL, 4); if (pr != -1) l2up_create(l2, pr, 0, NULL); if (skb_queue_len(&l2->i_queue) && cansend(l2)) mISDN_FsmEvent(fi, EV_L2_ACK_PULL, NULL); if (l2->tm) l2_tei(l2, MDL_STATUS_UP_IND, 0); }
static void tei_id_req_tout(struct FsmInst *fi, int event, void *arg) { teimgr_t *tm = fi->userdata; struct sk_buff *skb; if (--tm->N202) { tm->ri = random_ri(); if (tm->debug) tm->tei_m.printdebug(fi, "assign req(%d) ri %d", 4 - tm->N202, tm->ri); put_tei_msg(tm, ID_REQUEST, tm->ri, 127); mISDN_FsmAddTimer(&tm->t202, tm->T202, EV_T202, NULL, 3); } else { tm->tei_m.printdebug(fi, "assign req failed"); skb = create_link_skb(MDL_ERROR | REQUEST, 0, 0, NULL, 0); if (!skb) return; if (tei_l2(tm->l2, skb)) dev_kfree_skb(skb); // cs->cardmsg(cs, MDL_REMOVE | REQUEST, NULL); mISDN_FsmChangeState(fi, ST_TEI_NOP); } }
inline void start_t200(struct layer2 *l2, int i) { mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, i); test_and_set_bit(FLG_T200_RUN, &l2->flag); }