Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
lapb
lapb_timer.c
Go to the documentation of this file.
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 Naylor Started Coding
14
* LAPB 002 Jonathan Naylor New timer architecture.
15
*/
16
17
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19
#include <linux/errno.h>
20
#include <linux/types.h>
21
#include <linux/socket.h>
22
#include <linux/in.h>
23
#include <linux/kernel.h>
24
#include <
linux/jiffies.h
>
25
#include <
linux/timer.h
>
26
#include <linux/string.h>
27
#include <
linux/sockios.h
>
28
#include <linux/net.h>
29
#include <
linux/inet.h
>
30
#include <
linux/skbuff.h
>
31
#include <
net/sock.h
>
32
#include <asm/uaccess.h>
33
#include <linux/fcntl.h>
34
#include <
linux/mm.h
>
35
#include <
linux/interrupt.h
>
36
#include <
net/lapb.h
>
37
38
static
void
lapb_t1timer_expiry(
unsigned
long
);
39
static
void
lapb_t2timer_expiry(
unsigned
long
);
40
41
void
lapb_start_t1timer
(
struct
lapb_cb
*lapb)
42
{
43
del_timer
(&lapb->t1timer);
44
45
lapb->t1timer.data = (
unsigned
long
)lapb;
46
lapb->t1timer.function = &lapb_t1timer_expiry;
47
lapb->t1timer.expires =
jiffies
+ lapb->
t1
;
48
49
add_timer
(&lapb->t1timer);
50
}
51
52
void
lapb_start_t2timer
(
struct
lapb_cb
*lapb)
53
{
54
del_timer
(&lapb->
t2timer
);
55
56
lapb->
t2timer
.data = (
unsigned
long
)lapb;
57
lapb->
t2timer
.function = &lapb_t2timer_expiry;
58
lapb->
t2timer
.expires =
jiffies
+ lapb->
t2
;
59
60
add_timer
(&lapb->
t2timer
);
61
}
62
63
void
lapb_stop_t1timer
(
struct
lapb_cb
*lapb)
64
{
65
del_timer
(&lapb->t1timer);
66
}
67
68
void
lapb_stop_t2timer
(
struct
lapb_cb
*lapb)
69
{
70
del_timer
(&lapb->
t2timer
);
71
}
72
73
int
lapb_t1timer_running
(
struct
lapb_cb
*lapb)
74
{
75
return
timer_pending(&lapb->t1timer);
76
}
77
78
static
void
lapb_t2timer_expiry(
unsigned
long
param
)
79
{
80
struct
lapb_cb
*lapb = (
struct
lapb_cb
*)param;
81
82
if
(lapb->
condition
&
LAPB_ACK_PENDING_CONDITION
) {
83
lapb->
condition
&= ~
LAPB_ACK_PENDING_CONDITION
;
84
lapb_timeout_response
(lapb);
85
}
86
}
87
88
static
void
lapb_t1timer_expiry(
unsigned
long
param)
89
{
90
struct
lapb_cb
*lapb = (
struct
lapb_cb
*)param;
91
92
switch
(lapb->
state
) {
93
94
/*
95
* If we are a DCE, keep going DM .. DM .. DM
96
*/
97
case
LAPB_STATE_0
:
98
if
(lapb->
mode
&
LAPB_DCE
)
99
lapb_send_control
(lapb,
LAPB_DM
,
LAPB_POLLOFF
,
LAPB_RESPONSE
);
100
break
;
101
102
/*
103
* Awaiting connection state, send SABM(E), up to N2 times.
104
*/
105
case
LAPB_STATE_1
:
106
if
(lapb->
n2count
== lapb->
n2
) {
107
lapb_clear_queues
(lapb);
108
lapb->
state
=
LAPB_STATE_0
;
109
lapb_disconnect_indication
(lapb,
LAPB_TIMEDOUT
);
110
lapb_dbg
(0,
"(%p) S1 -> S0\n"
, lapb->
dev
);
111
return
;
112
}
else
{
113
lapb->
n2count
++;
114
if
(lapb->
mode
&
LAPB_EXTENDED
) {
115
lapb_dbg
(1,
"(%p) S1 TX SABME(1)\n"
,
116
lapb->
dev
);
117
lapb_send_control
(lapb,
LAPB_SABME
,
LAPB_POLLON
,
LAPB_COMMAND
);
118
}
else
{
119
lapb_dbg
(1,
"(%p) S1 TX SABM(1)\n"
,
120
lapb->
dev
);
121
lapb_send_control
(lapb,
LAPB_SABM
,
LAPB_POLLON
,
LAPB_COMMAND
);
122
}
123
}
124
break
;
125
126
/*
127
* Awaiting disconnection state, send DISC, up to N2 times.
128
*/
129
case
LAPB_STATE_2
:
130
if
(lapb->
n2count
== lapb->
n2
) {
131
lapb_clear_queues
(lapb);
132
lapb->
state
=
LAPB_STATE_0
;
133
lapb_disconnect_confirmation
(lapb,
LAPB_TIMEDOUT
);
134
lapb_dbg
(0,
"(%p) S2 -> S0\n"
, lapb->
dev
);
135
return
;
136
}
else
{
137
lapb->
n2count
++;
138
lapb_dbg
(1,
"(%p) S2 TX DISC(1)\n"
, lapb->
dev
);
139
lapb_send_control
(lapb,
LAPB_DISC
,
LAPB_POLLON
,
LAPB_COMMAND
);
140
}
141
break
;
142
143
/*
144
* Data transfer state, restransmit I frames, up to N2 times.
145
*/
146
case
LAPB_STATE_3
:
147
if
(lapb->
n2count
== lapb->
n2
) {
148
lapb_clear_queues
(lapb);
149
lapb->
state
=
LAPB_STATE_0
;
150
lapb_stop_t2timer
(lapb);
151
lapb_disconnect_indication
(lapb,
LAPB_TIMEDOUT
);
152
lapb_dbg
(0,
"(%p) S3 -> S0\n"
, lapb->
dev
);
153
return
;
154
}
else
{
155
lapb->
n2count
++;
156
lapb_requeue_frames
(lapb);
157
}
158
break
;
159
160
/*
161
* Frame reject state, restransmit FRMR frames, up to N2 times.
162
*/
163
case
LAPB_STATE_4
:
164
if
(lapb->
n2count
== lapb->
n2
) {
165
lapb_clear_queues
(lapb);
166
lapb->
state
=
LAPB_STATE_0
;
167
lapb_disconnect_indication
(lapb,
LAPB_TIMEDOUT
);
168
lapb_dbg
(0,
"(%p) S4 -> S0\n"
, lapb->
dev
);
169
return
;
170
}
else
{
171
lapb->
n2count
++;
172
lapb_transmit_frmr
(lapb);
173
}
174
break
;
175
}
176
177
lapb_start_t1timer
(lapb);
178
}
Generated on Thu Jan 10 2013 14:59:51 for Linux Kernel by
1.8.2