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