4 * This code REQUIRES 2.1.15 or higher/ NET3.038
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.
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.
18 #include <linux/errno.h>
19 #include <linux/types.h>
20 #include <linux/socket.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 <linux/slab.h>
32 #include <asm/uaccess.h>
33 #include <asm/system.h>
34 #include <linux/fcntl.h>
36 #include <linux/interrupt.h>
40 * State machine for state 0, Disconnected State.
41 * The handling of the timer(s) is in file lapb_timer.c.
43 static void lapb_state0_machine(struct lapb_cb
*lapb
, struct sk_buff
*skb
,
44 struct lapb_frame
*frame
)
46 switch (frame
->type
) {
49 printk(KERN_DEBUG
"lapb: (%p) S0 RX SABM(%d)\n",
50 lapb
->dev
, frame
->pf
);
52 if (lapb
->mode
& LAPB_EXTENDED
) {
54 printk(KERN_DEBUG
"lapb: (%p) S0 TX DM(%d)\n",
55 lapb
->dev
, frame
->pf
);
57 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
61 printk(KERN_DEBUG
"lapb: (%p) S0 TX UA(%d)\n",
62 lapb
->dev
, frame
->pf
);
65 printk(KERN_DEBUG
"lapb: (%p) S0 -> S3\n",
68 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
70 lapb_stop_t1timer(lapb
);
71 lapb_stop_t2timer(lapb
);
72 lapb
->state
= LAPB_STATE_3
;
73 lapb
->condition
= 0x00;
78 lapb_connect_indication(lapb
, LAPB_OK
);
84 printk(KERN_DEBUG
"lapb: (%p) S0 RX SABME(%d)\n",
85 lapb
->dev
, frame
->pf
);
87 if (lapb
->mode
& LAPB_EXTENDED
) {
89 printk(KERN_DEBUG
"lapb: (%p) S0 TX UA(%d)\n",
90 lapb
->dev
, frame
->pf
);
93 printk(KERN_DEBUG
"lapb: (%p) S0 -> S3\n",
96 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
98 lapb_stop_t1timer(lapb
);
99 lapb_stop_t2timer(lapb
);
100 lapb
->state
= LAPB_STATE_3
;
101 lapb
->condition
= 0x00;
106 lapb_connect_indication(lapb
, LAPB_OK
);
109 printk(KERN_DEBUG
"lapb: (%p) S0 TX DM(%d)\n",
110 lapb
->dev
, frame
->pf
);
112 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
119 printk(KERN_DEBUG
"lapb: (%p) S0 RX DISC(%d)\n",
120 lapb
->dev
, frame
->pf
);
121 printk(KERN_DEBUG
"lapb: (%p) S0 TX UA(%d)\n",
122 lapb
->dev
, frame
->pf
);
124 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
136 * State machine for state 1, Awaiting Connection State.
137 * The handling of the timer(s) is in file lapb_timer.c.
139 static void lapb_state1_machine(struct lapb_cb
*lapb
, struct sk_buff
*skb
,
140 struct lapb_frame
*frame
)
142 switch (frame
->type
) {
145 printk(KERN_DEBUG
"lapb: (%p) S1 RX SABM(%d)\n",
146 lapb
->dev
, frame
->pf
);
148 if (lapb
->mode
& LAPB_EXTENDED
) {
150 printk(KERN_DEBUG
"lapb: (%p) S1 TX DM(%d)\n",
151 lapb
->dev
, frame
->pf
);
153 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
157 printk(KERN_DEBUG
"lapb: (%p) S1 TX UA(%d)\n",
158 lapb
->dev
, frame
->pf
);
160 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
167 printk(KERN_DEBUG
"lapb: (%p) S1 RX SABME(%d)\n",
168 lapb
->dev
, frame
->pf
);
170 if (lapb
->mode
& LAPB_EXTENDED
) {
172 printk(KERN_DEBUG
"lapb: (%p) S1 TX UA(%d)\n",
173 lapb
->dev
, frame
->pf
);
175 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
179 printk(KERN_DEBUG
"lapb: (%p) S1 TX DM(%d)\n",
180 lapb
->dev
, frame
->pf
);
182 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
189 printk(KERN_DEBUG
"lapb: (%p) S1 RX DISC(%d)\n",
190 lapb
->dev
, frame
->pf
);
191 printk(KERN_DEBUG
"lapb: (%p) S1 TX DM(%d)\n",
192 lapb
->dev
, frame
->pf
);
194 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
200 printk(KERN_DEBUG
"lapb: (%p) S1 RX UA(%d)\n",
201 lapb
->dev
, frame
->pf
);
205 printk(KERN_DEBUG
"lapb: (%p) S1 -> S3\n",
208 lapb_stop_t1timer(lapb
);
209 lapb_stop_t2timer(lapb
);
210 lapb
->state
= LAPB_STATE_3
;
211 lapb
->condition
= 0x00;
216 lapb_connect_confirmation(lapb
, LAPB_OK
);
222 printk(KERN_DEBUG
"lapb: (%p) S1 RX DM(%d)\n",
223 lapb
->dev
, frame
->pf
);
227 printk(KERN_DEBUG
"lapb: (%p) S1 -> S0\n",
230 lapb_clear_queues(lapb
);
231 lapb
->state
= LAPB_STATE_0
;
232 lapb_start_t1timer(lapb
);
233 lapb_stop_t2timer(lapb
);
234 lapb_disconnect_indication(lapb
, LAPB_REFUSED
);
243 * State machine for state 2, Awaiting Release State.
244 * The handling of the timer(s) is in file lapb_timer.c
246 static void lapb_state2_machine(struct lapb_cb
*lapb
, struct sk_buff
*skb
,
247 struct lapb_frame
*frame
)
249 switch (frame
->type
) {
253 printk(KERN_DEBUG
"lapb: (%p) S2 RX {SABM,SABME}(%d)\n",
254 lapb
->dev
, frame
->pf
);
255 printk(KERN_DEBUG
"lapb: (%p) S2 TX DM(%d)\n",
256 lapb
->dev
, frame
->pf
);
258 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
264 printk(KERN_DEBUG
"lapb: (%p) S2 RX DISC(%d)\n",
265 lapb
->dev
, frame
->pf
);
266 printk(KERN_DEBUG
"lapb: (%p) S2 TX UA(%d)\n",
267 lapb
->dev
, frame
->pf
);
269 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
275 printk(KERN_DEBUG
"lapb: (%p) S2 RX UA(%d)\n",
276 lapb
->dev
, frame
->pf
);
280 printk(KERN_DEBUG
"lapb: (%p) S2 -> S0\n",
283 lapb
->state
= LAPB_STATE_0
;
284 lapb_start_t1timer(lapb
);
285 lapb_stop_t2timer(lapb
);
286 lapb_disconnect_confirmation(lapb
, LAPB_OK
);
292 printk(KERN_DEBUG
"lapb: (%p) S2 RX DM(%d)\n",
293 lapb
->dev
, frame
->pf
);
297 printk(KERN_DEBUG
"lapb: (%p) S2 -> S0\n",
300 lapb
->state
= LAPB_STATE_0
;
301 lapb_start_t1timer(lapb
);
302 lapb_stop_t2timer(lapb
);
303 lapb_disconnect_confirmation(lapb
,
313 printk(KERN_DEBUG
"lapb: (%p) S2 RX {I,REJ,RNR,RR}"
314 "(%d)\n", lapb
->dev
, frame
->pf
);
315 printk(KERN_DEBUG
"lapb: (%p) S2 RX DM(%d)\n",
316 lapb
->dev
, frame
->pf
);
319 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
328 * State machine for state 3, Connected State.
329 * The handling of the timer(s) is in file lapb_timer.c
331 static void lapb_state3_machine(struct lapb_cb
*lapb
, struct sk_buff
*skb
,
332 struct lapb_frame
*frame
)
335 int modulus
= (lapb
->mode
& LAPB_EXTENDED
) ? LAPB_EMODULUS
:
338 switch (frame
->type
) {
341 printk(KERN_DEBUG
"lapb: (%p) S3 RX SABM(%d)\n",
342 lapb
->dev
, frame
->pf
);
344 if (lapb
->mode
& LAPB_EXTENDED
) {
346 printk(KERN_DEBUG
"lapb: (%p) S3 TX DM(%d)\n",
347 lapb
->dev
, frame
->pf
);
349 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
353 printk(KERN_DEBUG
"lapb: (%p) S3 TX UA(%d)\n",
354 lapb
->dev
, frame
->pf
);
356 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
358 lapb_stop_t1timer(lapb
);
359 lapb_stop_t2timer(lapb
);
360 lapb
->condition
= 0x00;
365 lapb_requeue_frames(lapb
);
371 printk(KERN_DEBUG
"lapb: (%p) S3 RX SABME(%d)\n",
372 lapb
->dev
, frame
->pf
);
374 if (lapb
->mode
& LAPB_EXTENDED
) {
376 printk(KERN_DEBUG
"lapb: (%p) S3 TX UA(%d)\n",
377 lapb
->dev
, frame
->pf
);
379 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
381 lapb_stop_t1timer(lapb
);
382 lapb_stop_t2timer(lapb
);
383 lapb
->condition
= 0x00;
388 lapb_requeue_frames(lapb
);
391 printk(KERN_DEBUG
"lapb: (%p) S3 TX DM(%d)\n",
392 lapb
->dev
, frame
->pf
);
394 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
401 printk(KERN_DEBUG
"lapb: (%p) S3 RX DISC(%d)\n",
402 lapb
->dev
, frame
->pf
);
405 printk(KERN_DEBUG
"lapb: (%p) S3 -> S0\n",
408 lapb_clear_queues(lapb
);
409 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
411 lapb_start_t1timer(lapb
);
412 lapb_stop_t2timer(lapb
);
413 lapb
->state
= LAPB_STATE_0
;
414 lapb_disconnect_indication(lapb
, LAPB_OK
);
419 printk(KERN_DEBUG
"lapb: (%p) S3 RX DM(%d)\n",
420 lapb
->dev
, frame
->pf
);
423 printk(KERN_DEBUG
"lapb: (%p) S3 -> S0\n",
426 lapb_clear_queues(lapb
);
427 lapb
->state
= LAPB_STATE_0
;
428 lapb_start_t1timer(lapb
);
429 lapb_stop_t2timer(lapb
);
430 lapb_disconnect_indication(lapb
, LAPB_NOTCONNECTED
);
435 printk(KERN_DEBUG
"lapb: (%p) S3 RX RNR(%d) R%d\n",
436 lapb
->dev
, frame
->pf
, frame
->nr
);
438 lapb
->condition
|= LAPB_PEER_RX_BUSY_CONDITION
;
439 lapb_check_need_response(lapb
, frame
->cr
, frame
->pf
);
440 if (lapb_validate_nr(lapb
, frame
->nr
)) {
441 lapb_check_iframes_acked(lapb
, frame
->nr
);
443 lapb
->frmr_data
= *frame
;
444 lapb
->frmr_type
= LAPB_FRMR_Z
;
445 lapb_transmit_frmr(lapb
);
447 printk(KERN_DEBUG
"lapb: (%p) S3 -> S4\n",
450 lapb_start_t1timer(lapb
);
451 lapb_stop_t2timer(lapb
);
452 lapb
->state
= LAPB_STATE_4
;
459 printk(KERN_DEBUG
"lapb: (%p) S3 RX RR(%d) R%d\n",
460 lapb
->dev
, frame
->pf
, frame
->nr
);
462 lapb
->condition
&= ~LAPB_PEER_RX_BUSY_CONDITION
;
463 lapb_check_need_response(lapb
, frame
->cr
, frame
->pf
);
464 if (lapb_validate_nr(lapb
, frame
->nr
)) {
465 lapb_check_iframes_acked(lapb
, frame
->nr
);
467 lapb
->frmr_data
= *frame
;
468 lapb
->frmr_type
= LAPB_FRMR_Z
;
469 lapb_transmit_frmr(lapb
);
471 printk(KERN_DEBUG
"lapb: (%p) S3 -> S4\n",
474 lapb_start_t1timer(lapb
);
475 lapb_stop_t2timer(lapb
);
476 lapb
->state
= LAPB_STATE_4
;
483 printk(KERN_DEBUG
"lapb: (%p) S3 RX REJ(%d) R%d\n",
484 lapb
->dev
, frame
->pf
, frame
->nr
);
486 lapb
->condition
&= ~LAPB_PEER_RX_BUSY_CONDITION
;
487 lapb_check_need_response(lapb
, frame
->cr
, frame
->pf
);
488 if (lapb_validate_nr(lapb
, frame
->nr
)) {
489 lapb_frames_acked(lapb
, frame
->nr
);
490 lapb_stop_t1timer(lapb
);
492 lapb_requeue_frames(lapb
);
494 lapb
->frmr_data
= *frame
;
495 lapb
->frmr_type
= LAPB_FRMR_Z
;
496 lapb_transmit_frmr(lapb
);
498 printk(KERN_DEBUG
"lapb: (%p) S3 -> S4\n",
501 lapb_start_t1timer(lapb
);
502 lapb_stop_t2timer(lapb
);
503 lapb
->state
= LAPB_STATE_4
;
510 printk(KERN_DEBUG
"lapb: (%p) S3 RX I(%d) S%d R%d\n",
511 lapb
->dev
, frame
->pf
, frame
->ns
, frame
->nr
);
513 if (!lapb_validate_nr(lapb
, frame
->nr
)) {
514 lapb
->frmr_data
= *frame
;
515 lapb
->frmr_type
= LAPB_FRMR_Z
;
516 lapb_transmit_frmr(lapb
);
518 printk(KERN_DEBUG
"lapb: (%p) S3 -> S4\n",
521 lapb_start_t1timer(lapb
);
522 lapb_stop_t2timer(lapb
);
523 lapb
->state
= LAPB_STATE_4
;
527 if (lapb
->condition
& LAPB_PEER_RX_BUSY_CONDITION
)
528 lapb_frames_acked(lapb
, frame
->nr
);
530 lapb_check_iframes_acked(lapb
, frame
->nr
);
532 if (frame
->ns
== lapb
->vr
) {
534 cn
= lapb_data_indication(lapb
, skb
);
537 * If upper layer has dropped the frame, we
538 * basically ignore any further protocol
539 * processing. This will cause the peer
540 * to re-transmit the frame later like
541 * a frame lost on the wire.
543 if (cn
== NET_RX_DROP
) {
545 "LAPB: rx congestion\n");
548 lapb
->vr
= (lapb
->vr
+ 1) % modulus
;
549 lapb
->condition
&= ~LAPB_REJECT_CONDITION
;
551 lapb_enquiry_response(lapb
);
553 if (!(lapb
->condition
&
554 LAPB_ACK_PENDING_CONDITION
)) {
555 lapb
->condition
|= LAPB_ACK_PENDING_CONDITION
;
556 lapb_start_t2timer(lapb
);
560 if (lapb
->condition
& LAPB_REJECT_CONDITION
) {
562 lapb_enquiry_response(lapb
);
566 "lapb: (%p) S3 TX REJ(%d) R%d\n",
567 lapb
->dev
, frame
->pf
, lapb
->vr
);
569 lapb
->condition
|= LAPB_REJECT_CONDITION
;
570 lapb_send_control(lapb
, LAPB_REJ
,
573 lapb
->condition
&= ~LAPB_ACK_PENDING_CONDITION
;
580 printk(KERN_DEBUG
"lapb: (%p) S3 RX FRMR(%d) %02X "
581 "%02X %02X %02X %02X\n", lapb
->dev
, frame
->pf
,
582 skb
->data
[0], skb
->data
[1], skb
->data
[2],
583 skb
->data
[3], skb
->data
[4]);
585 lapb_establish_data_link(lapb
);
587 printk(KERN_DEBUG
"lapb: (%p) S3 -> S1\n",
590 lapb_requeue_frames(lapb
);
591 lapb
->state
= LAPB_STATE_1
;
596 printk(KERN_DEBUG
"lapb: (%p) S3 RX ILLEGAL(%d)\n",
597 lapb
->dev
, frame
->pf
);
599 lapb
->frmr_data
= *frame
;
600 lapb
->frmr_type
= LAPB_FRMR_W
;
601 lapb_transmit_frmr(lapb
);
603 printk(KERN_DEBUG
"lapb: (%p) S3 -> S4\n", lapb
->dev
);
605 lapb_start_t1timer(lapb
);
606 lapb_stop_t2timer(lapb
);
607 lapb
->state
= LAPB_STATE_4
;
617 * State machine for state 4, Frame Reject State.
618 * The handling of the timer(s) is in file lapb_timer.c.
620 static void lapb_state4_machine(struct lapb_cb
*lapb
, struct sk_buff
*skb
,
621 struct lapb_frame
*frame
)
623 switch (frame
->type
) {
626 printk(KERN_DEBUG
"lapb: (%p) S4 RX SABM(%d)\n",
627 lapb
->dev
, frame
->pf
);
629 if (lapb
->mode
& LAPB_EXTENDED
) {
631 printk(KERN_DEBUG
"lapb: (%p) S4 TX DM(%d)\n",
632 lapb
->dev
, frame
->pf
);
634 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
638 printk(KERN_DEBUG
"lapb: (%p) S4 TX UA(%d)\n",
639 lapb
->dev
, frame
->pf
);
642 printk(KERN_DEBUG
"lapb: (%p) S4 -> S3\n",
645 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
647 lapb_stop_t1timer(lapb
);
648 lapb_stop_t2timer(lapb
);
649 lapb
->state
= LAPB_STATE_3
;
650 lapb
->condition
= 0x00;
655 lapb_connect_indication(lapb
, LAPB_OK
);
661 printk(KERN_DEBUG
"lapb: (%p) S4 RX SABME(%d)\n",
662 lapb
->dev
, frame
->pf
);
664 if (lapb
->mode
& LAPB_EXTENDED
) {
666 printk(KERN_DEBUG
"lapb: (%p) S4 TX UA(%d)\n",
667 lapb
->dev
, frame
->pf
);
670 printk(KERN_DEBUG
"lapb: (%p) S4 -> S3\n",
673 lapb_send_control(lapb
, LAPB_UA
, frame
->pf
,
675 lapb_stop_t1timer(lapb
);
676 lapb_stop_t2timer(lapb
);
677 lapb
->state
= LAPB_STATE_3
;
678 lapb
->condition
= 0x00;
683 lapb_connect_indication(lapb
, LAPB_OK
);
686 printk(KERN_DEBUG
"lapb: (%p) S4 TX DM(%d)\n",
687 lapb
->dev
, frame
->pf
);
689 lapb_send_control(lapb
, LAPB_DM
, frame
->pf
,
699 * Process an incoming LAPB frame
701 void lapb_data_input(struct lapb_cb
*lapb
, struct sk_buff
*skb
)
703 struct lapb_frame frame
;
705 if (lapb_decode(lapb
, skb
, &frame
) < 0) {
710 switch (lapb
->state
) {
712 lapb_state0_machine(lapb
, skb
, &frame
); break;
714 lapb_state1_machine(lapb
, skb
, &frame
); break;
716 lapb_state2_machine(lapb
, skb
, &frame
); break;
718 lapb_state3_machine(lapb
, skb
, &frame
); break;
720 lapb_state4_machine(lapb
, skb
, &frame
); break;