• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *	LAPB release 002
3  *
4  *	This code REQUIRES 2.1.15 or higher/ NET3.038
5  *
6  *	This module:
7  *		This module is free software; you can redistribute it and/or
8  *		modify it under the terms of the GNU General Public License
9  *		as published by the Free Software Foundation; either version
10  *		2 of the License, or (at your option) any later version.
11  *
12  *	History
13  *	LAPB 001	Jonathan Naulor	Started Coding
14  *	LAPB 002	Jonathan Naylor	New timer architecture.
15  *	2000-10-29	Henner Eisen	lapb_data_indication() return status.
16  */
17 
18 #include <linux/errno.h>
19 #include <linux/types.h>
20 #include <linux/socket.h>
21 #include <linux/in.h>
22 #include <linux/kernel.h>
23 #include <linux/timer.h>
24 #include <linux/string.h>
25 #include <linux/sockios.h>
26 #include <linux/net.h>
27 #include <linux/inet.h>
28 #include <linux/netdevice.h>
29 #include <linux/skbuff.h>
30 #include <net/sock.h>
31 #include <asm/uaccess.h>
32 #include <asm/system.h>
33 #include <linux/fcntl.h>
34 #include <linux/mm.h>
35 #include <linux/interrupt.h>
36 #include <net/lapb.h>
37 
38 /*
39  *	State machine for state 0, Disconnected State.
40  *	The handling of the timer(s) is in file lapb_timer.c.
41  */
lapb_state0_machine(struct lapb_cb * lapb,struct sk_buff * skb,struct lapb_frame * frame)42 static void lapb_state0_machine(struct lapb_cb *lapb, struct sk_buff *skb,
43 				struct lapb_frame *frame)
44 {
45 	switch (frame->type) {
46 		case LAPB_SABM:
47 #if LAPB_DEBUG > 1
48 			printk(KERN_DEBUG "lapb: (%p) S0 RX SABM(%d)\n",
49 			       lapb->dev, frame->pf);
50 #endif
51 			if (lapb->mode & LAPB_EXTENDED) {
52 #if LAPB_DEBUG > 1
53 				printk(KERN_DEBUG "lapb: (%p) S0 TX DM(%d)\n",
54 				       lapb->dev, frame->pf);
55 #endif
56 				lapb_send_control(lapb, LAPB_DM, frame->pf,
57 						  LAPB_RESPONSE);
58 			} else {
59 #if LAPB_DEBUG > 1
60 				printk(KERN_DEBUG "lapb: (%p) S0 TX UA(%d)\n",
61 				       lapb->dev, frame->pf);
62 #endif
63 #if LAPB_DEBUG > 0
64 				printk(KERN_DEBUG "lapb: (%p) S0 -> S3\n",
65 				       lapb->dev);
66 #endif
67 				lapb_send_control(lapb, LAPB_UA, frame->pf,
68 						  LAPB_RESPONSE);
69 				lapb_stop_t1timer(lapb);
70 				lapb_stop_t2timer(lapb);
71 				lapb->state     = LAPB_STATE_3;
72 				lapb->condition = 0x00;
73 				lapb->n2count   = 0;
74 				lapb->vs        = 0;
75 				lapb->vr        = 0;
76 				lapb->va        = 0;
77 				lapb_connect_indication(lapb, LAPB_OK);
78 			}
79 			break;
80 
81 		case LAPB_SABME:
82 #if LAPB_DEBUG > 1
83 			printk(KERN_DEBUG "lapb: (%p) S0 RX SABME(%d)\n",
84 			       lapb->dev, frame->pf);
85 #endif
86 			if (lapb->mode & LAPB_EXTENDED) {
87 #if LAPB_DEBUG > 1
88 				printk(KERN_DEBUG "lapb: (%p) S0 TX UA(%d)\n",
89 				       lapb->dev, frame->pf);
90 #endif
91 #if LAPB_DEBUG > 0
92 				printk(KERN_DEBUG "lapb: (%p) S0 -> S3\n",
93 				       lapb->dev);
94 #endif
95 				lapb_send_control(lapb, LAPB_UA, frame->pf,
96 						  LAPB_RESPONSE);
97 				lapb_stop_t1timer(lapb);
98 				lapb_stop_t2timer(lapb);
99 				lapb->state     = LAPB_STATE_3;
100 				lapb->condition = 0x00;
101 				lapb->n2count   = 0;
102 				lapb->vs        = 0;
103 				lapb->vr        = 0;
104 				lapb->va        = 0;
105 				lapb_connect_indication(lapb, LAPB_OK);
106 			} else {
107 #if LAPB_DEBUG > 1
108 				printk(KERN_DEBUG "lapb: (%p) S0 TX DM(%d)\n",
109 				       lapb->dev, frame->pf);
110 #endif
111 				lapb_send_control(lapb, LAPB_DM, frame->pf,
112 						  LAPB_RESPONSE);
113 			}
114 			break;
115 
116 		case LAPB_DISC:
117 #if LAPB_DEBUG > 1
118 			printk(KERN_DEBUG "lapb: (%p) S0 RX DISC(%d)\n",
119 			       lapb->dev, frame->pf);
120 			printk(KERN_DEBUG "lapb: (%p) S0 TX UA(%d)\n",
121 			       lapb->dev, frame->pf);
122 #endif
123 			lapb_send_control(lapb, LAPB_UA, frame->pf,
124 					  LAPB_RESPONSE);
125 			break;
126 
127 		default:
128 			break;
129 	}
130 
131 	kfree_skb(skb);
132 }
133 
134 /*
135  *	State machine for state 1, Awaiting Connection State.
136  *	The handling of the timer(s) is in file lapb_timer.c.
137  */
lapb_state1_machine(struct lapb_cb * lapb,struct sk_buff * skb,struct lapb_frame * frame)138 static void lapb_state1_machine(struct lapb_cb *lapb, struct sk_buff *skb,
139 				struct lapb_frame *frame)
140 {
141 	switch (frame->type) {
142 		case LAPB_SABM:
143 #if LAPB_DEBUG > 1
144 			printk(KERN_DEBUG "lapb: (%p) S1 RX SABM(%d)\n",
145 			       lapb->dev, frame->pf);
146 #endif
147 			if (lapb->mode & LAPB_EXTENDED) {
148 #if LAPB_DEBUG > 1
149 				printk(KERN_DEBUG "lapb: (%p) S1 TX DM(%d)\n",
150 				       lapb->dev, frame->pf);
151 #endif
152 				lapb_send_control(lapb, LAPB_DM, frame->pf,
153 						  LAPB_RESPONSE);
154 			} else {
155 #if LAPB_DEBUG > 1
156 				printk(KERN_DEBUG "lapb: (%p) S1 TX UA(%d)\n",
157 				       lapb->dev, frame->pf);
158 #endif
159 				lapb_send_control(lapb, LAPB_UA, frame->pf,
160 						  LAPB_RESPONSE);
161 			}
162 			break;
163 
164 		case LAPB_SABME:
165 #if LAPB_DEBUG > 1
166 			printk(KERN_DEBUG "lapb: (%p) S1 RX SABME(%d)\n",
167 			       lapb->dev, frame->pf);
168 #endif
169 			if (lapb->mode & LAPB_EXTENDED) {
170 #if LAPB_DEBUG > 1
171 				printk(KERN_DEBUG "lapb: (%p) S1 TX UA(%d)\n",
172 				       lapb->dev, frame->pf);
173 #endif
174 				lapb_send_control(lapb, LAPB_UA, frame->pf,
175 						  LAPB_RESPONSE);
176 			} else {
177 #if LAPB_DEBUG > 1
178 				printk(KERN_DEBUG "lapb: (%p) S1 TX DM(%d)\n",
179 				       lapb->dev, frame->pf);
180 #endif
181 				lapb_send_control(lapb, LAPB_DM, frame->pf,
182 						  LAPB_RESPONSE);
183 			}
184 			break;
185 
186 		case LAPB_DISC:
187 #if LAPB_DEBUG > 1
188 			printk(KERN_DEBUG "lapb: (%p) S1 RX DISC(%d)\n",
189 			       lapb->dev, frame->pf);
190 			printk(KERN_DEBUG "lapb: (%p) S1 TX DM(%d)\n",
191 			       lapb->dev, frame->pf);
192 #endif
193 			lapb_send_control(lapb, LAPB_DM, frame->pf,
194 					  LAPB_RESPONSE);
195 			break;
196 
197 		case LAPB_UA:
198 #if LAPB_DEBUG > 1
199 			printk(KERN_DEBUG "lapb: (%p) S1 RX UA(%d)\n",
200 			       lapb->dev, frame->pf);
201 #endif
202 			if (frame->pf) {
203 #if LAPB_DEBUG > 0
204 				printk(KERN_DEBUG "lapb: (%p) S1 -> S3\n",
205 				       lapb->dev);
206 #endif
207 				lapb_stop_t1timer(lapb);
208 				lapb_stop_t2timer(lapb);
209 				lapb->state     = LAPB_STATE_3;
210 				lapb->condition = 0x00;
211 				lapb->n2count   = 0;
212 				lapb->vs        = 0;
213 				lapb->vr        = 0;
214 				lapb->va        = 0;
215 				lapb_connect_confirmation(lapb, LAPB_OK);
216 			}
217 			break;
218 
219 		case LAPB_DM:
220 #if LAPB_DEBUG > 1
221 			printk(KERN_DEBUG "lapb: (%p) S1 RX DM(%d)\n",
222 			       lapb->dev, frame->pf);
223 #endif
224 			if (frame->pf) {
225 #if LAPB_DEBUG > 0
226 				printk(KERN_DEBUG "lapb: (%p) S1 -> S0\n",
227 				       lapb->dev);
228 #endif
229 				lapb_clear_queues(lapb);
230 				lapb->state = LAPB_STATE_0;
231 				lapb_start_t1timer(lapb);
232 				lapb_stop_t2timer(lapb);
233 				lapb_disconnect_indication(lapb, LAPB_REFUSED);
234 			}
235 			break;
236 	}
237 
238 	kfree_skb(skb);
239 }
240 
241 /*
242  *	State machine for state 2, Awaiting Release State.
243  *	The handling of the timer(s) is in file lapb_timer.c
244  */
lapb_state2_machine(struct lapb_cb * lapb,struct sk_buff * skb,struct lapb_frame * frame)245 static void lapb_state2_machine(struct lapb_cb *lapb, struct sk_buff *skb,
246 				struct lapb_frame *frame)
247 {
248 	switch (frame->type) {
249 		case LAPB_SABM:
250 		case LAPB_SABME:
251 #if LAPB_DEBUG > 1
252 			printk(KERN_DEBUG "lapb: (%p) S2 RX {SABM,SABME}(%d)\n",
253 			       lapb->dev, frame->pf);
254 			printk(KERN_DEBUG "lapb: (%p) S2 TX DM(%d)\n",
255 			       lapb->dev, frame->pf);
256 #endif
257 			lapb_send_control(lapb, LAPB_DM, frame->pf,
258 					  LAPB_RESPONSE);
259 			break;
260 
261 		case LAPB_DISC:
262 #if LAPB_DEBUG > 1
263 			printk(KERN_DEBUG "lapb: (%p) S2 RX DISC(%d)\n",
264 			       lapb->dev, frame->pf);
265 			printk(KERN_DEBUG "lapb: (%p) S2 TX UA(%d)\n",
266 			       lapb->dev, frame->pf);
267 #endif
268 			lapb_send_control(lapb, LAPB_UA, frame->pf,
269 					  LAPB_RESPONSE);
270 			break;
271 
272 		case LAPB_UA:
273 #if LAPB_DEBUG > 1
274 			printk(KERN_DEBUG "lapb: (%p) S2 RX UA(%d)\n",
275 			       lapb->dev, frame->pf);
276 #endif
277 			if (frame->pf) {
278 #if LAPB_DEBUG > 0
279 				printk(KERN_DEBUG "lapb: (%p) S2 -> S0\n",
280 				       lapb->dev);
281 #endif
282 				lapb->state = LAPB_STATE_0;
283 				lapb_start_t1timer(lapb);
284 				lapb_stop_t2timer(lapb);
285 				lapb_disconnect_confirmation(lapb, LAPB_OK);
286 			}
287 			break;
288 
289 		case LAPB_DM:
290 #if LAPB_DEBUG > 1
291 			printk(KERN_DEBUG "lapb: (%p) S2 RX DM(%d)\n",
292 			       lapb->dev, frame->pf);
293 #endif
294 			if (frame->pf) {
295 #if LAPB_DEBUG > 0
296 				printk(KERN_DEBUG "lapb: (%p) S2 -> S0\n",
297 				       lapb->dev);
298 #endif
299 				lapb->state = LAPB_STATE_0;
300 				lapb_start_t1timer(lapb);
301 				lapb_stop_t2timer(lapb);
302 				lapb_disconnect_confirmation(lapb,
303 							     LAPB_NOTCONNECTED);
304 			}
305 			break;
306 
307 		case LAPB_I:
308 		case LAPB_REJ:
309 		case LAPB_RNR:
310 		case LAPB_RR:
311 #if LAPB_DEBUG > 1
312 			printk(KERN_DEBUG "lapb: (%p) S2 RX {I,REJ,RNR,RR}"
313 			       "(%d)\n", lapb->dev, frame->pf);
314 			printk(KERN_DEBUG "lapb: (%p) S2 RX DM(%d)\n",
315 			       lapb->dev, frame->pf);
316 #endif
317 			if (frame->pf)
318 				lapb_send_control(lapb, LAPB_DM, frame->pf,
319 						  LAPB_RESPONSE);
320 			break;
321 	}
322 
323 	kfree_skb(skb);
324 }
325 
326 /*
327  *	State machine for state 3, Connected State.
328  *	The handling of the timer(s) is in file lapb_timer.c
329  */
lapb_state3_machine(struct lapb_cb * lapb,struct sk_buff * skb,struct lapb_frame * frame)330 static void lapb_state3_machine(struct lapb_cb *lapb, struct sk_buff *skb,
331 				struct lapb_frame *frame)
332 {
333 	int queued = 0;
334 	int modulus = (lapb->mode & LAPB_EXTENDED) ? LAPB_EMODULUS :
335 						     LAPB_SMODULUS;
336 
337 	switch (frame->type) {
338 		case LAPB_SABM:
339 #if LAPB_DEBUG > 1
340 			printk(KERN_DEBUG "lapb: (%p) S3 RX SABM(%d)\n",
341 			       lapb->dev, frame->pf);
342 #endif
343 			if (lapb->mode & LAPB_EXTENDED) {
344 #if LAPB_DEBUG > 1
345 				printk(KERN_DEBUG "lapb: (%p) S3 TX DM(%d)\n",
346 				       lapb->dev, frame->pf);
347 #endif
348 				lapb_send_control(lapb, LAPB_DM, frame->pf,
349 						  LAPB_RESPONSE);
350 			} else {
351 #if LAPB_DEBUG > 1
352 				printk(KERN_DEBUG "lapb: (%p) S3 TX UA(%d)\n",
353 				       lapb->dev, frame->pf);
354 #endif
355 				lapb_send_control(lapb, LAPB_UA, frame->pf,
356 						  LAPB_RESPONSE);
357 				lapb_stop_t1timer(lapb);
358 				lapb_stop_t2timer(lapb);
359 				lapb->condition = 0x00;
360 				lapb->n2count   = 0;
361 				lapb->vs        = 0;
362 				lapb->vr        = 0;
363 				lapb->va        = 0;
364 				lapb_requeue_frames(lapb);
365 			}
366 			break;
367 
368 		case LAPB_SABME:
369 #if LAPB_DEBUG > 1
370 			printk(KERN_DEBUG "lapb: (%p) S3 RX SABME(%d)\n",
371 			       lapb->dev, frame->pf);
372 #endif
373 			if (lapb->mode & LAPB_EXTENDED) {
374 #if LAPB_DEBUG > 1
375 				printk(KERN_DEBUG "lapb: (%p) S3 TX UA(%d)\n",
376 				       lapb->dev, frame->pf);
377 #endif
378 				lapb_send_control(lapb, LAPB_UA, frame->pf,
379 						  LAPB_RESPONSE);
380 				lapb_stop_t1timer(lapb);
381 				lapb_stop_t2timer(lapb);
382 				lapb->condition = 0x00;
383 				lapb->n2count   = 0;
384 				lapb->vs        = 0;
385 				lapb->vr        = 0;
386 				lapb->va        = 0;
387 				lapb_requeue_frames(lapb);
388 			} else {
389 #if LAPB_DEBUG > 1
390 				printk(KERN_DEBUG "lapb: (%p) S3 TX DM(%d)\n",
391 				       lapb->dev, frame->pf);
392 #endif
393 				lapb_send_control(lapb, LAPB_DM, frame->pf,
394 						  LAPB_RESPONSE);
395 			}
396 			break;
397 
398 		case LAPB_DISC:
399 #if LAPB_DEBUG > 1
400 			printk(KERN_DEBUG "lapb: (%p) S3 RX DISC(%d)\n",
401 			       lapb->dev, frame->pf);
402 #endif
403 #if LAPB_DEBUG > 0
404 			printk(KERN_DEBUG "lapb: (%p) S3 -> S0\n",
405 			       lapb->dev);
406 #endif
407 			lapb_clear_queues(lapb);
408 			lapb_send_control(lapb, LAPB_UA, frame->pf,
409 					  LAPB_RESPONSE);
410 			lapb_start_t1timer(lapb);
411 			lapb_stop_t2timer(lapb);
412 			lapb->state = LAPB_STATE_0;
413 			lapb_disconnect_indication(lapb, LAPB_OK);
414 			break;
415 
416 		case LAPB_DM:
417 #if LAPB_DEBUG > 1
418 			printk(KERN_DEBUG "lapb: (%p) S3 RX DM(%d)\n",
419 			       lapb->dev, frame->pf);
420 #endif
421 #if LAPB_DEBUG > 0
422 			printk(KERN_DEBUG "lapb: (%p) S3 -> S0\n",
423 			       lapb->dev);
424 #endif
425 			lapb_clear_queues(lapb);
426 			lapb->state = LAPB_STATE_0;
427 			lapb_start_t1timer(lapb);
428 			lapb_stop_t2timer(lapb);
429 			lapb_disconnect_indication(lapb, LAPB_NOTCONNECTED);
430 			break;
431 
432 		case LAPB_RNR:
433 #if LAPB_DEBUG > 1
434 			printk(KERN_DEBUG "lapb: (%p) S3 RX RNR(%d) R%d\n",
435 			       lapb->dev, frame->pf, frame->nr);
436 #endif
437 			lapb->condition |= LAPB_PEER_RX_BUSY_CONDITION;
438 			lapb_check_need_response(lapb, frame->cr, frame->pf);
439 			if (lapb_validate_nr(lapb, frame->nr)) {
440 				lapb_check_iframes_acked(lapb, frame->nr);
441 			} else {
442 				lapb->frmr_data = *frame;
443 				lapb->frmr_type = LAPB_FRMR_Z;
444 				lapb_transmit_frmr(lapb);
445 #if LAPB_DEBUG > 0
446 				printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n",
447 				       lapb->dev);
448 #endif
449 				lapb_start_t1timer(lapb);
450 				lapb_stop_t2timer(lapb);
451 				lapb->state   = LAPB_STATE_4;
452 				lapb->n2count = 0;
453 			}
454 			break;
455 
456 		case LAPB_RR:
457 #if LAPB_DEBUG > 1
458 			printk(KERN_DEBUG "lapb: (%p) S3 RX RR(%d) R%d\n",
459 			       lapb->dev, frame->pf, frame->nr);
460 #endif
461 			lapb->condition &= ~LAPB_PEER_RX_BUSY_CONDITION;
462 			lapb_check_need_response(lapb, frame->cr, frame->pf);
463 			if (lapb_validate_nr(lapb, frame->nr)) {
464 				lapb_check_iframes_acked(lapb, frame->nr);
465 			} else {
466 				lapb->frmr_data = *frame;
467 				lapb->frmr_type = LAPB_FRMR_Z;
468 				lapb_transmit_frmr(lapb);
469 #if LAPB_DEBUG > 0
470 				printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n",
471 				       lapb->dev);
472 #endif
473 				lapb_start_t1timer(lapb);
474 				lapb_stop_t2timer(lapb);
475 				lapb->state   = LAPB_STATE_4;
476 				lapb->n2count = 0;
477 			}
478 			break;
479 
480 		case LAPB_REJ:
481 #if LAPB_DEBUG > 1
482 			printk(KERN_DEBUG "lapb: (%p) S3 RX REJ(%d) R%d\n",
483 			       lapb->dev, frame->pf, frame->nr);
484 #endif
485 			lapb->condition &= ~LAPB_PEER_RX_BUSY_CONDITION;
486 			lapb_check_need_response(lapb, frame->cr, frame->pf);
487 			if (lapb_validate_nr(lapb, frame->nr)) {
488 				lapb_frames_acked(lapb, frame->nr);
489 				lapb_stop_t1timer(lapb);
490 				lapb->n2count = 0;
491 				lapb_requeue_frames(lapb);
492 			} else {
493 				lapb->frmr_data = *frame;
494 				lapb->frmr_type = LAPB_FRMR_Z;
495 				lapb_transmit_frmr(lapb);
496 #if LAPB_DEBUG > 0
497 				printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n",
498 				       lapb->dev);
499 #endif
500 				lapb_start_t1timer(lapb);
501 				lapb_stop_t2timer(lapb);
502 				lapb->state   = LAPB_STATE_4;
503 				lapb->n2count = 0;
504 			}
505 			break;
506 
507 		case LAPB_I:
508 #if LAPB_DEBUG > 1
509 			printk(KERN_DEBUG "lapb: (%p) S3 RX I(%d) S%d R%d\n",
510 			       lapb->dev, frame->pf, frame->ns, frame->nr);
511 #endif
512 			if (!lapb_validate_nr(lapb, frame->nr)) {
513 				lapb->frmr_data = *frame;
514 				lapb->frmr_type = LAPB_FRMR_Z;
515 				lapb_transmit_frmr(lapb);
516 #if LAPB_DEBUG > 0
517 				printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n",
518 				       lapb->dev);
519 #endif
520 				lapb_start_t1timer(lapb);
521 				lapb_stop_t2timer(lapb);
522 				lapb->state   = LAPB_STATE_4;
523 				lapb->n2count = 0;
524 				break;
525 			}
526 			if (lapb->condition & LAPB_PEER_RX_BUSY_CONDITION)
527 				lapb_frames_acked(lapb, frame->nr);
528 			else
529 				lapb_check_iframes_acked(lapb, frame->nr);
530 
531 			if (frame->ns == lapb->vr) {
532 				int cn;
533 				cn = lapb_data_indication(lapb, skb);
534 				queued = 1;
535 				/*
536 				 * If upper layer has dropped the frame, we
537 				 * basically ignore any further protocol
538 				 * processing. This will cause the peer
539 				 * to re-transmit the frame later like
540 				 * a frame lost on the wire.
541 				 */
542 				if (cn == NET_RX_DROP) {
543 					printk(KERN_DEBUG
544 					       "LAPB: rx congestion\n");
545 					break;
546 				}
547 				lapb->vr = (lapb->vr + 1) % modulus;
548 				lapb->condition &= ~LAPB_REJECT_CONDITION;
549 				if (frame->pf)
550 					lapb_enquiry_response(lapb);
551 				else {
552 					if (!(lapb->condition &
553 					      LAPB_ACK_PENDING_CONDITION)) {
554 						lapb->condition |= LAPB_ACK_PENDING_CONDITION;
555 						lapb_start_t2timer(lapb);
556 					}
557 				}
558 			} else {
559 				if (lapb->condition & LAPB_REJECT_CONDITION) {
560 					if (frame->pf)
561 						lapb_enquiry_response(lapb);
562 				} else {
563 #if LAPB_DEBUG > 1
564 					printk(KERN_DEBUG
565 					       "lapb: (%p) S3 TX REJ(%d) R%d\n",
566 					       lapb->dev, frame->pf, lapb->vr);
567 #endif
568 					lapb->condition |= LAPB_REJECT_CONDITION;
569 					lapb_send_control(lapb, LAPB_REJ,
570 							  frame->pf,
571 							  LAPB_RESPONSE);
572 					lapb->condition &= ~LAPB_ACK_PENDING_CONDITION;
573 				}
574 			}
575 			break;
576 
577 		case LAPB_FRMR:
578 #if LAPB_DEBUG > 1
579 			printk(KERN_DEBUG "lapb: (%p) S3 RX FRMR(%d) %02X "
580 			       "%02X %02X %02X %02X\n", lapb->dev, frame->pf,
581 			       skb->data[0], skb->data[1], skb->data[2],
582 			       skb->data[3], skb->data[4]);
583 #endif
584 			lapb_establish_data_link(lapb);
585 #if LAPB_DEBUG > 0
586 			printk(KERN_DEBUG "lapb: (%p) S3 -> S1\n",
587 			       lapb->dev);
588 #endif
589 			lapb_requeue_frames(lapb);
590 			lapb->state = LAPB_STATE_1;
591 			break;
592 
593 		case LAPB_ILLEGAL:
594 #if LAPB_DEBUG > 1
595 			printk(KERN_DEBUG "lapb: (%p) S3 RX ILLEGAL(%d)\n",
596 			       lapb->dev, frame->pf);
597 #endif
598 			lapb->frmr_data = *frame;
599 			lapb->frmr_type = LAPB_FRMR_W;
600 			lapb_transmit_frmr(lapb);
601 #if LAPB_DEBUG > 0
602 			printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->dev);
603 #endif
604 			lapb_start_t1timer(lapb);
605 			lapb_stop_t2timer(lapb);
606 			lapb->state   = LAPB_STATE_4;
607 			lapb->n2count = 0;
608 			break;
609 	}
610 
611 	if (!queued)
612 		kfree_skb(skb);
613 }
614 
615 /*
616  *	State machine for state 4, Frame Reject State.
617  *	The handling of the timer(s) is in file lapb_timer.c.
618  */
lapb_state4_machine(struct lapb_cb * lapb,struct sk_buff * skb,struct lapb_frame * frame)619 static void lapb_state4_machine(struct lapb_cb *lapb, struct sk_buff *skb,
620 				struct lapb_frame *frame)
621 {
622 	switch (frame->type) {
623 		case LAPB_SABM:
624 #if LAPB_DEBUG > 1
625 			printk(KERN_DEBUG "lapb: (%p) S4 RX SABM(%d)\n",
626 			       lapb->dev, frame->pf);
627 #endif
628 			if (lapb->mode & LAPB_EXTENDED) {
629 #if LAPB_DEBUG > 1
630 				printk(KERN_DEBUG "lapb: (%p) S4 TX DM(%d)\n",
631 				       lapb->dev, frame->pf);
632 #endif
633 				lapb_send_control(lapb, LAPB_DM, frame->pf,
634 						  LAPB_RESPONSE);
635 			} else {
636 #if LAPB_DEBUG > 1
637 				printk(KERN_DEBUG "lapb: (%p) S4 TX UA(%d)\n",
638 				       lapb->dev, frame->pf);
639 #endif
640 #if LAPB_DEBUG > 0
641 				printk(KERN_DEBUG "lapb: (%p) S4 -> S3\n",
642 				       lapb->dev);
643 #endif
644 				lapb_send_control(lapb, LAPB_UA, frame->pf,
645 						  LAPB_RESPONSE);
646 				lapb_stop_t1timer(lapb);
647 				lapb_stop_t2timer(lapb);
648 				lapb->state     = LAPB_STATE_3;
649 				lapb->condition = 0x00;
650 				lapb->n2count   = 0;
651 				lapb->vs        = 0;
652 				lapb->vr        = 0;
653 				lapb->va        = 0;
654 				lapb_connect_indication(lapb, LAPB_OK);
655 			}
656 			break;
657 
658 		case LAPB_SABME:
659 #if LAPB_DEBUG > 1
660 			printk(KERN_DEBUG "lapb: (%p) S4 RX SABME(%d)\n",
661 			       lapb->dev, frame->pf);
662 #endif
663 			if (lapb->mode & LAPB_EXTENDED) {
664 #if LAPB_DEBUG > 1
665 				printk(KERN_DEBUG "lapb: (%p) S4 TX UA(%d)\n",
666 				       lapb->dev, frame->pf);
667 #endif
668 #if LAPB_DEBUG > 0
669 				printk(KERN_DEBUG "lapb: (%p) S4 -> S3\n",
670 				       lapb->dev);
671 #endif
672 				lapb_send_control(lapb, LAPB_UA, frame->pf,
673 						  LAPB_RESPONSE);
674 				lapb_stop_t1timer(lapb);
675 				lapb_stop_t2timer(lapb);
676 				lapb->state     = LAPB_STATE_3;
677 				lapb->condition = 0x00;
678 				lapb->n2count   = 0;
679 				lapb->vs        = 0;
680 				lapb->vr        = 0;
681 				lapb->va        = 0;
682 				lapb_connect_indication(lapb, LAPB_OK);
683 			} else {
684 #if LAPB_DEBUG > 1
685 				printk(KERN_DEBUG "lapb: (%p) S4 TX DM(%d)\n",
686 				       lapb->dev, frame->pf);
687 #endif
688 				lapb_send_control(lapb, LAPB_DM, frame->pf,
689 						  LAPB_RESPONSE);
690 			}
691 			break;
692 	}
693 
694 	kfree_skb(skb);
695 }
696 
697 /*
698  *	Process an incoming LAPB frame
699  */
lapb_data_input(struct lapb_cb * lapb,struct sk_buff * skb)700 void lapb_data_input(struct lapb_cb *lapb, struct sk_buff *skb)
701 {
702 	struct lapb_frame frame;
703 
704 	if (lapb_decode(lapb, skb, &frame) < 0) {
705 		kfree_skb(skb);
706 		return;
707 	}
708 
709 	switch (lapb->state) {
710 	case LAPB_STATE_0:
711 		lapb_state0_machine(lapb, skb, &frame); break;
712 	case LAPB_STATE_1:
713 		lapb_state1_machine(lapb, skb, &frame); break;
714 	case LAPB_STATE_2:
715 		lapb_state2_machine(lapb, skb, &frame); break;
716 	case LAPB_STATE_3:
717 		lapb_state3_machine(lapb, skb, &frame); break;
718 	case LAPB_STATE_4:
719 		lapb_state4_machine(lapb, skb, &frame); break;
720 	}
721 
722 	lapb_kick(lapb);
723 }
724