예제 #1
0
/*
 *	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;
	};
}
예제 #2
0
파일: lapb_in.c 프로젝트: 513855417/linux
/*
 *	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);
}
예제 #3
0
/*
 *	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);
}