sm_statetable.c 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. /* SCTP kernel reference Implementation
  2. * (C) Copyright IBM Corp. 2001, 2004
  3. * Copyright (c) 1999-2000 Cisco, Inc.
  4. * Copyright (c) 1999-2001 Motorola, Inc.
  5. * Copyright (c) 2001 Intel Corp.
  6. * Copyright (c) 2001 Nokia, Inc.
  7. *
  8. * This file is part of the SCTP kernel reference Implementation
  9. *
  10. * These are the state tables for the SCTP state machine.
  11. *
  12. * The SCTP reference implementation is free software;
  13. * you can redistribute it and/or modify it under the terms of
  14. * the GNU General Public License as published by
  15. * the Free Software Foundation; either version 2, or (at your option)
  16. * any later version.
  17. *
  18. * The SCTP reference implementation is distributed in the hope that it
  19. * will be useful, but WITHOUT ANY WARRANTY; without even the implied
  20. * ************************
  21. * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  22. * See the GNU General Public License for more details.
  23. *
  24. * You should have received a copy of the GNU General Public License
  25. * along with GNU CC; see the file COPYING. If not, write to
  26. * the Free Software Foundation, 59 Temple Place - Suite 330,
  27. * Boston, MA 02111-1307, USA.
  28. *
  29. * Please send any bug reports or fixes you make to the
  30. * email address(es):
  31. * lksctp developers <lksctp-developers@lists.sourceforge.net>
  32. *
  33. * Or submit a bug report through the following website:
  34. * http://www.sf.net/projects/lksctp
  35. *
  36. * Written or modified by:
  37. * La Monte H.P. Yarroll <piggy@acm.org>
  38. * Karl Knutson <karl@athena.chicago.il.us>
  39. * Jon Grimm <jgrimm@us.ibm.com>
  40. * Hui Huang <hui.huang@nokia.com>
  41. * Daisy Chang <daisyc@us.ibm.com>
  42. * Ardelle Fan <ardelle.fan@intel.com>
  43. * Sridhar Samudrala <sri@us.ibm.com>
  44. *
  45. * Any bugs reported given to us we will try to fix... any fixes shared will
  46. * be incorporated into the next SCTP release.
  47. */
  48. #include <linux/skbuff.h>
  49. #include <net/sctp/sctp.h>
  50. #include <net/sctp/sm.h>
  51. static const sctp_sm_table_entry_t
  52. primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES];
  53. static const sctp_sm_table_entry_t
  54. other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES];
  55. static const sctp_sm_table_entry_t
  56. timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES];
  57. static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid,
  58. sctp_state_t state);
  59. static const sctp_sm_table_entry_t bug = {
  60. .fn = sctp_sf_bug,
  61. .name = "sctp_sf_bug"
  62. };
  63. #define DO_LOOKUP(_max, _type, _table) \
  64. if ((event_subtype._type > (_max))) { \
  65. printk(KERN_WARNING \
  66. "sctp table %p possible attack:" \
  67. " event %d exceeds max %d\n", \
  68. _table, event_subtype._type, _max); \
  69. return &bug; \
  70. } \
  71. return &_table[event_subtype._type][(int)state];
  72. const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
  73. sctp_state_t state,
  74. sctp_subtype_t event_subtype)
  75. {
  76. switch (event_type) {
  77. case SCTP_EVENT_T_CHUNK:
  78. return sctp_chunk_event_lookup(event_subtype.chunk, state);
  79. break;
  80. case SCTP_EVENT_T_TIMEOUT:
  81. DO_LOOKUP(SCTP_EVENT_TIMEOUT_MAX, timeout,
  82. timeout_event_table);
  83. break;
  84. case SCTP_EVENT_T_OTHER:
  85. DO_LOOKUP(SCTP_EVENT_OTHER_MAX, other, other_event_table);
  86. break;
  87. case SCTP_EVENT_T_PRIMITIVE:
  88. DO_LOOKUP(SCTP_EVENT_PRIMITIVE_MAX, primitive,
  89. primitive_event_table);
  90. break;
  91. default:
  92. /* Yikes! We got an illegal event type. */
  93. return &bug;
  94. };
  95. }
  96. #define TYPE_SCTP_DATA { \
  97. /* SCTP_STATE_EMPTY */ \
  98. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  99. /* SCTP_STATE_CLOSED */ \
  100. {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
  101. /* SCTP_STATE_COOKIE_WAIT */ \
  102. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  103. /* SCTP_STATE_COOKIE_ECHOED */ \
  104. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  105. /* SCTP_STATE_ESTABLISHED */ \
  106. {.fn = sctp_sf_eat_data_6_2, .name = "sctp_sf_eat_data_6_2"}, \
  107. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  108. {.fn = sctp_sf_eat_data_6_2, .name = "sctp_sf_eat_data_6_2"}, \
  109. /* SCTP_STATE_SHUTDOWN_SENT */ \
  110. {.fn = sctp_sf_eat_data_fast_4_4, .name = "sctp_sf_eat_data_fast_4_4"}, \
  111. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  112. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  113. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  114. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  115. } /* TYPE_SCTP_DATA */
  116. #define TYPE_SCTP_INIT { \
  117. /* SCTP_STATE_EMPTY */ \
  118. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  119. /* SCTP_STATE_CLOSED */ \
  120. {.fn = sctp_sf_do_5_1B_init, .name = "sctp_sf_do_5_1B_init"}, \
  121. /* SCTP_STATE_COOKIE_WAIT */ \
  122. {.fn = sctp_sf_do_5_2_1_siminit, .name = "sctp_sf_do_5_2_1_siminit"}, \
  123. /* SCTP_STATE_COOKIE_ECHOED */ \
  124. {.fn = sctp_sf_do_5_2_1_siminit, .name = "sctp_sf_do_5_2_1_siminit"}, \
  125. /* SCTP_STATE_ESTABLISHED */ \
  126. {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
  127. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  128. {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
  129. /* SCTP_STATE_SHUTDOWN_SENT */ \
  130. {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
  131. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  132. {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
  133. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  134. {.fn = sctp_sf_do_9_2_reshutack, .name = "sctp_sf_do_9_2_reshutack"}, \
  135. } /* TYPE_SCTP_INIT */
  136. #define TYPE_SCTP_INIT_ACK { \
  137. /* SCTP_STATE_EMPTY */ \
  138. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  139. /* SCTP_STATE_CLOSED */ \
  140. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  141. /* SCTP_STATE_COOKIE_WAIT */ \
  142. {.fn = sctp_sf_do_5_1C_ack, .name = "sctp_sf_do_5_1C_ack"}, \
  143. /* SCTP_STATE_COOKIE_ECHOED */ \
  144. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  145. /* SCTP_STATE_ESTABLISHED */ \
  146. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  147. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  148. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  149. /* SCTP_STATE_SHUTDOWN_SENT */ \
  150. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  151. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  152. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  153. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  154. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  155. } /* TYPE_SCTP_INIT_ACK */
  156. #define TYPE_SCTP_SACK { \
  157. /* SCTP_STATE_EMPTY */ \
  158. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  159. /* SCTP_STATE_CLOSED */ \
  160. {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
  161. /* SCTP_STATE_COOKIE_WAIT */ \
  162. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  163. /* SCTP_STATE_COOKIE_ECHOED */ \
  164. {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
  165. /* SCTP_STATE_ESTABLISHED */ \
  166. {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
  167. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  168. {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
  169. /* SCTP_STATE_SHUTDOWN_SENT */ \
  170. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  171. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  172. {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
  173. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  174. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  175. } /* TYPE_SCTP_SACK */
  176. #define TYPE_SCTP_HEARTBEAT { \
  177. /* SCTP_STATE_EMPTY */ \
  178. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  179. /* SCTP_STATE_CLOSED */ \
  180. {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
  181. /* SCTP_STATE_COOKIE_WAIT */ \
  182. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  183. /* SCTP_STATE_COOKIE_ECHOED */ \
  184. {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
  185. /* SCTP_STATE_ESTABLISHED */ \
  186. {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
  187. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  188. {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
  189. /* SCTP_STATE_SHUTDOWN_SENT */ \
  190. {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
  191. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  192. {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
  193. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  194. /* This should not happen, but we are nice. */ \
  195. {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
  196. } /* TYPE_SCTP_HEARTBEAT */
  197. #define TYPE_SCTP_HEARTBEAT_ACK { \
  198. /* SCTP_STATE_EMPTY */ \
  199. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  200. /* SCTP_STATE_CLOSED */ \
  201. {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
  202. /* SCTP_STATE_COOKIE_WAIT */ \
  203. {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
  204. /* SCTP_STATE_COOKIE_ECHOED */ \
  205. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  206. /* SCTP_STATE_ESTABLISHED */ \
  207. {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
  208. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  209. {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
  210. /* SCTP_STATE_SHUTDOWN_SENT */ \
  211. {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
  212. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  213. {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
  214. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  215. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  216. } /* TYPE_SCTP_HEARTBEAT_ACK */
  217. #define TYPE_SCTP_ABORT { \
  218. /* SCTP_STATE_EMPTY */ \
  219. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  220. /* SCTP_STATE_CLOSED */ \
  221. {.fn = sctp_sf_pdiscard, .name = "sctp_sf_pdiscard"}, \
  222. /* SCTP_STATE_COOKIE_WAIT */ \
  223. {.fn = sctp_sf_cookie_wait_abort, .name = "sctp_sf_cookie_wait_abort"}, \
  224. /* SCTP_STATE_COOKIE_ECHOED */ \
  225. {.fn = sctp_sf_cookie_echoed_abort, \
  226. .name = "sctp_sf_cookie_echoed_abort"}, \
  227. /* SCTP_STATE_ESTABLISHED */ \
  228. {.fn = sctp_sf_do_9_1_abort, .name = "sctp_sf_do_9_1_abort"}, \
  229. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  230. {.fn = sctp_sf_shutdown_pending_abort, \
  231. .name = "sctp_sf_shutdown_pending_abort"}, \
  232. /* SCTP_STATE_SHUTDOWN_SENT */ \
  233. {.fn = sctp_sf_shutdown_sent_abort, \
  234. .name = "sctp_sf_shutdown_sent_abort"}, \
  235. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  236. {.fn = sctp_sf_do_9_1_abort, .name = "sctp_sf_do_9_1_abort"}, \
  237. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  238. {.fn = sctp_sf_shutdown_ack_sent_abort, \
  239. .name = "sctp_sf_shutdown_ack_sent_abort"}, \
  240. } /* TYPE_SCTP_ABORT */
  241. #define TYPE_SCTP_SHUTDOWN { \
  242. /* SCTP_STATE_EMPTY */ \
  243. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  244. /* SCTP_STATE_CLOSED */ \
  245. {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
  246. /* SCTP_STATE_COOKIE_WAIT */ \
  247. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  248. /* SCTP_STATE_COOKIE_ECHOED */ \
  249. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  250. /* SCTP_STATE_ESTABLISHED */ \
  251. {.fn = sctp_sf_do_9_2_shutdown, .name = "sctp_sf_do_9_2_shutdown"}, \
  252. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  253. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  254. /* SCTP_STATE_SHUTDOWN_SENT */ \
  255. {.fn = sctp_sf_do_9_2_shutdown_ack, \
  256. .name = "sctp_sf_do_9_2_shutdown_ack"}, \
  257. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  258. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  259. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  260. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  261. } /* TYPE_SCTP_SHUTDOWN */
  262. #define TYPE_SCTP_SHUTDOWN_ACK { \
  263. /* SCTP_STATE_EMPTY */ \
  264. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  265. /* SCTP_STATE_CLOSED */ \
  266. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  267. /* SCTP_STATE_COOKIE_WAIT */ \
  268. {.fn = sctp_sf_do_8_5_1_E_sa, .name = "sctp_sf_do_8_5_1_E_sa"}, \
  269. /* SCTP_STATE_COOKIE_ECHOED */ \
  270. {.fn = sctp_sf_do_8_5_1_E_sa, .name = "sctp_sf_do_8_5_1_E_sa"}, \
  271. /* SCTP_STATE_ESTABLISHED */ \
  272. {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
  273. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  274. {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
  275. /* SCTP_STATE_SHUTDOWN_SENT */ \
  276. {.fn = sctp_sf_do_9_2_final, .name = "sctp_sf_do_9_2_final"}, \
  277. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  278. {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
  279. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  280. {.fn = sctp_sf_do_9_2_final, .name = "sctp_sf_do_9_2_final"}, \
  281. } /* TYPE_SCTP_SHUTDOWN_ACK */
  282. #define TYPE_SCTP_ERROR { \
  283. /* SCTP_STATE_EMPTY */ \
  284. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  285. /* SCTP_STATE_CLOSED */ \
  286. {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
  287. /* SCTP_STATE_COOKIE_WAIT */ \
  288. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  289. /* SCTP_STATE_COOKIE_ECHOED */ \
  290. {.fn = sctp_sf_cookie_echoed_err, .name = "sctp_sf_cookie_echoed_err"}, \
  291. /* SCTP_STATE_ESTABLISHED */ \
  292. {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \
  293. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  294. {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \
  295. /* SCTP_STATE_SHUTDOWN_SENT */ \
  296. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  297. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  298. {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \
  299. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  300. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  301. } /* TYPE_SCTP_ERROR */
  302. #define TYPE_SCTP_COOKIE_ECHO { \
  303. /* SCTP_STATE_EMPTY */ \
  304. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  305. /* SCTP_STATE_CLOSED */ \
  306. {.fn = sctp_sf_do_5_1D_ce, .name = "sctp_sf_do_5_1D_ce"}, \
  307. /* SCTP_STATE_COOKIE_WAIT */ \
  308. {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
  309. /* SCTP_STATE_COOKIE_ECHOED */ \
  310. {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
  311. /* SCTP_STATE_ESTABLISHED */ \
  312. {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
  313. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  314. {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
  315. /* SCTP_STATE_SHUTDOWN_SENT */ \
  316. {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
  317. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  318. {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
  319. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  320. {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
  321. } /* TYPE_SCTP_COOKIE_ECHO */
  322. #define TYPE_SCTP_COOKIE_ACK { \
  323. /* SCTP_STATE_EMPTY */ \
  324. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  325. /* SCTP_STATE_CLOSED */ \
  326. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  327. /* SCTP_STATE_COOKIE_WAIT */ \
  328. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  329. /* SCTP_STATE_COOKIE_ECHOED */ \
  330. {.fn = sctp_sf_do_5_1E_ca, .name = "sctp_sf_do_5_1E_ca"}, \
  331. /* SCTP_STATE_ESTABLISHED */ \
  332. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  333. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  334. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  335. /* SCTP_STATE_SHUTDOWN_SENT */ \
  336. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  337. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  338. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  339. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  340. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  341. } /* TYPE_SCTP_COOKIE_ACK */
  342. #define TYPE_SCTP_ECN_ECNE { \
  343. /* SCTP_STATE_EMPTY */ \
  344. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  345. /* SCTP_STATE_CLOSED */ \
  346. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  347. /* SCTP_STATE_COOKIE_WAIT */ \
  348. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  349. /* SCTP_STATE_COOKIE_ECHOED */ \
  350. {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
  351. /* SCTP_STATE_ESTABLISHED */ \
  352. {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
  353. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  354. {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
  355. /* SCTP_STATE_SHUTDOWN_SENT */ \
  356. {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
  357. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  358. {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
  359. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  360. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  361. } /* TYPE_SCTP_ECN_ECNE */
  362. #define TYPE_SCTP_ECN_CWR { \
  363. /* SCTP_STATE_EMPTY */ \
  364. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  365. /* SCTP_STATE_CLOSED */ \
  366. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  367. /* SCTP_STATE_COOKIE_WAIT */ \
  368. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  369. /* SCTP_STATE_COOKIE_ECHOED */ \
  370. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  371. /* SCTP_STATE_ESTABLISHED */ \
  372. {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \
  373. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  374. {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \
  375. /* SCTP_STATE_SHUTDOWN_SENT */ \
  376. {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \
  377. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  378. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  379. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  380. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  381. } /* TYPE_SCTP_ECN_CWR */
  382. #define TYPE_SCTP_SHUTDOWN_COMPLETE { \
  383. /* SCTP_STATE_EMPTY */ \
  384. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  385. /* SCTP_STATE_CLOSED */ \
  386. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  387. /* SCTP_STATE_COOKIE_WAIT */ \
  388. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  389. /* SCTP_STATE_COOKIE_ECHOED */ \
  390. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  391. /* SCTP_STATE_ESTABLISHED */ \
  392. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  393. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  394. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  395. /* SCTP_STATE_SHUTDOWN_SENT */ \
  396. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  397. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  398. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  399. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  400. {.fn = sctp_sf_do_4_C, .name = "sctp_sf_do_4_C"}, \
  401. } /* TYPE_SCTP_SHUTDOWN_COMPLETE */
  402. /* The primary index for this table is the chunk type.
  403. * The secondary index for this table is the state.
  404. *
  405. * For base protocol (RFC 2960).
  406. */
  407. static const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  408. TYPE_SCTP_DATA,
  409. TYPE_SCTP_INIT,
  410. TYPE_SCTP_INIT_ACK,
  411. TYPE_SCTP_SACK,
  412. TYPE_SCTP_HEARTBEAT,
  413. TYPE_SCTP_HEARTBEAT_ACK,
  414. TYPE_SCTP_ABORT,
  415. TYPE_SCTP_SHUTDOWN,
  416. TYPE_SCTP_SHUTDOWN_ACK,
  417. TYPE_SCTP_ERROR,
  418. TYPE_SCTP_COOKIE_ECHO,
  419. TYPE_SCTP_COOKIE_ACK,
  420. TYPE_SCTP_ECN_ECNE,
  421. TYPE_SCTP_ECN_CWR,
  422. TYPE_SCTP_SHUTDOWN_COMPLETE,
  423. }; /* state_fn_t chunk_event_table[][] */
  424. #define TYPE_SCTP_ASCONF { \
  425. /* SCTP_STATE_EMPTY */ \
  426. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  427. /* SCTP_STATE_CLOSED */ \
  428. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  429. /* SCTP_STATE_COOKIE_WAIT */ \
  430. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  431. /* SCTP_STATE_COOKIE_ECHOED */ \
  432. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  433. /* SCTP_STATE_ESTABLISHED */ \
  434. {.fn = sctp_sf_do_asconf, .name = "sctp_sf_do_asconf"}, \
  435. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  436. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  437. /* SCTP_STATE_SHUTDOWN_SENT */ \
  438. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  439. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  440. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  441. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  442. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  443. } /* TYPE_SCTP_ASCONF */
  444. #define TYPE_SCTP_ASCONF_ACK { \
  445. /* SCTP_STATE_EMPTY */ \
  446. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  447. /* SCTP_STATE_CLOSED */ \
  448. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  449. /* SCTP_STATE_COOKIE_WAIT */ \
  450. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  451. /* SCTP_STATE_COOKIE_ECHOED */ \
  452. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  453. /* SCTP_STATE_ESTABLISHED */ \
  454. {.fn = sctp_sf_do_asconf_ack, .name = "sctp_sf_do_asconf_ack"}, \
  455. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  456. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  457. /* SCTP_STATE_SHUTDOWN_SENT */ \
  458. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  459. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  460. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  461. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  462. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  463. } /* TYPE_SCTP_ASCONF_ACK */
  464. /* The primary index for this table is the chunk type.
  465. * The secondary index for this table is the state.
  466. */
  467. static const sctp_sm_table_entry_t addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  468. TYPE_SCTP_ASCONF,
  469. TYPE_SCTP_ASCONF_ACK,
  470. }; /*state_fn_t addip_chunk_event_table[][] */
  471. #define TYPE_SCTP_FWD_TSN { \
  472. /* SCTP_STATE_EMPTY */ \
  473. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
  474. /* SCTP_STATE_CLOSED */ \
  475. {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
  476. /* SCTP_STATE_COOKIE_WAIT */ \
  477. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  478. /* SCTP_STATE_COOKIE_ECHOED */ \
  479. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  480. /* SCTP_STATE_ESTABLISHED */ \
  481. {.fn = sctp_sf_eat_fwd_tsn, .name = "sctp_sf_eat_fwd_tsn"}, \
  482. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  483. {.fn = sctp_sf_eat_fwd_tsn, .name = "sctp_sf_eat_fwd_tsn"}, \
  484. /* SCTP_STATE_SHUTDOWN_SENT */ \
  485. {.fn = sctp_sf_eat_fwd_tsn_fast, .name = "sctp_sf_eat_fwd_tsn_fast"}, \
  486. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  487. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  488. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  489. {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
  490. } /* TYPE_SCTP_FWD_TSN */
  491. /* The primary index for this table is the chunk type.
  492. * The secondary index for this table is the state.
  493. */
  494. static const sctp_sm_table_entry_t prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  495. TYPE_SCTP_FWD_TSN,
  496. }; /*state_fn_t prsctp_chunk_event_table[][] */
  497. static const sctp_sm_table_entry_t
  498. chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
  499. /* SCTP_STATE_EMPTY */
  500. {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"},
  501. /* SCTP_STATE_CLOSED */
  502. {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"},
  503. /* SCTP_STATE_COOKIE_WAIT */
  504. {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
  505. /* SCTP_STATE_COOKIE_ECHOED */
  506. {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
  507. /* SCTP_STATE_ESTABLISHED */
  508. {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
  509. /* SCTP_STATE_SHUTDOWN_PENDING */
  510. {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
  511. /* SCTP_STATE_SHUTDOWN_SENT */
  512. {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
  513. /* SCTP_STATE_SHUTDOWN_RECEIVED */
  514. {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
  515. /* SCTP_STATE_SHUTDOWN_ACK_SENT */
  516. {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
  517. }; /* chunk unknown */
  518. #define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \
  519. /* SCTP_STATE_EMPTY */ \
  520. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  521. /* SCTP_STATE_CLOSED */ \
  522. {.fn = sctp_sf_do_prm_asoc, .name = "sctp_sf_do_prm_asoc"}, \
  523. /* SCTP_STATE_COOKIE_WAIT */ \
  524. {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
  525. /* SCTP_STATE_COOKIE_ECHOED */ \
  526. {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
  527. /* SCTP_STATE_ESTABLISHED */ \
  528. {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
  529. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  530. {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
  531. /* SCTP_STATE_SHUTDOWN_SENT */ \
  532. {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
  533. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  534. {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
  535. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  536. {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
  537. } /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
  538. #define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \
  539. /* SCTP_STATE_EMPTY */ \
  540. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  541. /* SCTP_STATE_CLOSED */ \
  542. {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
  543. /* SCTP_STATE_COOKIE_WAIT */ \
  544. {.fn = sctp_sf_cookie_wait_prm_shutdown, \
  545. .name = "sctp_sf_cookie_wait_prm_shutdown"}, \
  546. /* SCTP_STATE_COOKIE_ECHOED */ \
  547. {.fn = sctp_sf_cookie_echoed_prm_shutdown, \
  548. .name = "sctp_sf_cookie_echoed_prm_shutdown"},\
  549. /* SCTP_STATE_ESTABLISHED */ \
  550. {.fn = sctp_sf_do_9_2_prm_shutdown, \
  551. .name = "sctp_sf_do_9_2_prm_shutdown"}, \
  552. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  553. {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
  554. /* SCTP_STATE_SHUTDOWN_SENT */ \
  555. {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
  556. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  557. {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
  558. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  559. {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
  560. } /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
  561. #define TYPE_SCTP_PRIMITIVE_ABORT { \
  562. /* SCTP_STATE_EMPTY */ \
  563. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  564. /* SCTP_STATE_CLOSED */ \
  565. {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
  566. /* SCTP_STATE_COOKIE_WAIT */ \
  567. {.fn = sctp_sf_cookie_wait_prm_abort, \
  568. .name = "sctp_sf_cookie_wait_prm_abort"}, \
  569. /* SCTP_STATE_COOKIE_ECHOED */ \
  570. {.fn = sctp_sf_cookie_echoed_prm_abort, \
  571. .name = "sctp_sf_cookie_echoed_prm_abort"}, \
  572. /* SCTP_STATE_ESTABLISHED */ \
  573. {.fn = sctp_sf_do_9_1_prm_abort, \
  574. .name = "sctp_sf_do_9_1_prm_abort"}, \
  575. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  576. {.fn = sctp_sf_shutdown_pending_prm_abort, \
  577. .name = "sctp_sf_shutdown_pending_prm_abort"}, \
  578. /* SCTP_STATE_SHUTDOWN_SENT */ \
  579. {.fn = sctp_sf_shutdown_sent_prm_abort, \
  580. .name = "sctp_sf_shutdown_sent_prm_abort"}, \
  581. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  582. {.fn = sctp_sf_do_9_1_prm_abort, \
  583. .name = "sctp_sf_do_9_1_prm_abort"}, \
  584. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  585. {.fn = sctp_sf_shutdown_ack_sent_prm_abort, \
  586. .name = "sctp_sf_shutdown_ack_sent_prm_abort"}, \
  587. } /* TYPE_SCTP_PRIMITIVE_ABORT */
  588. #define TYPE_SCTP_PRIMITIVE_SEND { \
  589. /* SCTP_STATE_EMPTY */ \
  590. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  591. /* SCTP_STATE_CLOSED */ \
  592. {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
  593. /* SCTP_STATE_COOKIE_WAIT */ \
  594. {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \
  595. /* SCTP_STATE_COOKIE_ECHOED */ \
  596. {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \
  597. /* SCTP_STATE_ESTABLISHED */ \
  598. {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \
  599. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  600. {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
  601. /* SCTP_STATE_SHUTDOWN_SENT */ \
  602. {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
  603. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  604. {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
  605. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  606. {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
  607. } /* TYPE_SCTP_PRIMITIVE_SEND */
  608. #define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \
  609. /* SCTP_STATE_EMPTY */ \
  610. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  611. /* SCTP_STATE_CLOSED */ \
  612. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  613. /* SCTP_STATE_COOKIE_WAIT */ \
  614. {.fn = sctp_sf_do_prm_requestheartbeat, \
  615. .name = "sctp_sf_do_prm_requestheartbeat"}, \
  616. /* SCTP_STATE_COOKIE_ECHOED */ \
  617. {.fn = sctp_sf_do_prm_requestheartbeat, \
  618. .name = "sctp_sf_do_prm_requestheartbeat"}, \
  619. /* SCTP_STATE_ESTABLISHED */ \
  620. {.fn = sctp_sf_do_prm_requestheartbeat, \
  621. .name = "sctp_sf_do_prm_requestheartbeat"}, \
  622. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  623. {.fn = sctp_sf_do_prm_requestheartbeat, \
  624. .name = "sctp_sf_do_prm_requestheartbeat"}, \
  625. /* SCTP_STATE_SHUTDOWN_SENT */ \
  626. {.fn = sctp_sf_do_prm_requestheartbeat, \
  627. .name = "sctp_sf_do_prm_requestheartbeat"}, \
  628. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  629. {.fn = sctp_sf_do_prm_requestheartbeat, \
  630. .name = "sctp_sf_do_prm_requestheartbeat"}, \
  631. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  632. {.fn = sctp_sf_do_prm_requestheartbeat, \
  633. .name = "sctp_sf_do_prm_requestheartbeat"}, \
  634. } /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
  635. #define TYPE_SCTP_PRIMITIVE_ASCONF { \
  636. /* SCTP_STATE_EMPTY */ \
  637. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  638. /* SCTP_STATE_CLOSED */ \
  639. {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
  640. /* SCTP_STATE_COOKIE_WAIT */ \
  641. {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
  642. /* SCTP_STATE_COOKIE_ECHOED */ \
  643. {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
  644. /* SCTP_STATE_ESTABLISHED */ \
  645. {.fn = sctp_sf_do_prm_asconf, .name = "sctp_sf_do_prm_asconf"}, \
  646. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  647. {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
  648. /* SCTP_STATE_SHUTDOWN_SENT */ \
  649. {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
  650. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  651. {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
  652. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  653. {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
  654. } /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
  655. /* The primary index for this table is the primitive type.
  656. * The secondary index for this table is the state.
  657. */
  658. static const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = {
  659. TYPE_SCTP_PRIMITIVE_ASSOCIATE,
  660. TYPE_SCTP_PRIMITIVE_SHUTDOWN,
  661. TYPE_SCTP_PRIMITIVE_ABORT,
  662. TYPE_SCTP_PRIMITIVE_SEND,
  663. TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
  664. TYPE_SCTP_PRIMITIVE_ASCONF,
  665. };
  666. #define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
  667. /* SCTP_STATE_EMPTY */ \
  668. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  669. /* SCTP_STATE_CLOSED */ \
  670. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  671. /* SCTP_STATE_COOKIE_WAIT */ \
  672. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  673. /* SCTP_STATE_COOKIE_ECHOED */ \
  674. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  675. /* SCTP_STATE_ESTABLISHED */ \
  676. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  677. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  678. {.fn = sctp_sf_do_9_2_start_shutdown, \
  679. .name = "sctp_do_9_2_start_shutdown"}, \
  680. /* SCTP_STATE_SHUTDOWN_SENT */ \
  681. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  682. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  683. {.fn = sctp_sf_do_9_2_shutdown_ack, \
  684. .name = "sctp_sf_do_9_2_shutdown_ack"}, \
  685. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  686. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  687. }
  688. #define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH { \
  689. /* SCTP_STATE_EMPTY */ \
  690. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  691. /* SCTP_STATE_CLOSED */ \
  692. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  693. /* SCTP_STATE_COOKIE_WAIT */ \
  694. {.fn = sctp_sf_cookie_wait_icmp_abort, \
  695. .name = "sctp_sf_cookie_wait_icmp_abort"}, \
  696. /* SCTP_STATE_COOKIE_ECHOED */ \
  697. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  698. /* SCTP_STATE_ESTABLISHED */ \
  699. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  700. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  701. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  702. /* SCTP_STATE_SHUTDOWN_SENT */ \
  703. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  704. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  705. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  706. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  707. {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
  708. }
  709. static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = {
  710. TYPE_SCTP_OTHER_NO_PENDING_TSN,
  711. TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH,
  712. };
  713. #define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
  714. /* SCTP_STATE_EMPTY */ \
  715. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  716. /* SCTP_STATE_CLOSED */ \
  717. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  718. /* SCTP_STATE_COOKIE_WAIT */ \
  719. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  720. /* SCTP_STATE_COOKIE_ECHOED */ \
  721. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  722. /* SCTP_STATE_ESTABLISHED */ \
  723. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  724. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  725. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  726. /* SCTP_STATE_SHUTDOWN_SENT */ \
  727. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  728. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  729. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  730. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  731. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  732. }
  733. #define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
  734. /* SCTP_STATE_EMPTY */ \
  735. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  736. /* SCTP_STATE_CLOSED */ \
  737. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  738. /* SCTP_STATE_COOKIE_WAIT */ \
  739. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  740. /* SCTP_STATE_COOKIE_ECHOED */ \
  741. {.fn = sctp_sf_t1_cookie_timer_expire, \
  742. .name = "sctp_sf_t1_cookie_timer_expire"}, \
  743. /* SCTP_STATE_ESTABLISHED */ \
  744. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  745. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  746. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  747. /* SCTP_STATE_SHUTDOWN_SENT */ \
  748. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  749. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  750. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  751. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  752. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  753. }
  754. #define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
  755. /* SCTP_STATE_EMPTY */ \
  756. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  757. /* SCTP_STATE_CLOSED */ \
  758. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  759. /* SCTP_STATE_COOKIE_WAIT */ \
  760. {.fn = sctp_sf_t1_init_timer_expire, \
  761. .name = "sctp_sf_t1_init_timer_expire"}, \
  762. /* SCTP_STATE_COOKIE_ECHOED */ \
  763. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  764. /* SCTP_STATE_ESTABLISHED */ \
  765. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  766. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  767. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  768. /* SCTP_STATE_SHUTDOWN_SENT */ \
  769. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  770. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  771. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  772. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  773. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  774. }
  775. #define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
  776. /* SCTP_STATE_EMPTY */ \
  777. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  778. /* SCTP_STATE_CLOSED */ \
  779. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  780. /* SCTP_STATE_COOKIE_WAIT */ \
  781. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  782. /* SCTP_STATE_COOKIE_ECHOED */ \
  783. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  784. /* SCTP_STATE_ESTABLISHED */ \
  785. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  786. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  787. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  788. /* SCTP_STATE_SHUTDOWN_SENT */ \
  789. {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \
  790. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  791. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  792. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  793. {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \
  794. }
  795. #define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
  796. /* SCTP_STATE_EMPTY */ \
  797. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  798. /* SCTP_STATE_CLOSED */ \
  799. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  800. /* SCTP_STATE_COOKIE_WAIT */ \
  801. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  802. /* SCTP_STATE_COOKIE_ECHOED */ \
  803. {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
  804. /* SCTP_STATE_ESTABLISHED */ \
  805. {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
  806. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  807. {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
  808. /* SCTP_STATE_SHUTDOWN_SENT */ \
  809. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  810. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  811. {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
  812. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  813. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  814. }
  815. #define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
  816. /* SCTP_STATE_EMPTY */ \
  817. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  818. /* SCTP_STATE_CLOSED */ \
  819. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  820. /* SCTP_STATE_COOKIE_WAIT */ \
  821. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  822. /* SCTP_STATE_COOKIE_ECHOED */ \
  823. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  824. /* SCTP_STATE_ESTABLISHED */ \
  825. {.fn = sctp_sf_t4_timer_expire, .name = "sctp_sf_t4_timer_expire"}, \
  826. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  827. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  828. /* SCTP_STATE_SHUTDOWN_SENT */ \
  829. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  830. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  831. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  832. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  833. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  834. }
  835. #define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
  836. /* SCTP_STATE_EMPTY */ \
  837. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  838. /* SCTP_STATE_CLOSED */ \
  839. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  840. /* SCTP_STATE_COOKIE_WAIT */ \
  841. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  842. /* SCTP_STATE_COOKIE_ECHOED */ \
  843. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  844. /* SCTP_STATE_ESTABLISHED */ \
  845. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  846. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  847. {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \
  848. /* SCTP_STATE_SHUTDOWN_SENT */ \
  849. {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \
  850. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  851. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  852. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  853. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  854. }
  855. #define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
  856. /* SCTP_STATE_EMPTY */ \
  857. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  858. /* SCTP_STATE_CLOSED */ \
  859. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  860. /* SCTP_STATE_COOKIE_WAIT */ \
  861. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  862. /* SCTP_STATE_COOKIE_ECHOED */ \
  863. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  864. /* SCTP_STATE_ESTABLISHED */ \
  865. {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
  866. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  867. {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
  868. /* SCTP_STATE_SHUTDOWN_SENT */ \
  869. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  870. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  871. {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
  872. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  873. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  874. }
  875. #define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
  876. /* SCTP_STATE_EMPTY */ \
  877. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  878. /* SCTP_STATE_CLOSED */ \
  879. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  880. /* SCTP_STATE_COOKIE_WAIT */ \
  881. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  882. /* SCTP_STATE_COOKIE_ECHOED */ \
  883. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  884. /* SCTP_STATE_ESTABLISHED */ \
  885. {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
  886. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  887. {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
  888. /* SCTP_STATE_SHUTDOWN_SENT */ \
  889. {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
  890. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  891. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  892. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  893. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  894. }
  895. #define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
  896. /* SCTP_STATE_EMPTY */ \
  897. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  898. /* SCTP_STATE_CLOSED */ \
  899. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  900. /* SCTP_STATE_COOKIE_WAIT */ \
  901. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  902. /* SCTP_STATE_COOKIE_ECHOED */ \
  903. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  904. /* SCTP_STATE_ESTABLISHED */ \
  905. {.fn = sctp_sf_autoclose_timer_expire, \
  906. .name = "sctp_sf_autoclose_timer_expire"}, \
  907. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  908. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  909. /* SCTP_STATE_SHUTDOWN_SENT */ \
  910. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  911. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  912. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  913. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  914. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  915. }
  916. static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
  917. TYPE_SCTP_EVENT_TIMEOUT_NONE,
  918. TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
  919. TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
  920. TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
  921. TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
  922. TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
  923. TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
  924. TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
  925. TYPE_SCTP_EVENT_TIMEOUT_SACK,
  926. TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
  927. };
  928. static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid,
  929. sctp_state_t state)
  930. {
  931. if (state > SCTP_STATE_MAX)
  932. return &bug;
  933. if (cid >= 0 && cid <= SCTP_CID_BASE_MAX)
  934. return &chunk_event_table[cid][state];
  935. if (sctp_prsctp_enable) {
  936. if (cid == SCTP_CID_FWD_TSN)
  937. return &prsctp_chunk_event_table[0][state];
  938. }
  939. if (sctp_addip_enable) {
  940. if (cid == SCTP_CID_ASCONF)
  941. return &addip_chunk_event_table[0][state];
  942. if (cid == SCTP_CID_ASCONF_ACK)
  943. return &addip_chunk_event_table[1][state];
  944. }
  945. return &chunk_event_table_unknown[state];
  946. }