ax25_timer.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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/errno.h>
  16. #include <linux/types.h>
  17. #include <linux/socket.h>
  18. #include <linux/in.h>
  19. #include <linux/kernel.h>
  20. #include <linux/module.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. static void ax25_heartbeat_expiry(unsigned long);
  37. static void ax25_t1timer_expiry(unsigned long);
  38. static void ax25_t2timer_expiry(unsigned long);
  39. static void ax25_t3timer_expiry(unsigned long);
  40. static void ax25_idletimer_expiry(unsigned long);
  41. void ax25_setup_timers(ax25_cb *ax25)
  42. {
  43. setup_timer(&ax25->timer, ax25_heartbeat_expiry, (unsigned long)ax25);
  44. setup_timer(&ax25->t1timer, ax25_t1timer_expiry, (unsigned long)ax25);
  45. setup_timer(&ax25->t2timer, ax25_t2timer_expiry, (unsigned long)ax25);
  46. setup_timer(&ax25->t3timer, ax25_t3timer_expiry, (unsigned long)ax25);
  47. setup_timer(&ax25->idletimer, ax25_idletimer_expiry,
  48. (unsigned long)ax25);
  49. }
  50. void ax25_start_heartbeat(ax25_cb *ax25)
  51. {
  52. mod_timer(&ax25->timer, jiffies + 5 * HZ);
  53. }
  54. void ax25_start_t1timer(ax25_cb *ax25)
  55. {
  56. mod_timer(&ax25->t1timer, jiffies + ax25->t1);
  57. }
  58. void ax25_start_t2timer(ax25_cb *ax25)
  59. {
  60. mod_timer(&ax25->t2timer, jiffies + ax25->t2);
  61. }
  62. void ax25_start_t3timer(ax25_cb *ax25)
  63. {
  64. if (ax25->t3 > 0)
  65. mod_timer(&ax25->t3timer, jiffies + ax25->t3);
  66. else
  67. del_timer(&ax25->t3timer);
  68. }
  69. void ax25_start_idletimer(ax25_cb *ax25)
  70. {
  71. if (ax25->idle > 0)
  72. mod_timer(&ax25->idletimer, jiffies + ax25->idle);
  73. else
  74. del_timer(&ax25->idletimer);
  75. }
  76. void ax25_stop_heartbeat(ax25_cb *ax25)
  77. {
  78. del_timer(&ax25->timer);
  79. }
  80. void ax25_stop_t1timer(ax25_cb *ax25)
  81. {
  82. del_timer(&ax25->t1timer);
  83. }
  84. void ax25_stop_t2timer(ax25_cb *ax25)
  85. {
  86. del_timer(&ax25->t2timer);
  87. }
  88. void ax25_stop_t3timer(ax25_cb *ax25)
  89. {
  90. del_timer(&ax25->t3timer);
  91. }
  92. void ax25_stop_idletimer(ax25_cb *ax25)
  93. {
  94. del_timer(&ax25->idletimer);
  95. }
  96. int ax25_t1timer_running(ax25_cb *ax25)
  97. {
  98. return timer_pending(&ax25->t1timer);
  99. }
  100. unsigned long ax25_display_timer(struct timer_list *timer)
  101. {
  102. if (!timer_pending(timer))
  103. return 0;
  104. return timer->expires - jiffies;
  105. }
  106. EXPORT_SYMBOL(ax25_display_timer);
  107. static void ax25_heartbeat_expiry(unsigned long param)
  108. {
  109. int proto = AX25_PROTO_STD_SIMPLEX;
  110. ax25_cb *ax25 = (ax25_cb *)param;
  111. if (ax25->ax25_dev)
  112. proto = ax25->ax25_dev->values[AX25_VALUES_PROTOCOL];
  113. switch (proto) {
  114. case AX25_PROTO_STD_SIMPLEX:
  115. case AX25_PROTO_STD_DUPLEX:
  116. ax25_std_heartbeat_expiry(ax25);
  117. break;
  118. #ifdef CONFIG_AX25_DAMA_SLAVE
  119. case AX25_PROTO_DAMA_SLAVE:
  120. if (ax25->ax25_dev->dama.slave)
  121. ax25_ds_heartbeat_expiry(ax25);
  122. else
  123. ax25_std_heartbeat_expiry(ax25);
  124. break;
  125. #endif
  126. }
  127. }
  128. static void ax25_t1timer_expiry(unsigned long param)
  129. {
  130. ax25_cb *ax25 = (ax25_cb *)param;
  131. switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
  132. case AX25_PROTO_STD_SIMPLEX:
  133. case AX25_PROTO_STD_DUPLEX:
  134. ax25_std_t1timer_expiry(ax25);
  135. break;
  136. #ifdef CONFIG_AX25_DAMA_SLAVE
  137. case AX25_PROTO_DAMA_SLAVE:
  138. if (!ax25->ax25_dev->dama.slave)
  139. ax25_std_t1timer_expiry(ax25);
  140. break;
  141. #endif
  142. }
  143. }
  144. static void ax25_t2timer_expiry(unsigned long param)
  145. {
  146. ax25_cb *ax25 = (ax25_cb *)param;
  147. switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
  148. case AX25_PROTO_STD_SIMPLEX:
  149. case AX25_PROTO_STD_DUPLEX:
  150. ax25_std_t2timer_expiry(ax25);
  151. break;
  152. #ifdef CONFIG_AX25_DAMA_SLAVE
  153. case AX25_PROTO_DAMA_SLAVE:
  154. if (!ax25->ax25_dev->dama.slave)
  155. ax25_std_t2timer_expiry(ax25);
  156. break;
  157. #endif
  158. }
  159. }
  160. static void ax25_t3timer_expiry(unsigned long param)
  161. {
  162. ax25_cb *ax25 = (ax25_cb *)param;
  163. switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
  164. case AX25_PROTO_STD_SIMPLEX:
  165. case AX25_PROTO_STD_DUPLEX:
  166. ax25_std_t3timer_expiry(ax25);
  167. break;
  168. #ifdef CONFIG_AX25_DAMA_SLAVE
  169. case AX25_PROTO_DAMA_SLAVE:
  170. if (ax25->ax25_dev->dama.slave)
  171. ax25_ds_t3timer_expiry(ax25);
  172. else
  173. ax25_std_t3timer_expiry(ax25);
  174. break;
  175. #endif
  176. }
  177. }
  178. static void ax25_idletimer_expiry(unsigned long param)
  179. {
  180. ax25_cb *ax25 = (ax25_cb *)param;
  181. switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
  182. case AX25_PROTO_STD_SIMPLEX:
  183. case AX25_PROTO_STD_DUPLEX:
  184. ax25_std_idletimer_expiry(ax25);
  185. break;
  186. #ifdef CONFIG_AX25_DAMA_SLAVE
  187. case AX25_PROTO_DAMA_SLAVE:
  188. if (ax25->ax25_dev->dama.slave)
  189. ax25_ds_idletimer_expiry(ax25);
  190. else
  191. ax25_std_idletimer_expiry(ax25);
  192. break;
  193. #endif
  194. }
  195. }