sysctl_net_ax25.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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) 1996 Mike Shaver (shaver@zeroknowledge.com)
  8. */
  9. #include <linux/config.h>
  10. #include <linux/mm.h>
  11. #include <linux/sysctl.h>
  12. #include <linux/spinlock.h>
  13. #include <net/ax25.h>
  14. static int min_ipdefmode[1], max_ipdefmode[] = {1};
  15. static int min_axdefmode[1], max_axdefmode[] = {1};
  16. static int min_backoff[1], max_backoff[] = {2};
  17. static int min_conmode[1], max_conmode[] = {2};
  18. static int min_window[] = {1}, max_window[] = {7};
  19. static int min_ewindow[] = {1}, max_ewindow[] = {63};
  20. static int min_t1[] = {1}, max_t1[] = {30 * HZ};
  21. static int min_t2[] = {1}, max_t2[] = {20 * HZ};
  22. static int min_t3[1], max_t3[] = {3600 * HZ};
  23. static int min_idle[1], max_idle[] = {65535 * HZ};
  24. static int min_n2[] = {1}, max_n2[] = {31};
  25. static int min_paclen[] = {1}, max_paclen[] = {512};
  26. static int min_proto[1], max_proto[] = {3};
  27. static int min_ds_timeout[1], max_ds_timeout[] = {65535 * HZ};
  28. static struct ctl_table_header *ax25_table_header;
  29. static ctl_table *ax25_table;
  30. static int ax25_table_size;
  31. static ctl_table ax25_dir_table[] = {
  32. {
  33. .ctl_name = NET_AX25,
  34. .procname = "ax25",
  35. .mode = 0555,
  36. },
  37. { .ctl_name = 0 }
  38. };
  39. static ctl_table ax25_root_table[] = {
  40. {
  41. .ctl_name = CTL_NET,
  42. .procname = "net",
  43. .mode = 0555,
  44. .child = ax25_dir_table
  45. },
  46. { .ctl_name = 0 }
  47. };
  48. static const ctl_table ax25_param_table[] = {
  49. {
  50. .ctl_name = NET_AX25_IP_DEFAULT_MODE,
  51. .procname = "ip_default_mode",
  52. .maxlen = sizeof(int),
  53. .mode = 0644,
  54. .proc_handler = &proc_dointvec_minmax,
  55. .strategy = &sysctl_intvec,
  56. .extra1 = &min_ipdefmode,
  57. .extra2 = &max_ipdefmode
  58. },
  59. {
  60. .ctl_name = NET_AX25_DEFAULT_MODE,
  61. .procname = "ax25_default_mode",
  62. .maxlen = sizeof(int),
  63. .mode = 0644,
  64. .proc_handler = &proc_dointvec_minmax,
  65. .strategy = &sysctl_intvec,
  66. .extra1 = &min_axdefmode,
  67. .extra2 = &max_axdefmode
  68. },
  69. {
  70. .ctl_name = NET_AX25_BACKOFF_TYPE,
  71. .procname = "backoff_type",
  72. .maxlen = sizeof(int),
  73. .mode = 0644,
  74. .proc_handler = &proc_dointvec_minmax,
  75. .strategy = &sysctl_intvec,
  76. .extra1 = &min_backoff,
  77. .extra2 = &max_backoff
  78. },
  79. {
  80. .ctl_name = NET_AX25_CONNECT_MODE,
  81. .procname = "connect_mode",
  82. .maxlen = sizeof(int),
  83. .mode = 0644,
  84. .proc_handler = &proc_dointvec_minmax,
  85. .strategy = &sysctl_intvec,
  86. .extra1 = &min_conmode,
  87. .extra2 = &max_conmode
  88. },
  89. {
  90. .ctl_name = NET_AX25_STANDARD_WINDOW,
  91. .procname = "standard_window_size",
  92. .maxlen = sizeof(int),
  93. .mode = 0644,
  94. .proc_handler = &proc_dointvec_minmax,
  95. .strategy = &sysctl_intvec,
  96. .extra1 = &min_window,
  97. .extra2 = &max_window
  98. },
  99. {
  100. .ctl_name = NET_AX25_EXTENDED_WINDOW,
  101. .procname = "extended_window_size",
  102. .maxlen = sizeof(int),
  103. .mode = 0644,
  104. .proc_handler = &proc_dointvec_minmax,
  105. .strategy = &sysctl_intvec,
  106. .extra1 = &min_ewindow,
  107. .extra2 = &max_ewindow
  108. },
  109. {
  110. .ctl_name = NET_AX25_T1_TIMEOUT,
  111. .procname = "t1_timeout",
  112. .maxlen = sizeof(int),
  113. .mode = 0644,
  114. .proc_handler = &proc_dointvec_minmax,
  115. .strategy = &sysctl_intvec,
  116. .extra1 = &min_t1,
  117. .extra2 = &max_t1
  118. },
  119. {
  120. .ctl_name = NET_AX25_T2_TIMEOUT,
  121. .procname = "t2_timeout",
  122. .maxlen = sizeof(int),
  123. .mode = 0644,
  124. .proc_handler = &proc_dointvec_minmax,
  125. .strategy = &sysctl_intvec,
  126. .extra1 = &min_t2,
  127. .extra2 = &max_t2
  128. },
  129. {
  130. .ctl_name = NET_AX25_T3_TIMEOUT,
  131. .procname = "t3_timeout",
  132. .maxlen = sizeof(int),
  133. .mode = 0644,
  134. .proc_handler = &proc_dointvec_minmax,
  135. .strategy = &sysctl_intvec,
  136. .extra1 = &min_t3,
  137. .extra2 = &max_t3
  138. },
  139. {
  140. .ctl_name = NET_AX25_IDLE_TIMEOUT,
  141. .procname = "idle_timeout",
  142. .maxlen = sizeof(int),
  143. .mode = 0644,
  144. .proc_handler = &proc_dointvec_minmax,
  145. .strategy = &sysctl_intvec,
  146. .extra1 = &min_idle,
  147. .extra2 = &max_idle
  148. },
  149. {
  150. .ctl_name = NET_AX25_N2,
  151. .procname = "maximum_retry_count",
  152. .maxlen = sizeof(int),
  153. .mode = 0644,
  154. .proc_handler = &proc_dointvec_minmax,
  155. .strategy = &sysctl_intvec,
  156. .extra1 = &min_n2,
  157. .extra2 = &max_n2
  158. },
  159. {
  160. .ctl_name = NET_AX25_PACLEN,
  161. .procname = "maximum_packet_length",
  162. .maxlen = sizeof(int),
  163. .mode = 0644,
  164. .proc_handler = &proc_dointvec_minmax,
  165. .strategy = &sysctl_intvec,
  166. .extra1 = &min_paclen,
  167. .extra2 = &max_paclen
  168. },
  169. {
  170. .ctl_name = NET_AX25_PROTOCOL,
  171. .procname = "protocol",
  172. .maxlen = sizeof(int),
  173. .mode = 0644,
  174. .proc_handler = &proc_dointvec_minmax,
  175. .strategy = &sysctl_intvec,
  176. .extra1 = &min_proto,
  177. .extra2 = &max_proto
  178. },
  179. {
  180. .ctl_name = NET_AX25_DAMA_SLAVE_TIMEOUT,
  181. .procname = "dama_slave_timeout",
  182. .maxlen = sizeof(int),
  183. .mode = 0644,
  184. .proc_handler = &proc_dointvec_minmax,
  185. .strategy = &sysctl_intvec,
  186. .extra1 = &min_ds_timeout,
  187. .extra2 = &max_ds_timeout
  188. },
  189. { .ctl_name = 0 } /* that's all, folks! */
  190. };
  191. void ax25_register_sysctl(void)
  192. {
  193. ax25_dev *ax25_dev;
  194. int n, k;
  195. spin_lock_bh(&ax25_dev_lock);
  196. for (ax25_table_size = sizeof(ctl_table), ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next)
  197. ax25_table_size += sizeof(ctl_table);
  198. if ((ax25_table = kmalloc(ax25_table_size, GFP_ATOMIC)) == NULL) {
  199. spin_unlock_bh(&ax25_dev_lock);
  200. return;
  201. }
  202. memset(ax25_table, 0x00, ax25_table_size);
  203. for (n = 0, ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) {
  204. ctl_table *child = kmalloc(sizeof(ax25_param_table), GFP_ATOMIC);
  205. if (!child) {
  206. while (n--)
  207. kfree(ax25_table[n].child);
  208. kfree(ax25_table);
  209. spin_unlock_bh(&ax25_dev_lock);
  210. return;
  211. }
  212. memcpy(child, ax25_param_table, sizeof(ax25_param_table));
  213. ax25_table[n].child = ax25_dev->systable = child;
  214. ax25_table[n].ctl_name = n + 1;
  215. ax25_table[n].procname = ax25_dev->dev->name;
  216. ax25_table[n].mode = 0555;
  217. #ifndef CONFIG_AX25_DAMA_SLAVE
  218. /*
  219. * We do not wish to have a representation of this parameter
  220. * in /proc/sys/ when configured *not* to include the
  221. * AX.25 DAMA slave code, do we?
  222. */
  223. child[AX25_VALUES_DS_TIMEOUT].procname = NULL;
  224. #endif
  225. child[AX25_MAX_VALUES].ctl_name = 0; /* just in case... */
  226. for (k = 0; k < AX25_MAX_VALUES; k++)
  227. child[k].data = &ax25_dev->values[k];
  228. n++;
  229. }
  230. spin_unlock_bh(&ax25_dev_lock);
  231. ax25_dir_table[0].child = ax25_table;
  232. ax25_table_header = register_sysctl_table(ax25_root_table, 1);
  233. }
  234. void ax25_unregister_sysctl(void)
  235. {
  236. ctl_table *p;
  237. unregister_sysctl_table(ax25_table_header);
  238. ax25_dir_table[0].child = NULL;
  239. for (p = ax25_table; p->ctl_name; p++)
  240. kfree(p->child);
  241. kfree(ax25_table);
  242. }