xref: /OK3568_Linux_fs/kernel/net/ax25/ax25_timer.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
5*4882a593Smuzhiyun  * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
6*4882a593Smuzhiyun  * Copyright (C) Tomi Manninen OH2BNS (oh2bns@sral.fi)
7*4882a593Smuzhiyun  * Copyright (C) Darryl Miles G7LED (dlm@g7led.demon.co.uk)
8*4882a593Smuzhiyun  * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
9*4882a593Smuzhiyun  * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr)
10*4882a593Smuzhiyun  * Copyright (C) 2002 Ralf Baechle DO1GRB (ralf@gnu.org)
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun #include <linux/errno.h>
13*4882a593Smuzhiyun #include <linux/types.h>
14*4882a593Smuzhiyun #include <linux/socket.h>
15*4882a593Smuzhiyun #include <linux/in.h>
16*4882a593Smuzhiyun #include <linux/kernel.h>
17*4882a593Smuzhiyun #include <linux/module.h>
18*4882a593Smuzhiyun #include <linux/jiffies.h>
19*4882a593Smuzhiyun #include <linux/timer.h>
20*4882a593Smuzhiyun #include <linux/string.h>
21*4882a593Smuzhiyun #include <linux/sockios.h>
22*4882a593Smuzhiyun #include <linux/net.h>
23*4882a593Smuzhiyun #include <net/ax25.h>
24*4882a593Smuzhiyun #include <linux/inet.h>
25*4882a593Smuzhiyun #include <linux/netdevice.h>
26*4882a593Smuzhiyun #include <linux/skbuff.h>
27*4882a593Smuzhiyun #include <net/sock.h>
28*4882a593Smuzhiyun #include <linux/uaccess.h>
29*4882a593Smuzhiyun #include <linux/fcntl.h>
30*4882a593Smuzhiyun #include <linux/mm.h>
31*4882a593Smuzhiyun #include <linux/interrupt.h>
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun static void ax25_heartbeat_expiry(struct timer_list *);
34*4882a593Smuzhiyun static void ax25_t1timer_expiry(struct timer_list *);
35*4882a593Smuzhiyun static void ax25_t2timer_expiry(struct timer_list *);
36*4882a593Smuzhiyun static void ax25_t3timer_expiry(struct timer_list *);
37*4882a593Smuzhiyun static void ax25_idletimer_expiry(struct timer_list *);
38*4882a593Smuzhiyun 
ax25_setup_timers(ax25_cb * ax25)39*4882a593Smuzhiyun void ax25_setup_timers(ax25_cb *ax25)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun 	timer_setup(&ax25->timer, ax25_heartbeat_expiry, 0);
42*4882a593Smuzhiyun 	timer_setup(&ax25->t1timer, ax25_t1timer_expiry, 0);
43*4882a593Smuzhiyun 	timer_setup(&ax25->t2timer, ax25_t2timer_expiry, 0);
44*4882a593Smuzhiyun 	timer_setup(&ax25->t3timer, ax25_t3timer_expiry, 0);
45*4882a593Smuzhiyun 	timer_setup(&ax25->idletimer, ax25_idletimer_expiry, 0);
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun 
ax25_start_heartbeat(ax25_cb * ax25)48*4882a593Smuzhiyun void ax25_start_heartbeat(ax25_cb *ax25)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun 	mod_timer(&ax25->timer, jiffies + 5 * HZ);
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun 
ax25_start_t1timer(ax25_cb * ax25)53*4882a593Smuzhiyun void ax25_start_t1timer(ax25_cb *ax25)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun 	mod_timer(&ax25->t1timer, jiffies + ax25->t1);
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun 
ax25_start_t2timer(ax25_cb * ax25)58*4882a593Smuzhiyun void ax25_start_t2timer(ax25_cb *ax25)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	mod_timer(&ax25->t2timer, jiffies + ax25->t2);
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun 
ax25_start_t3timer(ax25_cb * ax25)63*4882a593Smuzhiyun void ax25_start_t3timer(ax25_cb *ax25)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun 	if (ax25->t3 > 0)
66*4882a593Smuzhiyun 		mod_timer(&ax25->t3timer, jiffies + ax25->t3);
67*4882a593Smuzhiyun 	else
68*4882a593Smuzhiyun 		del_timer(&ax25->t3timer);
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
ax25_start_idletimer(ax25_cb * ax25)71*4882a593Smuzhiyun void ax25_start_idletimer(ax25_cb *ax25)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	if (ax25->idle > 0)
74*4882a593Smuzhiyun 		mod_timer(&ax25->idletimer, jiffies + ax25->idle);
75*4882a593Smuzhiyun 	else
76*4882a593Smuzhiyun 		del_timer(&ax25->idletimer);
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun 
ax25_stop_heartbeat(ax25_cb * ax25)79*4882a593Smuzhiyun void ax25_stop_heartbeat(ax25_cb *ax25)
80*4882a593Smuzhiyun {
81*4882a593Smuzhiyun 	del_timer(&ax25->timer);
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun 
ax25_stop_t1timer(ax25_cb * ax25)84*4882a593Smuzhiyun void ax25_stop_t1timer(ax25_cb *ax25)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun 	del_timer(&ax25->t1timer);
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun 
ax25_stop_t2timer(ax25_cb * ax25)89*4882a593Smuzhiyun void ax25_stop_t2timer(ax25_cb *ax25)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	del_timer(&ax25->t2timer);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
ax25_stop_t3timer(ax25_cb * ax25)94*4882a593Smuzhiyun void ax25_stop_t3timer(ax25_cb *ax25)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	del_timer(&ax25->t3timer);
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
ax25_stop_idletimer(ax25_cb * ax25)99*4882a593Smuzhiyun void ax25_stop_idletimer(ax25_cb *ax25)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun 	del_timer(&ax25->idletimer);
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
ax25_t1timer_running(ax25_cb * ax25)104*4882a593Smuzhiyun int ax25_t1timer_running(ax25_cb *ax25)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun 	return timer_pending(&ax25->t1timer);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun 
ax25_display_timer(struct timer_list * timer)109*4882a593Smuzhiyun unsigned long ax25_display_timer(struct timer_list *timer)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun 	if (!timer_pending(timer))
112*4882a593Smuzhiyun 		return 0;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	return timer->expires - jiffies;
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun EXPORT_SYMBOL(ax25_display_timer);
118*4882a593Smuzhiyun 
ax25_heartbeat_expiry(struct timer_list * t)119*4882a593Smuzhiyun static void ax25_heartbeat_expiry(struct timer_list *t)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun 	int proto = AX25_PROTO_STD_SIMPLEX;
122*4882a593Smuzhiyun 	ax25_cb *ax25 = from_timer(ax25, t, timer);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	if (ax25->ax25_dev)
125*4882a593Smuzhiyun 		proto = ax25->ax25_dev->values[AX25_VALUES_PROTOCOL];
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	switch (proto) {
128*4882a593Smuzhiyun 	case AX25_PROTO_STD_SIMPLEX:
129*4882a593Smuzhiyun 	case AX25_PROTO_STD_DUPLEX:
130*4882a593Smuzhiyun 		ax25_std_heartbeat_expiry(ax25);
131*4882a593Smuzhiyun 		break;
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #ifdef CONFIG_AX25_DAMA_SLAVE
134*4882a593Smuzhiyun 	case AX25_PROTO_DAMA_SLAVE:
135*4882a593Smuzhiyun 		if (ax25->ax25_dev->dama.slave)
136*4882a593Smuzhiyun 			ax25_ds_heartbeat_expiry(ax25);
137*4882a593Smuzhiyun 		else
138*4882a593Smuzhiyun 			ax25_std_heartbeat_expiry(ax25);
139*4882a593Smuzhiyun 		break;
140*4882a593Smuzhiyun #endif
141*4882a593Smuzhiyun 	}
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun 
ax25_t1timer_expiry(struct timer_list * t)144*4882a593Smuzhiyun static void ax25_t1timer_expiry(struct timer_list *t)
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun 	ax25_cb *ax25 = from_timer(ax25, t, t1timer);
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
149*4882a593Smuzhiyun 	case AX25_PROTO_STD_SIMPLEX:
150*4882a593Smuzhiyun 	case AX25_PROTO_STD_DUPLEX:
151*4882a593Smuzhiyun 		ax25_std_t1timer_expiry(ax25);
152*4882a593Smuzhiyun 		break;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #ifdef CONFIG_AX25_DAMA_SLAVE
155*4882a593Smuzhiyun 	case AX25_PROTO_DAMA_SLAVE:
156*4882a593Smuzhiyun 		if (!ax25->ax25_dev->dama.slave)
157*4882a593Smuzhiyun 			ax25_std_t1timer_expiry(ax25);
158*4882a593Smuzhiyun 		break;
159*4882a593Smuzhiyun #endif
160*4882a593Smuzhiyun 	}
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun 
ax25_t2timer_expiry(struct timer_list * t)163*4882a593Smuzhiyun static void ax25_t2timer_expiry(struct timer_list *t)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun 	ax25_cb *ax25 = from_timer(ax25, t, t2timer);
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
168*4882a593Smuzhiyun 	case AX25_PROTO_STD_SIMPLEX:
169*4882a593Smuzhiyun 	case AX25_PROTO_STD_DUPLEX:
170*4882a593Smuzhiyun 		ax25_std_t2timer_expiry(ax25);
171*4882a593Smuzhiyun 		break;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun #ifdef CONFIG_AX25_DAMA_SLAVE
174*4882a593Smuzhiyun 	case AX25_PROTO_DAMA_SLAVE:
175*4882a593Smuzhiyun 		if (!ax25->ax25_dev->dama.slave)
176*4882a593Smuzhiyun 			ax25_std_t2timer_expiry(ax25);
177*4882a593Smuzhiyun 		break;
178*4882a593Smuzhiyun #endif
179*4882a593Smuzhiyun 	}
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun 
ax25_t3timer_expiry(struct timer_list * t)182*4882a593Smuzhiyun static void ax25_t3timer_expiry(struct timer_list *t)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun 	ax25_cb *ax25 = from_timer(ax25, t, t3timer);
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
187*4882a593Smuzhiyun 	case AX25_PROTO_STD_SIMPLEX:
188*4882a593Smuzhiyun 	case AX25_PROTO_STD_DUPLEX:
189*4882a593Smuzhiyun 		ax25_std_t3timer_expiry(ax25);
190*4882a593Smuzhiyun 		break;
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun #ifdef CONFIG_AX25_DAMA_SLAVE
193*4882a593Smuzhiyun 	case AX25_PROTO_DAMA_SLAVE:
194*4882a593Smuzhiyun 		if (ax25->ax25_dev->dama.slave)
195*4882a593Smuzhiyun 			ax25_ds_t3timer_expiry(ax25);
196*4882a593Smuzhiyun 		else
197*4882a593Smuzhiyun 			ax25_std_t3timer_expiry(ax25);
198*4882a593Smuzhiyun 		break;
199*4882a593Smuzhiyun #endif
200*4882a593Smuzhiyun 	}
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
ax25_idletimer_expiry(struct timer_list * t)203*4882a593Smuzhiyun static void ax25_idletimer_expiry(struct timer_list *t)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	ax25_cb *ax25 = from_timer(ax25, t, idletimer);
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
208*4882a593Smuzhiyun 	case AX25_PROTO_STD_SIMPLEX:
209*4882a593Smuzhiyun 	case AX25_PROTO_STD_DUPLEX:
210*4882a593Smuzhiyun 		ax25_std_idletimer_expiry(ax25);
211*4882a593Smuzhiyun 		break;
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun #ifdef CONFIG_AX25_DAMA_SLAVE
214*4882a593Smuzhiyun 	case AX25_PROTO_DAMA_SLAVE:
215*4882a593Smuzhiyun 		if (ax25->ax25_dev->dama.slave)
216*4882a593Smuzhiyun 			ax25_ds_idletimer_expiry(ax25);
217*4882a593Smuzhiyun 		else
218*4882a593Smuzhiyun 			ax25_std_idletimer_expiry(ax25);
219*4882a593Smuzhiyun 		break;
220*4882a593Smuzhiyun #endif
221*4882a593Smuzhiyun 	}
222*4882a593Smuzhiyun }
223