xref: /linux/net/lapb/lapb_in.c (revision 3a4fa0a25da81600ea0bcd75692ae8ca6050d165)
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   */
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   */
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   */
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   */
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   */
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   */
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