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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * AX.25 release 037
  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.  * AX.25 036 Jonathan(G4KLX) Split from ax25_timer.c.
  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/sched.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 struct protocol_struct {
  37. struct protocol_struct *next;
  38. unsigned int pid;
  39. int (*func)(struct sk_buff *, ax25_cb *);
  40. } *protocol_list;
  41. static struct linkfail_struct {
  42. struct linkfail_struct *next;
  43. void (*func)(ax25_cb *, int);
  44. } *linkfail_list;
  45. static struct listen_struct {
  46. struct listen_struct *next;
  47. ax25_address  callsign;
  48. struct net_device *dev;
  49. } *listen_list;
  50. int ax25_protocol_register(unsigned int pid, int (*func)(struct sk_buff *, ax25_cb *))
  51. {
  52. struct protocol_struct *protocol;
  53. unsigned long flags;
  54. if (pid == AX25_P_TEXT || pid == AX25_P_SEGMENT)
  55. return 0;
  56. #ifdef CONFIG_INET
  57. if (pid == AX25_P_IP || pid == AX25_P_ARP)
  58. return 0;
  59. #endif
  60. if ((protocol = kmalloc(sizeof(*protocol), GFP_ATOMIC)) == NULL)
  61. return 0;
  62. protocol->pid  = pid;
  63. protocol->func = func;
  64. save_flags(flags);
  65. cli();
  66. protocol->next = protocol_list;
  67. protocol_list  = protocol;
  68. restore_flags(flags);
  69. return 1;
  70. }
  71. void ax25_protocol_release(unsigned int pid)
  72. {
  73. struct protocol_struct *s, *protocol = protocol_list;
  74. unsigned long flags;
  75. if (protocol == NULL)
  76. return;
  77. save_flags(flags);
  78. cli();
  79. if (protocol->pid == pid) {
  80. protocol_list = protocol->next;
  81. restore_flags(flags);
  82. kfree(protocol);
  83. return;
  84. }
  85. while (protocol != NULL && protocol->next != NULL) {
  86. if (protocol->next->pid == pid) {
  87. s = protocol->next;
  88. protocol->next = protocol->next->next;
  89. restore_flags(flags);
  90. kfree(s);
  91. return;
  92. }
  93. protocol = protocol->next;
  94. }
  95. restore_flags(flags);
  96. }
  97. int ax25_linkfail_register(void (*func)(ax25_cb *, int))
  98. {
  99. struct linkfail_struct *linkfail;
  100. unsigned long flags;
  101. if ((linkfail = kmalloc(sizeof(*linkfail), GFP_ATOMIC)) == NULL)
  102. return 0;
  103. linkfail->func = func;
  104. save_flags(flags);
  105. cli();
  106. linkfail->next = linkfail_list;
  107. linkfail_list  = linkfail;
  108. restore_flags(flags);
  109. return 1;
  110. }
  111. void ax25_linkfail_release(void (*func)(ax25_cb *, int))
  112. {
  113. struct linkfail_struct *s, *linkfail = linkfail_list;
  114. unsigned long flags;
  115. if (linkfail == NULL)
  116. return;
  117. save_flags(flags);
  118. cli();
  119. if (linkfail->func == func) {
  120. linkfail_list = linkfail->next;
  121. restore_flags(flags);
  122. kfree(linkfail);
  123. return;
  124. }
  125. while (linkfail != NULL && linkfail->next != NULL) {
  126. if (linkfail->next->func == func) {
  127. s = linkfail->next;
  128. linkfail->next = linkfail->next->next;
  129. restore_flags(flags);
  130. kfree(s);
  131. return;
  132. }
  133. linkfail = linkfail->next;
  134. }
  135. restore_flags(flags);
  136. }
  137. int ax25_listen_register(ax25_address *callsign, struct net_device *dev)
  138. {
  139. struct listen_struct *listen;
  140. unsigned long flags;
  141. if (ax25_listen_mine(callsign, dev))
  142. return 0;
  143. if ((listen = kmalloc(sizeof(*listen), GFP_ATOMIC)) == NULL)
  144. return 0;
  145. listen->callsign = *callsign;
  146. listen->dev      = dev;
  147. save_flags(flags);
  148. cli();
  149. listen->next = listen_list;
  150. listen_list  = listen;
  151. restore_flags(flags);
  152. return 1;
  153. }
  154. void ax25_listen_release(ax25_address *callsign, struct net_device *dev)
  155. {
  156. struct listen_struct *s, *listen = listen_list;
  157. unsigned long flags;
  158. if (listen == NULL)
  159. return;
  160. save_flags(flags);
  161. cli();
  162. if (ax25cmp(&listen->callsign, callsign) == 0 && listen->dev == dev) {
  163. listen_list = listen->next;
  164. restore_flags(flags);
  165. kfree(listen);
  166. return;
  167. }
  168. while (listen != NULL && listen->next != NULL) {
  169. if (ax25cmp(&listen->next->callsign, callsign) == 0 && listen->next->dev == dev) {
  170. s = listen->next;
  171. listen->next = listen->next->next;
  172. restore_flags(flags);
  173. kfree(s);
  174. return;
  175. }
  176. listen = listen->next;
  177. }
  178. restore_flags(flags);
  179. }
  180. int (*ax25_protocol_function(unsigned int pid))(struct sk_buff *, ax25_cb *)
  181. {
  182. struct protocol_struct *protocol;
  183. for (protocol = protocol_list; protocol != NULL; protocol = protocol->next)
  184. if (protocol->pid == pid)
  185. return protocol->func;
  186. return NULL;
  187. }
  188. int ax25_listen_mine(ax25_address *callsign, struct net_device *dev)
  189. {
  190. struct listen_struct *listen;
  191. for (listen = listen_list; listen != NULL; listen = listen->next)
  192. if (ax25cmp(&listen->callsign, callsign) == 0 && (listen->dev == dev || listen->dev == NULL))
  193. return 1;
  194. return 0;
  195. }
  196. void ax25_link_failed(ax25_cb *ax25, int reason)
  197. {
  198. struct linkfail_struct *linkfail;
  199. for (linkfail = linkfail_list; linkfail != NULL; linkfail = linkfail->next)
  200. (linkfail->func)(ax25, reason);
  201. }
  202. int ax25_protocol_is_registered(unsigned int pid)
  203. {
  204. struct protocol_struct *protocol;
  205. for (protocol = protocol_list; protocol != NULL; protocol = protocol->next)
  206. if (protocol->pid == pid)
  207. return 1;
  208. return 0;
  209. }