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 Naylor Started Coding
14 * LAPB 002 Jonathan Naylor New timer architecture.
17 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19 #include <linux/errno.h>
20 #include <linux/types.h>
21 #include <linux/socket.h>
23 #include <linux/kernel.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/skbuff.h>
30 #include <linux/slab.h>
32 #include <asm/uaccess.h>
33 #include <linux/fcntl.h>
35 #include <linux/interrupt.h>
39 * This procedure is passed a buffer descriptor for an iframe. It builds
40 * the rest of the control part of the frame and then writes it out.
42 static void lapb_send_iframe(struct lapb_cb
*lapb
, struct sk_buff
*skb
, int poll_bit
)
49 if (lapb
->mode
& LAPB_EXTENDED
) {
50 frame
= skb_push(skb
, 2);
53 frame
[0] |= lapb
->vs
<< 1;
54 frame
[1] = poll_bit
? LAPB_EPF
: 0;
55 frame
[1] |= lapb
->vr
<< 1;
57 frame
= skb_push(skb
, 1);
60 *frame
|= poll_bit
? LAPB_SPF
: 0;
61 *frame
|= lapb
->vr
<< 5;
62 *frame
|= lapb
->vs
<< 1;
65 lapb_dbg(1, "(%p) S%d TX I(%d) S%d R%d\n",
66 lapb
->dev
, lapb
->state
, poll_bit
, lapb
->vs
, lapb
->vr
);
68 lapb_transmit_buffer(lapb
, skb
, LAPB_COMMAND
);
71 void lapb_kick(struct lapb_cb
*lapb
)
73 struct sk_buff
*skb
, *skbn
;
74 unsigned short modulus
, start
, end
;
76 modulus
= (lapb
->mode
& LAPB_EXTENDED
) ? LAPB_EMODULUS
: LAPB_SMODULUS
;
77 start
= !skb_peek(&lapb
->ack_queue
) ? lapb
->va
: lapb
->vs
;
78 end
= (lapb
->va
+ lapb
->window
) % modulus
;
80 if (!(lapb
->condition
& LAPB_PEER_RX_BUSY_CONDITION
) &&
81 start
!= end
&& skb_peek(&lapb
->write_queue
)) {
85 * Dequeue the frame and copy it.
87 skb
= skb_dequeue(&lapb
->write_queue
);
90 if ((skbn
= skb_clone(skb
, GFP_ATOMIC
)) == NULL
) {
91 skb_queue_head(&lapb
->write_queue
, skb
);
96 skb_set_owner_w(skbn
, skb
->sk
);
99 * Transmit the frame copy.
101 lapb_send_iframe(lapb
, skbn
, LAPB_POLLOFF
);
103 lapb
->vs
= (lapb
->vs
+ 1) % modulus
;
106 * Requeue the original data frame.
108 skb_queue_tail(&lapb
->ack_queue
, skb
);
110 } while (lapb
->vs
!= end
&& (skb
= skb_dequeue(&lapb
->write_queue
)) != NULL
);
112 lapb
->condition
&= ~LAPB_ACK_PENDING_CONDITION
;
114 if (!lapb_t1timer_running(lapb
))
115 lapb_start_t1timer(lapb
);
119 void lapb_transmit_buffer(struct lapb_cb
*lapb
, struct sk_buff
*skb
, int type
)
123 ptr
= skb_push(skb
, 1);
125 if (lapb
->mode
& LAPB_MLP
) {
126 if (lapb
->mode
& LAPB_DCE
) {
127 if (type
== LAPB_COMMAND
)
129 if (type
== LAPB_RESPONSE
)
132 if (type
== LAPB_COMMAND
)
134 if (type
== LAPB_RESPONSE
)
138 if (lapb
->mode
& LAPB_DCE
) {
139 if (type
== LAPB_COMMAND
)
141 if (type
== LAPB_RESPONSE
)
144 if (type
== LAPB_COMMAND
)
146 if (type
== LAPB_RESPONSE
)
151 lapb_dbg(2, "(%p) S%d TX %02X %02X %02X\n",
152 lapb
->dev
, lapb
->state
,
153 skb
->data
[0], skb
->data
[1], skb
->data
[2]);
155 if (!lapb_data_transmit(lapb
, skb
))
159 void lapb_establish_data_link(struct lapb_cb
*lapb
)
161 lapb
->condition
= 0x00;
164 if (lapb
->mode
& LAPB_EXTENDED
) {
165 lapb_dbg(1, "(%p) S%d TX SABME(1)\n", lapb
->dev
, lapb
->state
);
166 lapb_send_control(lapb
, LAPB_SABME
, LAPB_POLLON
, LAPB_COMMAND
);
168 lapb_dbg(1, "(%p) S%d TX SABM(1)\n", lapb
->dev
, lapb
->state
);
169 lapb_send_control(lapb
, LAPB_SABM
, LAPB_POLLON
, LAPB_COMMAND
);
172 lapb_start_t1timer(lapb
);
173 lapb_stop_t2timer(lapb
);
176 void lapb_enquiry_response(struct lapb_cb
*lapb
)
178 lapb_dbg(1, "(%p) S%d TX RR(1) R%d\n",
179 lapb
->dev
, lapb
->state
, lapb
->vr
);
181 lapb_send_control(lapb
, LAPB_RR
, LAPB_POLLON
, LAPB_RESPONSE
);
183 lapb
->condition
&= ~LAPB_ACK_PENDING_CONDITION
;
186 void lapb_timeout_response(struct lapb_cb
*lapb
)
188 lapb_dbg(1, "(%p) S%d TX RR(0) R%d\n",
189 lapb
->dev
, lapb
->state
, lapb
->vr
);
190 lapb_send_control(lapb
, LAPB_RR
, LAPB_POLLOFF
, LAPB_RESPONSE
);
192 lapb
->condition
&= ~LAPB_ACK_PENDING_CONDITION
;
195 void lapb_check_iframes_acked(struct lapb_cb
*lapb
, unsigned short nr
)
197 if (lapb
->vs
== nr
) {
198 lapb_frames_acked(lapb
, nr
);
199 lapb_stop_t1timer(lapb
);
201 } else if (lapb
->va
!= nr
) {
202 lapb_frames_acked(lapb
, nr
);
203 lapb_start_t1timer(lapb
);
207 void lapb_check_need_response(struct lapb_cb
*lapb
, int type
, int pf
)
209 if (type
== LAPB_COMMAND
&& pf
)
210 lapb_enquiry_response(lapb
);