/* * State machine for state 4, Frame Reject State. * The handling of the timer(s) is in file lapb_timer.c. */ static void lapb_state4_machine(struct lapb_cb *lapb, struct sk_buff *skb, struct lapb_frame *frame) { switch (frame->type) { case LAPB_SABM: lapb_dbg(1, "(%p) S4 RX SABM(%d)\n", lapb->dev, frame->pf); if (lapb->mode & LAPB_EXTENDED) { lapb_dbg(1, "(%p) S4 TX DM(%d)\n", lapb->dev, frame->pf); lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); } else { lapb_dbg(1, "(%p) S4 TX UA(%d)\n", lapb->dev, frame->pf); lapb_dbg(0, "(%p) S4 -> S3\n", lapb->dev); lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); lapb_stop_t1timer(lapb); lapb_stop_t2timer(lapb); lapb->state = LAPB_STATE_3; lapb->condition = 0x00; lapb->n2count = 0; lapb->vs = 0; lapb->vr = 0; lapb->va = 0; lapb_connect_indication(lapb, LAPB_OK); } break; case LAPB_SABME: lapb_dbg(1, "(%p) S4 RX SABME(%d)\n", lapb->dev, frame->pf); if (lapb->mode & LAPB_EXTENDED) { lapb_dbg(1, "(%p) S4 TX UA(%d)\n", lapb->dev, frame->pf); lapb_dbg(0, "(%p) S4 -> S3\n", lapb->dev); lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); lapb_stop_t1timer(lapb); lapb_stop_t2timer(lapb); lapb->state = LAPB_STATE_3; lapb->condition = 0x00; lapb->n2count = 0; lapb->vs = 0; lapb->vr = 0; lapb->va = 0; lapb_connect_indication(lapb, LAPB_OK); } else { lapb_dbg(1, "(%p) S4 TX DM(%d)\n", lapb->dev, frame->pf); lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); } break; } kfree_skb(skb); }
/* * State machine for state 0, Disconnected State. * The handling of the timer(s) is in file lapb_timer.c. */ static void lapb_state0_machine(struct lapb_cb *lapb, struct sk_buff *skb, struct lapb_frame *frame) { switch (frame->type) { case LAPB_SABM: #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S0 RX SABM(%d)\n", lapb->dev, frame->pf); #endif if (lapb->mode & LAPB_EXTENDED) { #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S0 TX DM(%d)\n", lapb->dev, frame->pf); #endif lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); } else { #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S0 TX UA(%d)\n", lapb->dev, frame->pf); #endif #if LAPB_DEBUG > 0 printk(KERN_DEBUG "lapb: (%p) S0 -> S3\n", lapb->dev); #endif lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); lapb_stop_t1timer(lapb); lapb_stop_t2timer(lapb); lapb->state = LAPB_STATE_3; lapb->condition = 0x00; lapb->n2count = 0; lapb->vs = 0; lapb->vr = 0; lapb->va = 0; lapb_connect_indication(lapb, LAPB_OK); } break; case LAPB_SABME: #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S0 RX SABME(%d)\n", lapb->dev, frame->pf); #endif if (lapb->mode & LAPB_EXTENDED) { #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S0 TX UA(%d)\n", lapb->dev, frame->pf); #endif #if LAPB_DEBUG > 0 printk(KERN_DEBUG "lapb: (%p) S0 -> S3\n", lapb->dev); #endif lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); lapb_stop_t1timer(lapb); lapb_stop_t2timer(lapb); lapb->state = LAPB_STATE_3; lapb->condition = 0x00; lapb->n2count = 0; lapb->vs = 0; lapb->vr = 0; lapb->va = 0; lapb_connect_indication(lapb, LAPB_OK); } else { #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S0 TX DM(%d)\n", lapb->dev, frame->pf); #endif lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); } break; case LAPB_DISC: #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S0 RX DISC(%d)\n", lapb->dev, frame->pf); printk(KERN_DEBUG "lapb: (%p) S0 TX UA(%d)\n", lapb->dev, frame->pf); #endif lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); break; default: break; } kfree_skb(skb); }
/* * State machine for state 0, Disconnected State. * The handling of the timer(s) is in file lapb_timer.c. */ void lapb_state0_machine(struct lapb_cs * lapb, struct lapb_frame * frame) { struct lapb_cs_internal * lapb_int = lapb_get_internal(lapb); switch (frame->type) { case LAPB_SABM: lapb->callbacks->debug(2, "[LAPB] S0 RX SABM(%d)", frame->pf); if (lapb_is_extended(lapb)) { lapb->callbacks->debug(2, "[LAPB] S0 TX DM(%d)", frame->pf); lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); } else { lapb_stop_t201timer(lapb); lapb->callbacks->debug(2, "[LAPB] S0 TX UA(%d)", frame->pf); lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); lapb_int->state = LAPB_STATE_3; lapb_int->condition = 0x00; lapb_int->vs = 0; lapb_int->vr = 0; //lapb_int->last_vr = 0; lapb_int->va = 0; lapb->callbacks->debug(1, "[LAPB] S0 -> S3"); lapb_connect_indication(lapb, LAPB_OK); }; break; case LAPB_SABME: lapb->callbacks->debug(2, "[LAPB] S0 RX SABME(%d)", frame->pf); if (lapb_is_extended(lapb)) { lapb_stop_t201timer(lapb); lapb->callbacks->debug(2, "[LAPB] S0 TX UA(%d)", frame->pf); lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); lapb_int->state = LAPB_STATE_3; lapb_int->condition = 0x00; lapb_int->vs = 0; lapb_int->vr = 0; //lapb_int->last_vr = 0; lapb_int->va = 0; lapb->callbacks->debug(1, "[LAPB] S0 -> S3"); lapb_connect_indication(lapb, LAPB_OK); } else { lapb->callbacks->debug(2, "[LAPB] S0 TX DM(%d)", frame->pf); lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); }; break; case LAPB_DM: if (!lapb->auto_connecting) break; lapb->callbacks->debug(2, "[LAPB] S0 RX DM(%d)", frame->pf); lapb_int->condition = 0x00; if (lapb_is_extended(lapb)) { lapb->callbacks->debug(2, "[LAPB] S0 TX SABME(1)"); lapb_send_control(lapb, LAPB_SABME, LAPB_POLLON, LAPB_COMMAND); } else { lapb->callbacks->debug(2, "[LAPB] S0 TX SABM(1)"); lapb_send_control(lapb, LAPB_SABM, LAPB_POLLON, LAPB_COMMAND); }; lapb_int->state = LAPB_STATE_1; lapb->callbacks->debug(1, "[LAPB] S0 -> S1"); break; // case LAPB_DISC: // lapb_debug(lapb, 1, "[LAPB] S0 RX DISC(%d)", frame->pf); // lapb_debug(lapb, 1, "[LAPB] S0 TX UA(%d)", frame->pf); // lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); // break; default: break; }; }