diff options
Diffstat (limited to 'net/ax25/ax25_timer.c')
-rw-r--r-- | net/ax25/ax25_timer.c | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/net/ax25/ax25_timer.c b/net/ax25/ax25_timer.c new file mode 100644 index 000000000000..7a6b50a14554 --- /dev/null +++ b/net/ax25/ax25_timer.c | |||
@@ -0,0 +1,243 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify | ||
3 | * it under the terms of the GNU General Public License as published by | ||
4 | * the Free Software Foundation; either version 2 of the License, or | ||
5 | * (at your option) any later version. | ||
6 | * | ||
7 | * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk) | ||
8 | * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) | ||
9 | * Copyright (C) Tomi Manninen OH2BNS (oh2bns@sral.fi) | ||
10 | * Copyright (C) Darryl Miles G7LED (dlm@g7led.demon.co.uk) | ||
11 | * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de) | ||
12 | * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr) | ||
13 | * Copyright (C) 2002 Ralf Baechle DO1GRB (ralf@gnu.org) | ||
14 | */ | ||
15 | #include <linux/config.h> | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/types.h> | ||
18 | #include <linux/socket.h> | ||
19 | #include <linux/in.h> | ||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/jiffies.h> | ||
22 | #include <linux/timer.h> | ||
23 | #include <linux/string.h> | ||
24 | #include <linux/sockios.h> | ||
25 | #include <linux/net.h> | ||
26 | #include <net/ax25.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 | |||
37 | static void ax25_heartbeat_expiry(unsigned long); | ||
38 | static void ax25_t1timer_expiry(unsigned long); | ||
39 | static void ax25_t2timer_expiry(unsigned long); | ||
40 | static void ax25_t3timer_expiry(unsigned long); | ||
41 | static void ax25_idletimer_expiry(unsigned long); | ||
42 | |||
43 | void ax25_start_heartbeat(ax25_cb *ax25) | ||
44 | { | ||
45 | del_timer(&ax25->timer); | ||
46 | |||
47 | ax25->timer.data = (unsigned long)ax25; | ||
48 | ax25->timer.function = &ax25_heartbeat_expiry; | ||
49 | ax25->timer.expires = jiffies + 5 * HZ; | ||
50 | |||
51 | add_timer(&ax25->timer); | ||
52 | } | ||
53 | |||
54 | void ax25_start_t1timer(ax25_cb *ax25) | ||
55 | { | ||
56 | del_timer(&ax25->t1timer); | ||
57 | |||
58 | ax25->t1timer.data = (unsigned long)ax25; | ||
59 | ax25->t1timer.function = &ax25_t1timer_expiry; | ||
60 | ax25->t1timer.expires = jiffies + ax25->t1; | ||
61 | |||
62 | add_timer(&ax25->t1timer); | ||
63 | } | ||
64 | |||
65 | void ax25_start_t2timer(ax25_cb *ax25) | ||
66 | { | ||
67 | del_timer(&ax25->t2timer); | ||
68 | |||
69 | ax25->t2timer.data = (unsigned long)ax25; | ||
70 | ax25->t2timer.function = &ax25_t2timer_expiry; | ||
71 | ax25->t2timer.expires = jiffies + ax25->t2; | ||
72 | |||
73 | add_timer(&ax25->t2timer); | ||
74 | } | ||
75 | |||
76 | void ax25_start_t3timer(ax25_cb *ax25) | ||
77 | { | ||
78 | del_timer(&ax25->t3timer); | ||
79 | |||
80 | if (ax25->t3 > 0) { | ||
81 | ax25->t3timer.data = (unsigned long)ax25; | ||
82 | ax25->t3timer.function = &ax25_t3timer_expiry; | ||
83 | ax25->t3timer.expires = jiffies + ax25->t3; | ||
84 | |||
85 | add_timer(&ax25->t3timer); | ||
86 | } | ||
87 | } | ||
88 | |||
89 | void ax25_start_idletimer(ax25_cb *ax25) | ||
90 | { | ||
91 | del_timer(&ax25->idletimer); | ||
92 | |||
93 | if (ax25->idle > 0) { | ||
94 | ax25->idletimer.data = (unsigned long)ax25; | ||
95 | ax25->idletimer.function = &ax25_idletimer_expiry; | ||
96 | ax25->idletimer.expires = jiffies + ax25->idle; | ||
97 | |||
98 | add_timer(&ax25->idletimer); | ||
99 | } | ||
100 | } | ||
101 | |||
102 | void ax25_stop_heartbeat(ax25_cb *ax25) | ||
103 | { | ||
104 | del_timer(&ax25->timer); | ||
105 | } | ||
106 | |||
107 | void ax25_stop_t1timer(ax25_cb *ax25) | ||
108 | { | ||
109 | del_timer(&ax25->t1timer); | ||
110 | } | ||
111 | |||
112 | void ax25_stop_t2timer(ax25_cb *ax25) | ||
113 | { | ||
114 | del_timer(&ax25->t2timer); | ||
115 | } | ||
116 | |||
117 | void ax25_stop_t3timer(ax25_cb *ax25) | ||
118 | { | ||
119 | del_timer(&ax25->t3timer); | ||
120 | } | ||
121 | |||
122 | void ax25_stop_idletimer(ax25_cb *ax25) | ||
123 | { | ||
124 | del_timer(&ax25->idletimer); | ||
125 | } | ||
126 | |||
127 | int ax25_t1timer_running(ax25_cb *ax25) | ||
128 | { | ||
129 | return timer_pending(&ax25->t1timer); | ||
130 | } | ||
131 | |||
132 | unsigned long ax25_display_timer(struct timer_list *timer) | ||
133 | { | ||
134 | if (!timer_pending(timer)) | ||
135 | return 0; | ||
136 | |||
137 | return timer->expires - jiffies; | ||
138 | } | ||
139 | |||
140 | static void ax25_heartbeat_expiry(unsigned long param) | ||
141 | { | ||
142 | int proto = AX25_PROTO_STD_SIMPLEX; | ||
143 | ax25_cb *ax25 = (ax25_cb *)param; | ||
144 | |||
145 | if (ax25->ax25_dev) | ||
146 | proto = ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]; | ||
147 | |||
148 | switch (proto) { | ||
149 | case AX25_PROTO_STD_SIMPLEX: | ||
150 | case AX25_PROTO_STD_DUPLEX: | ||
151 | ax25_std_heartbeat_expiry(ax25); | ||
152 | break; | ||
153 | |||
154 | #ifdef CONFIG_AX25_DAMA_SLAVE | ||
155 | case AX25_PROTO_DAMA_SLAVE: | ||
156 | if (ax25->ax25_dev->dama.slave) | ||
157 | ax25_ds_heartbeat_expiry(ax25); | ||
158 | else | ||
159 | ax25_std_heartbeat_expiry(ax25); | ||
160 | break; | ||
161 | #endif | ||
162 | } | ||
163 | } | ||
164 | |||
165 | static void ax25_t1timer_expiry(unsigned long param) | ||
166 | { | ||
167 | ax25_cb *ax25 = (ax25_cb *)param; | ||
168 | |||
169 | switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) { | ||
170 | case AX25_PROTO_STD_SIMPLEX: | ||
171 | case AX25_PROTO_STD_DUPLEX: | ||
172 | ax25_std_t1timer_expiry(ax25); | ||
173 | break; | ||
174 | |||
175 | #ifdef CONFIG_AX25_DAMA_SLAVE | ||
176 | case AX25_PROTO_DAMA_SLAVE: | ||
177 | if (!ax25->ax25_dev->dama.slave) | ||
178 | ax25_std_t1timer_expiry(ax25); | ||
179 | break; | ||
180 | #endif | ||
181 | } | ||
182 | } | ||
183 | |||
184 | static void ax25_t2timer_expiry(unsigned long param) | ||
185 | { | ||
186 | ax25_cb *ax25 = (ax25_cb *)param; | ||
187 | |||
188 | switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) { | ||
189 | case AX25_PROTO_STD_SIMPLEX: | ||
190 | case AX25_PROTO_STD_DUPLEX: | ||
191 | ax25_std_t2timer_expiry(ax25); | ||
192 | break; | ||
193 | |||
194 | #ifdef CONFIG_AX25_DAMA_SLAVE | ||
195 | case AX25_PROTO_DAMA_SLAVE: | ||
196 | if (!ax25->ax25_dev->dama.slave) | ||
197 | ax25_std_t2timer_expiry(ax25); | ||
198 | break; | ||
199 | #endif | ||
200 | } | ||
201 | } | ||
202 | |||
203 | static void ax25_t3timer_expiry(unsigned long param) | ||
204 | { | ||
205 | ax25_cb *ax25 = (ax25_cb *)param; | ||
206 | |||
207 | switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) { | ||
208 | case AX25_PROTO_STD_SIMPLEX: | ||
209 | case AX25_PROTO_STD_DUPLEX: | ||
210 | ax25_std_t3timer_expiry(ax25); | ||
211 | break; | ||
212 | |||
213 | #ifdef CONFIG_AX25_DAMA_SLAVE | ||
214 | case AX25_PROTO_DAMA_SLAVE: | ||
215 | if (ax25->ax25_dev->dama.slave) | ||
216 | ax25_ds_t3timer_expiry(ax25); | ||
217 | else | ||
218 | ax25_std_t3timer_expiry(ax25); | ||
219 | break; | ||
220 | #endif | ||
221 | } | ||
222 | } | ||
223 | |||
224 | static void ax25_idletimer_expiry(unsigned long param) | ||
225 | { | ||
226 | ax25_cb *ax25 = (ax25_cb *)param; | ||
227 | |||
228 | switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) { | ||
229 | case AX25_PROTO_STD_SIMPLEX: | ||
230 | case AX25_PROTO_STD_DUPLEX: | ||
231 | ax25_std_idletimer_expiry(ax25); | ||
232 | break; | ||
233 | |||
234 | #ifdef CONFIG_AX25_DAMA_SLAVE | ||
235 | case AX25_PROTO_DAMA_SLAVE: | ||
236 | if (ax25->ax25_dev->dama.slave) | ||
237 | ax25_ds_idletimer_expiry(ax25); | ||
238 | else | ||
239 | ax25_std_idletimer_expiry(ax25); | ||
240 | break; | ||
241 | #endif | ||
242 | } | ||
243 | } | ||