rose_timer.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * ROSE release 003
  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.  * ROSE 001 Jonathan(G4KLX) Cloned from nr_timer.c
  14.  * ROSE 003 Jonathan(G4KLX) New timer architecture.
  15.  * Implemented idle timer.
  16.  */
  17. #include <linux/errno.h>
  18. #include <linux/types.h>
  19. #include <linux/socket.h>
  20. #include <linux/in.h>
  21. #include <linux/kernel.h>
  22. #include <linux/sched.h>
  23. #include <linux/timer.h>
  24. #include <linux/string.h>
  25. #include <linux/sockios.h>
  26. #include <linux/net.h>
  27. #include <net/ax25.h>
  28. #include <linux/inet.h>
  29. #include <linux/netdevice.h>
  30. #include <linux/skbuff.h>
  31. #include <net/sock.h>
  32. #include <asm/segment.h>
  33. #include <asm/system.h>
  34. #include <linux/fcntl.h>
  35. #include <linux/mm.h>
  36. #include <linux/interrupt.h>
  37. #include <net/rose.h>
  38. static void rose_heartbeat_expiry(unsigned long);
  39. static void rose_timer_expiry(unsigned long);
  40. static void rose_idletimer_expiry(unsigned long);
  41. void rose_start_heartbeat(struct sock *sk)
  42. {
  43. del_timer(&sk->timer);
  44. sk->timer.data     = (unsigned long)sk;
  45. sk->timer.function = &rose_heartbeat_expiry;
  46. sk->timer.expires  = jiffies + 5 * HZ;
  47. add_timer(&sk->timer);
  48. }
  49. void rose_start_t1timer(struct sock *sk)
  50. {
  51. del_timer(&sk->protinfo.rose->timer);
  52. sk->protinfo.rose->timer.data     = (unsigned long)sk;
  53. sk->protinfo.rose->timer.function = &rose_timer_expiry;
  54. sk->protinfo.rose->timer.expires  = jiffies + sk->protinfo.rose->t1;
  55. add_timer(&sk->protinfo.rose->timer);
  56. }
  57. void rose_start_t2timer(struct sock *sk)
  58. {
  59. del_timer(&sk->protinfo.rose->timer);
  60. sk->protinfo.rose->timer.data     = (unsigned long)sk;
  61. sk->protinfo.rose->timer.function = &rose_timer_expiry;
  62. sk->protinfo.rose->timer.expires  = jiffies + sk->protinfo.rose->t2;
  63. add_timer(&sk->protinfo.rose->timer);
  64. }
  65. void rose_start_t3timer(struct sock *sk)
  66. {
  67. del_timer(&sk->protinfo.rose->timer);
  68. sk->protinfo.rose->timer.data     = (unsigned long)sk;
  69. sk->protinfo.rose->timer.function = &rose_timer_expiry;
  70. sk->protinfo.rose->timer.expires  = jiffies + sk->protinfo.rose->t3;
  71. add_timer(&sk->protinfo.rose->timer);
  72. }
  73. void rose_start_hbtimer(struct sock *sk)
  74. {
  75. del_timer(&sk->protinfo.rose->timer);
  76. sk->protinfo.rose->timer.data     = (unsigned long)sk;
  77. sk->protinfo.rose->timer.function = &rose_timer_expiry;
  78. sk->protinfo.rose->timer.expires  = jiffies + sk->protinfo.rose->hb;
  79. add_timer(&sk->protinfo.rose->timer);
  80. }
  81. void rose_start_idletimer(struct sock *sk)
  82. {
  83. del_timer(&sk->protinfo.rose->idletimer);
  84. if (sk->protinfo.rose->idle > 0) {
  85. sk->protinfo.rose->idletimer.data     = (unsigned long)sk;
  86. sk->protinfo.rose->idletimer.function = &rose_idletimer_expiry;
  87. sk->protinfo.rose->idletimer.expires  = jiffies + sk->protinfo.rose->idle;
  88. add_timer(&sk->protinfo.rose->idletimer);
  89. }
  90. }
  91. void rose_stop_heartbeat(struct sock *sk)
  92. {
  93. del_timer(&sk->timer);
  94. }
  95. void rose_stop_timer(struct sock *sk)
  96. {
  97. del_timer(&sk->protinfo.rose->timer);
  98. }
  99. void rose_stop_idletimer(struct sock *sk)
  100. {
  101. del_timer(&sk->protinfo.rose->idletimer);
  102. }
  103. static void rose_heartbeat_expiry(unsigned long param)
  104. {
  105. struct sock *sk = (struct sock *)param;
  106. switch (sk->protinfo.rose->state) {
  107. case ROSE_STATE_0:
  108. /* Magic here: If we listen() and a new link dies before it
  109.    is accepted() it isn't 'dead' so doesn't get removed. */
  110. if (sk->destroy || (sk->state == TCP_LISTEN && sk->dead)) {
  111. rose_destroy_socket(sk);
  112. return;
  113. }
  114. break;
  115. case ROSE_STATE_3:
  116. /*
  117.  * Check for the state of the receive buffer.
  118.  */
  119. if (atomic_read(&sk->rmem_alloc) < (sk->rcvbuf / 2) &&
  120.     (sk->protinfo.rose->condition & ROSE_COND_OWN_RX_BUSY)) {
  121. sk->protinfo.rose->condition &= ~ROSE_COND_OWN_RX_BUSY;
  122. sk->protinfo.rose->condition &= ~ROSE_COND_ACK_PENDING;
  123. sk->protinfo.rose->vl         = sk->protinfo.rose->vr;
  124. rose_write_internal(sk, ROSE_RR);
  125. rose_stop_timer(sk); /* HB */
  126. break;
  127. }
  128. break;
  129. }
  130. rose_start_heartbeat(sk);
  131. }
  132. static void rose_timer_expiry(unsigned long param)
  133. {
  134. struct sock *sk = (struct sock *)param;
  135. switch (sk->protinfo.rose->state) {
  136. case ROSE_STATE_1: /* T1 */
  137. case ROSE_STATE_4: /* T2 */
  138. rose_write_internal(sk, ROSE_CLEAR_REQUEST);
  139. sk->protinfo.rose->state = ROSE_STATE_2;
  140. rose_start_t3timer(sk);
  141. break;
  142. case ROSE_STATE_2: /* T3 */
  143. sk->protinfo.rose->neighbour->use--;
  144. rose_disconnect(sk, ETIMEDOUT, -1, -1);
  145. break;
  146. case ROSE_STATE_3: /* HB */
  147. if (sk->protinfo.rose->condition & ROSE_COND_ACK_PENDING) {
  148. sk->protinfo.rose->condition &= ~ROSE_COND_ACK_PENDING;
  149. rose_enquiry_response(sk);
  150. }
  151. break;
  152. }
  153. }
  154. static void rose_idletimer_expiry(unsigned long param)
  155. {
  156. struct sock *sk = (struct sock *)param;
  157. rose_clear_queues(sk);
  158. rose_write_internal(sk, ROSE_CLEAR_REQUEST);
  159. sk->protinfo.rose->state = ROSE_STATE_2;
  160. rose_start_t3timer(sk);
  161. sk->state     = TCP_CLOSE;
  162. sk->err       = 0;
  163. sk->shutdown |= SEND_SHUTDOWN;
  164. if (!sk->dead)
  165. sk->state_change(sk);
  166. sk->dead = 1;
  167. }