⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lapb_in.c

📁 ARM 嵌入式 系统 设计与实例开发 实验教材 二源码
💻 C
📖 第 1 页 / 共 2 页
字号:
			printk(KERN_DEBUG "lapb: (%p) S3 RX SABME(%d)\n", lapb->token, frame->pf);#endif			if (lapb->mode & LAPB_EXTENDED) {#if LAPB_DEBUG > 1				printk(KERN_DEBUG "lapb: (%p) S3 TX UA(%d)\n", lapb->token, frame->pf);#endif				lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE);				lapb_stop_t1timer(lapb);				lapb_stop_t2timer(lapb);				lapb->condition = 0x00;				lapb->n2count   = 0;				lapb->vs        = 0;				lapb->vr        = 0;				lapb->va        = 0;				lapb_requeue_frames(lapb);			} else {#if LAPB_DEBUG > 1				printk(KERN_DEBUG "lapb: (%p) S3 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) S3 RX DISC(%d)\n", lapb->token, frame->pf);#endif#if LAPB_DEBUG > 0			printk(KERN_DEBUG "lapb: (%p) S3 -> S0\n", lapb->token);#endif			lapb_clear_queues(lapb);			lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE);			lapb_start_t1timer(lapb);			lapb_stop_t2timer(lapb);			lapb->state = LAPB_STATE_0;			lapb_disconnect_indication(lapb, LAPB_OK);			break;		case LAPB_DM:#if LAPB_DEBUG > 1			printk(KERN_DEBUG "lapb: (%p) S3 RX DM(%d)\n", lapb->token, frame->pf);#endif#if LAPB_DEBUG > 0			printk(KERN_DEBUG "lapb: (%p) S3 -> 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_NOTCONNECTED);			break;		case LAPB_RNR:#if LAPB_DEBUG > 1			printk(KERN_DEBUG "lapb: (%p) S3 RX RNR(%d) R%d\n", lapb->token, frame->pf, frame->nr);#endif			lapb->condition |= LAPB_PEER_RX_BUSY_CONDITION;			lapb_check_need_response(lapb, frame->cr, frame->pf);			if (lapb_validate_nr(lapb, frame->nr)) {				lapb_check_iframes_acked(lapb, frame->nr);			} else {				lapb->frmr_data = *frame;				lapb->frmr_type = LAPB_FRMR_Z;				lapb_transmit_frmr(lapb);#if LAPB_DEBUG > 0				printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->token);#endif				lapb_start_t1timer(lapb);				lapb_stop_t2timer(lapb);				lapb->state   = LAPB_STATE_4;				lapb->n2count = 0;			}			break;		case LAPB_RR:#if LAPB_DEBUG > 1			printk(KERN_DEBUG "lapb: (%p) S3 RX RR(%d) R%d\n", lapb->token, frame->pf, frame->nr);#endif			lapb->condition &= ~LAPB_PEER_RX_BUSY_CONDITION;			lapb_check_need_response(lapb, frame->cr, frame->pf);			if (lapb_validate_nr(lapb, frame->nr)) {				lapb_check_iframes_acked(lapb, frame->nr);			} else {				lapb->frmr_data = *frame;				lapb->frmr_type = LAPB_FRMR_Z;				lapb_transmit_frmr(lapb);#if LAPB_DEBUG > 0				printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->token);#endif				lapb_start_t1timer(lapb);				lapb_stop_t2timer(lapb);				lapb->state   = LAPB_STATE_4;				lapb->n2count = 0;			}			break;		case LAPB_REJ:#if LAPB_DEBUG > 1			printk(KERN_DEBUG "lapb: (%p) S3 RX REJ(%d) R%d\n", lapb->token, frame->pf, frame->nr);#endif			lapb->condition &= ~LAPB_PEER_RX_BUSY_CONDITION;			lapb_check_need_response(lapb, frame->cr, frame->pf);			if (lapb_validate_nr(lapb, frame->nr)) {				lapb_frames_acked(lapb, frame->nr);				lapb_stop_t1timer(lapb);				lapb->n2count = 0;				lapb_requeue_frames(lapb);			} else {				lapb->frmr_data = *frame;				lapb->frmr_type = LAPB_FRMR_Z;				lapb_transmit_frmr(lapb);#if LAPB_DEBUG > 0				printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->token);#endif				lapb_start_t1timer(lapb);				lapb_stop_t2timer(lapb);				lapb->state   = LAPB_STATE_4;				lapb->n2count = 0;			}			break;		case LAPB_I:#if LAPB_DEBUG > 1			printk(KERN_DEBUG "lapb: (%p) S3 RX I(%d) S%d R%d\n", lapb->token, frame->pf, frame->ns, frame->nr);#endif			if (!lapb_validate_nr(lapb, frame->nr)) {				lapb->frmr_data = *frame;				lapb->frmr_type = LAPB_FRMR_Z;				lapb_transmit_frmr(lapb);#if LAPB_DEBUG > 0				printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->token);#endif				lapb_start_t1timer(lapb);				lapb_stop_t2timer(lapb);				lapb->state   = LAPB_STATE_4;				lapb->n2count = 0;				break;			}			if (lapb->condition & LAPB_PEER_RX_BUSY_CONDITION) {				lapb_frames_acked(lapb, frame->nr);			} else {				lapb_check_iframes_acked(lapb, frame->nr);			}			if (frame->ns == lapb->vr) {				int cn;				cn = lapb_data_indication(lapb, skb);				queued = 1;				/*				 * If upper layer has dropped the frame, we				 * basically ignore any further protocol				 * processing. This will cause the peer				 * to re-transmit the frame later like				 * a frame lost on the wire.				 */				if(cn == NET_RX_DROP){					printk(KERN_DEBUG "LAPB: rx congestion\n");					break;				}				lapb->vr = (lapb->vr + 1) % modulus;				lapb->condition &= ~LAPB_REJECT_CONDITION;				if (frame->pf) {					lapb_enquiry_response(lapb);				} else {					if (!(lapb->condition & LAPB_ACK_PENDING_CONDITION)) {						lapb->condition |= LAPB_ACK_PENDING_CONDITION;						lapb_start_t2timer(lapb);					}				}			} else {				if (lapb->condition & LAPB_REJECT_CONDITION) {					if (frame->pf)						lapb_enquiry_response(lapb);				} else {#if LAPB_DEBUG > 1					printk(KERN_DEBUG "lapb: (%p) S3 TX REJ(%d) R%d\n", lapb->token, frame->pf, lapb->vr);#endif					lapb->condition |= LAPB_REJECT_CONDITION;					lapb_send_control(lapb, LAPB_REJ, frame->pf, LAPB_RESPONSE);					lapb->condition &= ~LAPB_ACK_PENDING_CONDITION;				}			}			break;		case LAPB_FRMR:#if LAPB_DEBUG > 1			printk(KERN_DEBUG "lapb: (%p) S3 RX FRMR(%d) %02X %02X %02X %02X %02X\n", lapb->token, frame->pf, skb->data[0], skb->data[1], skb->data[2], skb->data[3], skb->data[4]);#endif			lapb_establish_data_link(lapb);#if LAPB_DEBUG > 0			printk(KERN_DEBUG "lapb: (%p) S3 -> S1\n", lapb->token);#endif			lapb_requeue_frames(lapb);			lapb->state = LAPB_STATE_1;			break;		case LAPB_ILLEGAL:#if LAPB_DEBUG > 1			printk(KERN_DEBUG "lapb: (%p) S3 RX ILLEGAL(%d)\n", lapb->token, frame->pf);#endif			lapb->frmr_data = *frame;			lapb->frmr_type = LAPB_FRMR_W;			lapb_transmit_frmr(lapb);#if LAPB_DEBUG > 0			printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->token);#endif			lapb_start_t1timer(lapb);			lapb_stop_t2timer(lapb);			lapb->state   = LAPB_STATE_4;			lapb->n2count = 0;			break;		default:			break;	}	if (!queued)		kfree_skb(skb);}/* *	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(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) S4 RX SABM(%d)\n", lapb->token, frame->pf);#endif			if (lapb->mode & LAPB_EXTENDED) {#if LAPB_DEBUG > 1				printk(KERN_DEBUG "lapb: (%p) S4 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) S4 TX UA(%d)\n", lapb->token, frame->pf);#endif#if LAPB_DEBUG > 0				printk(KERN_DEBUG "lapb: (%p) S4 -> S3\n", lapb->token);#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) S4 RX SABME(%d)\n", lapb->token, frame->pf);#endif			if (lapb->mode & LAPB_EXTENDED) {#if LAPB_DEBUG > 1				printk(KERN_DEBUG "lapb: (%p) S4 TX UA(%d)\n", lapb->token, frame->pf);#endif#if LAPB_DEBUG > 0				printk(KERN_DEBUG "lapb: (%p) S4 -> S3\n", lapb->token);#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) S4 TX DM(%d)\n", lapb->token, frame->pf);#endif				lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE);			}			break;		default:			break;	}	kfree_skb(skb);}/* *	Process an incoming LAPB frame */void lapb_data_input(lapb_cb *lapb, struct sk_buff *skb){	struct lapb_frame frame;	lapb_decode(lapb, skb, &frame);	switch (lapb->state) {		case LAPB_STATE_0:			lapb_state0_machine(lapb, skb, &frame);			break;		case LAPB_STATE_1:			lapb_state1_machine(lapb, skb, &frame);			break;		case LAPB_STATE_2:			lapb_state2_machine(lapb, skb, &frame);			break;		case LAPB_STATE_3:			lapb_state3_machine(lapb, skb, &frame);			break;		case LAPB_STATE_4:			lapb_state4_machine(lapb, skb, &frame);			break;	}	lapb_kick(lapb);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -