/* * State machine for state 1, Awaiting Connection State. * The handling of the timer(s) is in file lapb_timer.c. */ void lapb_state1_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] S1 RX SABM(%d)", frame->pf); if (lapb_is_extended(lapb)) { /* Unrecognized mode */ lapb->callbacks->debug(2, "[LAPB] S1 TX DM(%d)", frame->pf); lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); } else { /* Collision state, send UA and switch to state_3 */ lapb->callbacks->debug(2, "[LAPB] S1 TX UA(%d)", frame->pf); lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); lapb_stop_t201timer(lapb); lapb_int->state = LAPB_STATE_3; lapb_int->condition = 0x00; lapb_int->vs = 0; lapb_int->vr = 0; lapb_int->va = 0; lapb->callbacks->debug(1, "[LAPB] S1 -> S3"); lapb_connect_confirmation(lapb, LAPB_OK); }; break; case LAPB_SABME: lapb->callbacks->debug(2, "[LAPB] S1 RX SABME(%d)", frame->pf); if (lapb_is_extended(lapb)) { /* Collision state, send UA and switch to state_3 */ lapb->callbacks->debug(2, "[LAPB] S1 TX UA(%d)", frame->pf); lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); lapb_stop_t201timer(lapb); lapb_int->state = LAPB_STATE_3; lapb_int->condition = 0x00; lapb_int->vs = 0; lapb_int->vr = 0; lapb_int->va = 0; lapb->callbacks->debug(1, "[LAPB] S1 -> S3"); lapb_connect_confirmation(lapb, LAPB_OK); } else { /* Unrecognized mode */ lapb->callbacks->debug(2, "[LAPB] S1 TX DM(%d)", frame->pf); lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); }; break; // case LAPB_DISC: // lapb->callbacks->debug(2, "[LAPB] S1 RX DISC(%d)", frame->pf); // lapb->callbacks->debug(2, "[LAPB] S1 TX DM(%d)", frame->pf); // lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); // lapb_requeue_frames(lapb); // lapb_disconnect_indication(lapb, LAPB_REFUSED); // lapb_reset(lapb, LAPB_STATE_0); // break; case LAPB_UA: lapb->callbacks->debug(2, "[LAPB] S1 RX UA(%d)", frame->pf); if (frame->pf) { lapb_stop_t201timer(lapb); lapb_int->state = LAPB_STATE_3; lapb_int->condition = 0x00; lapb_int->vs = 0; lapb_int->vr = 0; lapb_int->va = 0; lapb->callbacks->debug(1, "[LAPB] S1 -> S3"); lapb_connect_confirmation(lapb, LAPB_OK); }; break; case LAPB_DM: lapb->callbacks->debug(2, "[LAPB] S1 RX DM(%d)", frame->pf); if (frame->pf) { lapb_requeue_frames(lapb); lapb_disconnect_indication(lapb, LAPB_REFUSED); lapb_reset(lapb, LAPB_STATE_0); }; break; }; }
/* * State machine for state 1, Awaiting Connection State. * The handling of the timer(s) is in file lapb_timer.c. */ static void lapb_state1_machine(struct lapb_cb *lapb, struct sk_buff *skb, struct lapb_frame *frame) { switch (frame->type) { case LAPB_SABM: lapb_dbg(1, "(%p) S1 RX SABM(%d)\n", lapb->dev, frame->pf); if (lapb->mode & LAPB_EXTENDED) { lapb_dbg(1, "(%p) S1 TX DM(%d)\n", lapb->dev, frame->pf); lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); } else { lapb_dbg(1, "(%p) S1 TX UA(%d)\n", lapb->dev, frame->pf); lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); } break; case LAPB_SABME: lapb_dbg(1, "(%p) S1 RX SABME(%d)\n", lapb->dev, frame->pf); if (lapb->mode & LAPB_EXTENDED) { lapb_dbg(1, "(%p) S1 TX UA(%d)\n", lapb->dev, frame->pf); lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); } else { lapb_dbg(1, "(%p) S1 TX DM(%d)\n", lapb->dev, frame->pf); lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); } break; case LAPB_DISC: lapb_dbg(1, "(%p) S1 RX DISC(%d)\n", lapb->dev, frame->pf); lapb_dbg(1, "(%p) S1 TX DM(%d)\n", lapb->dev, frame->pf); lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); break; case LAPB_UA: lapb_dbg(1, "(%p) S1 RX UA(%d)\n", lapb->dev, frame->pf); if (frame->pf) { lapb_dbg(0, "(%p) S1 -> S3\n", lapb->dev); 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_confirmation(lapb, LAPB_OK); } break; case LAPB_DM: lapb_dbg(1, "(%p) S1 RX DM(%d)\n", lapb->dev, frame->pf); if (frame->pf) { lapb_dbg(0, "(%p) S1 -> S0\n", lapb->dev); lapb_clear_queues(lapb); lapb->state = LAPB_STATE_0; lapb_start_t1timer(lapb); lapb_stop_t2timer(lapb); lapb_disconnect_indication(lapb, LAPB_REFUSED); } break; } kfree_skb(skb); }
/* * State machine for state 1, Awaiting Connection State. * The handling of the timer(s) is in file lapb_timer.c. */ static void lapb_state1_machine(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) S1 RX SABM(%d)\n", lapb->token, frame->pf); #endif if (lapb->mode & LAPB_EXTENDED) { #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S1 TX DM(%d)\n", lapb->token, frame->pf); #endif lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); } else { #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S1 TX UA(%d)\n", lapb->token, frame->pf); #endif lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); } break; case LAPB_SABME: #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S1 RX SABME(%d)\n", lapb->token, frame->pf); #endif if (lapb->mode & LAPB_EXTENDED) { #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S1 TX UA(%d)\n", lapb->token, frame->pf); #endif lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE); } else { #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S1 TX DM(%d)\n", lapb->token, 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) S1 RX DISC(%d)\n", lapb->token, frame->pf); printk(KERN_DEBUG "lapb: (%p) S1 TX DM(%d)\n", lapb->token, frame->pf); #endif lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE); break; case LAPB_UA: #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S1 RX UA(%d)\n", lapb->token, frame->pf); #endif if (frame->pf) { #if LAPB_DEBUG > 0 printk(KERN_DEBUG "lapb: (%p) S1 -> S3\n", lapb->token); #endif 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_confirmation(lapb, LAPB_OK); } break; case LAPB_DM: #if LAPB_DEBUG > 1 printk(KERN_DEBUG "lapb: (%p) S1 RX DM(%d)\n", lapb->token, frame->pf); #endif if (frame->pf) { #if LAPB_DEBUG > 0 printk(KERN_DEBUG "lapb: (%p) S1 -> S0\n", lapb->token); #endif lapb_clear_queues(lapb); lapb->state = LAPB_STATE_0; lapb_start_t1timer(lapb); lapb_stop_t2timer(lapb); lapb_disconnect_indication(lapb, LAPB_REFUSED); } break; default: break; } kfree_skb(skb); }