sm_statetable.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  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_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \
  742. /* SCTP_STATE_ESTABLISHED */ \
  743. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  744. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  745. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  746. /* SCTP_STATE_SHUTDOWN_SENT */ \
  747. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  748. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  749. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  750. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  751. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  752. }
  753. #define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
  754. /* SCTP_STATE_EMPTY */ \
  755. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  756. /* SCTP_STATE_CLOSED */ \
  757. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  758. /* SCTP_STATE_COOKIE_WAIT */ \
  759. {.fn = sctp_sf_t1_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \
  760. /* SCTP_STATE_COOKIE_ECHOED */ \
  761. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  762. /* SCTP_STATE_ESTABLISHED */ \
  763. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  764. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  765. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  766. /* SCTP_STATE_SHUTDOWN_SENT */ \
  767. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  768. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  769. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  770. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  771. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  772. }
  773. #define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
  774. /* SCTP_STATE_EMPTY */ \
  775. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  776. /* SCTP_STATE_CLOSED */ \
  777. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  778. /* SCTP_STATE_COOKIE_WAIT */ \
  779. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  780. /* SCTP_STATE_COOKIE_ECHOED */ \
  781. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  782. /* SCTP_STATE_ESTABLISHED */ \
  783. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  784. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  785. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  786. /* SCTP_STATE_SHUTDOWN_SENT */ \
  787. {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \
  788. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  789. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  790. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  791. {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \
  792. }
  793. #define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
  794. /* SCTP_STATE_EMPTY */ \
  795. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  796. /* SCTP_STATE_CLOSED */ \
  797. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  798. /* SCTP_STATE_COOKIE_WAIT */ \
  799. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  800. /* SCTP_STATE_COOKIE_ECHOED */ \
  801. {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
  802. /* SCTP_STATE_ESTABLISHED */ \
  803. {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
  804. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  805. {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
  806. /* SCTP_STATE_SHUTDOWN_SENT */ \
  807. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  808. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  809. {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
  810. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  811. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  812. }
  813. #define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
  814. /* SCTP_STATE_EMPTY */ \
  815. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  816. /* SCTP_STATE_CLOSED */ \
  817. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  818. /* SCTP_STATE_COOKIE_WAIT */ \
  819. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  820. /* SCTP_STATE_COOKIE_ECHOED */ \
  821. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  822. /* SCTP_STATE_ESTABLISHED */ \
  823. {.fn = sctp_sf_t4_timer_expire, .name = "sctp_sf_t4_timer_expire"}, \
  824. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  825. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  826. /* SCTP_STATE_SHUTDOWN_SENT */ \
  827. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  828. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  829. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  830. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  831. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  832. }
  833. #define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
  834. /* SCTP_STATE_EMPTY */ \
  835. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  836. /* SCTP_STATE_CLOSED */ \
  837. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  838. /* SCTP_STATE_COOKIE_WAIT */ \
  839. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  840. /* SCTP_STATE_COOKIE_ECHOED */ \
  841. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  842. /* SCTP_STATE_ESTABLISHED */ \
  843. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  844. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  845. {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \
  846. /* SCTP_STATE_SHUTDOWN_SENT */ \
  847. {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \
  848. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  849. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  850. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  851. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  852. }
  853. #define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
  854. /* SCTP_STATE_EMPTY */ \
  855. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  856. /* SCTP_STATE_CLOSED */ \
  857. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  858. /* SCTP_STATE_COOKIE_WAIT */ \
  859. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  860. /* SCTP_STATE_COOKIE_ECHOED */ \
  861. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  862. /* SCTP_STATE_ESTABLISHED */ \
  863. {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
  864. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  865. {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
  866. /* SCTP_STATE_SHUTDOWN_SENT */ \
  867. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  868. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  869. {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
  870. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  871. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  872. }
  873. #define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
  874. /* SCTP_STATE_EMPTY */ \
  875. {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
  876. /* SCTP_STATE_CLOSED */ \
  877. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  878. /* SCTP_STATE_COOKIE_WAIT */ \
  879. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  880. /* SCTP_STATE_COOKIE_ECHOED */ \
  881. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  882. /* SCTP_STATE_ESTABLISHED */ \
  883. {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
  884. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  885. {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
  886. /* SCTP_STATE_SHUTDOWN_SENT */ \
  887. {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
  888. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  889. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  890. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  891. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  892. }
  893. #define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
  894. /* SCTP_STATE_EMPTY */ \
  895. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  896. /* SCTP_STATE_CLOSED */ \
  897. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  898. /* SCTP_STATE_COOKIE_WAIT */ \
  899. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  900. /* SCTP_STATE_COOKIE_ECHOED */ \
  901. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  902. /* SCTP_STATE_ESTABLISHED */ \
  903. {.fn = sctp_sf_autoclose_timer_expire, \
  904. .name = "sctp_sf_autoclose_timer_expire"}, \
  905. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  906. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  907. /* SCTP_STATE_SHUTDOWN_SENT */ \
  908. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  909. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  910. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  911. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  912. {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
  913. }
  914. static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
  915. TYPE_SCTP_EVENT_TIMEOUT_NONE,
  916. TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
  917. TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
  918. TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
  919. TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
  920. TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
  921. TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
  922. TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
  923. TYPE_SCTP_EVENT_TIMEOUT_SACK,
  924. TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
  925. };
  926. static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid,
  927. sctp_state_t state)
  928. {
  929. if (state > SCTP_STATE_MAX)
  930. return &bug;
  931. if (cid >= 0 && cid <= SCTP_CID_BASE_MAX)
  932. return &chunk_event_table[cid][state];
  933. if (sctp_prsctp_enable) {
  934. if (cid == SCTP_CID_FWD_TSN)
  935. return &prsctp_chunk_event_table[0][state];
  936. }
  937. if (sctp_addip_enable) {
  938. if (cid == SCTP_CID_ASCONF)
  939. return &addip_chunk_event_table[0][state];
  940. if (cid == SCTP_CID_ASCONF_ACK)
  941. return &addip_chunk_event_table[1][state];
  942. }
  943. return &chunk_event_table_unknown[state];
  944. }