sm_statetable.c 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  1. /* SCTP kernel 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 implementation
  9. *
  10. * These are the state tables for the SCTP state machine.
  11. *
  12. * This SCTP 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. * This SCTP 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_FUNC(func) {.fn = func, .name = #func}
  97. #define TYPE_SCTP_DATA { \
  98. /* SCTP_STATE_EMPTY */ \
  99. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  100. /* SCTP_STATE_CLOSED */ \
  101. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  102. /* SCTP_STATE_COOKIE_WAIT */ \
  103. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  104. /* SCTP_STATE_COOKIE_ECHOED */ \
  105. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  106. /* SCTP_STATE_ESTABLISHED */ \
  107. TYPE_SCTP_FUNC(sctp_sf_eat_data_6_2), \
  108. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  109. TYPE_SCTP_FUNC(sctp_sf_eat_data_6_2), \
  110. /* SCTP_STATE_SHUTDOWN_SENT */ \
  111. TYPE_SCTP_FUNC(sctp_sf_eat_data_fast_4_4), \
  112. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  113. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  114. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  115. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  116. } /* TYPE_SCTP_DATA */
  117. #define TYPE_SCTP_INIT { \
  118. /* SCTP_STATE_EMPTY */ \
  119. TYPE_SCTP_FUNC(sctp_sf_bug), \
  120. /* SCTP_STATE_CLOSED */ \
  121. TYPE_SCTP_FUNC(sctp_sf_do_5_1B_init), \
  122. /* SCTP_STATE_COOKIE_WAIT */ \
  123. TYPE_SCTP_FUNC(sctp_sf_do_5_2_1_siminit), \
  124. /* SCTP_STATE_COOKIE_ECHOED */ \
  125. TYPE_SCTP_FUNC(sctp_sf_do_5_2_1_siminit), \
  126. /* SCTP_STATE_ESTABLISHED */ \
  127. TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
  128. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  129. TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
  130. /* SCTP_STATE_SHUTDOWN_SENT */ \
  131. TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
  132. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  133. TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
  134. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  135. TYPE_SCTP_FUNC(sctp_sf_do_9_2_reshutack), \
  136. } /* TYPE_SCTP_INIT */
  137. #define TYPE_SCTP_INIT_ACK { \
  138. /* SCTP_STATE_EMPTY */ \
  139. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  140. /* SCTP_STATE_CLOSED */ \
  141. TYPE_SCTP_FUNC(sctp_sf_do_5_2_3_initack), \
  142. /* SCTP_STATE_COOKIE_WAIT */ \
  143. TYPE_SCTP_FUNC(sctp_sf_do_5_1C_ack), \
  144. /* SCTP_STATE_COOKIE_ECHOED */ \
  145. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  146. /* SCTP_STATE_ESTABLISHED */ \
  147. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  148. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  149. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  150. /* SCTP_STATE_SHUTDOWN_SENT */ \
  151. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  152. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  153. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  154. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  155. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  156. } /* TYPE_SCTP_INIT_ACK */
  157. #define TYPE_SCTP_SACK { \
  158. /* SCTP_STATE_EMPTY */ \
  159. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  160. /* SCTP_STATE_CLOSED */ \
  161. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  162. /* SCTP_STATE_COOKIE_WAIT */ \
  163. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  164. /* SCTP_STATE_COOKIE_ECHOED */ \
  165. TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
  166. /* SCTP_STATE_ESTABLISHED */ \
  167. TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
  168. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  169. TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
  170. /* SCTP_STATE_SHUTDOWN_SENT */ \
  171. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  172. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  173. TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
  174. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  175. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  176. } /* TYPE_SCTP_SACK */
  177. #define TYPE_SCTP_HEARTBEAT { \
  178. /* SCTP_STATE_EMPTY */ \
  179. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  180. /* SCTP_STATE_CLOSED */ \
  181. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  182. /* SCTP_STATE_COOKIE_WAIT */ \
  183. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  184. /* SCTP_STATE_COOKIE_ECHOED */ \
  185. TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
  186. /* SCTP_STATE_ESTABLISHED */ \
  187. TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
  188. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  189. TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
  190. /* SCTP_STATE_SHUTDOWN_SENT */ \
  191. TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
  192. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  193. TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
  194. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  195. /* This should not happen, but we are nice. */ \
  196. TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
  197. } /* TYPE_SCTP_HEARTBEAT */
  198. #define TYPE_SCTP_HEARTBEAT_ACK { \
  199. /* SCTP_STATE_EMPTY */ \
  200. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  201. /* SCTP_STATE_CLOSED */ \
  202. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  203. /* SCTP_STATE_COOKIE_WAIT */ \
  204. TYPE_SCTP_FUNC(sctp_sf_violation), \
  205. /* SCTP_STATE_COOKIE_ECHOED */ \
  206. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  207. /* SCTP_STATE_ESTABLISHED */ \
  208. TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
  209. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  210. TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
  211. /* SCTP_STATE_SHUTDOWN_SENT */ \
  212. TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
  213. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  214. TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
  215. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  216. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  217. } /* TYPE_SCTP_HEARTBEAT_ACK */
  218. #define TYPE_SCTP_ABORT { \
  219. /* SCTP_STATE_EMPTY */ \
  220. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  221. /* SCTP_STATE_CLOSED */ \
  222. TYPE_SCTP_FUNC(sctp_sf_pdiscard), \
  223. /* SCTP_STATE_COOKIE_WAIT */ \
  224. TYPE_SCTP_FUNC(sctp_sf_cookie_wait_abort), \
  225. /* SCTP_STATE_COOKIE_ECHOED */ \
  226. TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_abort), \
  227. /* SCTP_STATE_ESTABLISHED */ \
  228. TYPE_SCTP_FUNC(sctp_sf_do_9_1_abort), \
  229. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  230. TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_abort), \
  231. /* SCTP_STATE_SHUTDOWN_SENT */ \
  232. TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_abort), \
  233. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  234. TYPE_SCTP_FUNC(sctp_sf_do_9_1_abort), \
  235. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  236. TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_abort), \
  237. } /* TYPE_SCTP_ABORT */
  238. #define TYPE_SCTP_SHUTDOWN { \
  239. /* SCTP_STATE_EMPTY */ \
  240. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  241. /* SCTP_STATE_CLOSED */ \
  242. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  243. /* SCTP_STATE_COOKIE_WAIT */ \
  244. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  245. /* SCTP_STATE_COOKIE_ECHOED */ \
  246. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  247. /* SCTP_STATE_ESTABLISHED */ \
  248. TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown), \
  249. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  250. TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown), \
  251. /* SCTP_STATE_SHUTDOWN_SENT */ \
  252. TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \
  253. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  254. TYPE_SCTP_FUNC(sctp_sf_do_9_2_shut_ctsn), \
  255. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  256. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  257. } /* TYPE_SCTP_SHUTDOWN */
  258. #define TYPE_SCTP_SHUTDOWN_ACK { \
  259. /* SCTP_STATE_EMPTY */ \
  260. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  261. /* SCTP_STATE_CLOSED */ \
  262. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  263. /* SCTP_STATE_COOKIE_WAIT */ \
  264. TYPE_SCTP_FUNC(sctp_sf_do_8_5_1_E_sa), \
  265. /* SCTP_STATE_COOKIE_ECHOED */ \
  266. TYPE_SCTP_FUNC(sctp_sf_do_8_5_1_E_sa), \
  267. /* SCTP_STATE_ESTABLISHED */ \
  268. TYPE_SCTP_FUNC(sctp_sf_violation), \
  269. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  270. TYPE_SCTP_FUNC(sctp_sf_violation), \
  271. /* SCTP_STATE_SHUTDOWN_SENT */ \
  272. TYPE_SCTP_FUNC(sctp_sf_do_9_2_final), \
  273. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  274. TYPE_SCTP_FUNC(sctp_sf_violation), \
  275. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  276. TYPE_SCTP_FUNC(sctp_sf_do_9_2_final), \
  277. } /* TYPE_SCTP_SHUTDOWN_ACK */
  278. #define TYPE_SCTP_ERROR { \
  279. /* SCTP_STATE_EMPTY */ \
  280. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  281. /* SCTP_STATE_CLOSED */ \
  282. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  283. /* SCTP_STATE_COOKIE_WAIT */ \
  284. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  285. /* SCTP_STATE_COOKIE_ECHOED */ \
  286. TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_err), \
  287. /* SCTP_STATE_ESTABLISHED */ \
  288. TYPE_SCTP_FUNC(sctp_sf_operr_notify), \
  289. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  290. TYPE_SCTP_FUNC(sctp_sf_operr_notify), \
  291. /* SCTP_STATE_SHUTDOWN_SENT */ \
  292. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  293. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  294. TYPE_SCTP_FUNC(sctp_sf_operr_notify), \
  295. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  296. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  297. } /* TYPE_SCTP_ERROR */
  298. #define TYPE_SCTP_COOKIE_ECHO { \
  299. /* SCTP_STATE_EMPTY */ \
  300. TYPE_SCTP_FUNC(sctp_sf_bug), \
  301. /* SCTP_STATE_CLOSED */ \
  302. TYPE_SCTP_FUNC(sctp_sf_do_5_1D_ce), \
  303. /* SCTP_STATE_COOKIE_WAIT */ \
  304. TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
  305. /* SCTP_STATE_COOKIE_ECHOED */ \
  306. TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
  307. /* SCTP_STATE_ESTABLISHED */ \
  308. TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
  309. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  310. TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
  311. /* SCTP_STATE_SHUTDOWN_SENT */ \
  312. TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
  313. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  314. TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
  315. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  316. TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
  317. } /* TYPE_SCTP_COOKIE_ECHO */
  318. #define TYPE_SCTP_COOKIE_ACK { \
  319. /* SCTP_STATE_EMPTY */ \
  320. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  321. /* SCTP_STATE_CLOSED */ \
  322. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  323. /* SCTP_STATE_COOKIE_WAIT */ \
  324. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  325. /* SCTP_STATE_COOKIE_ECHOED */ \
  326. TYPE_SCTP_FUNC(sctp_sf_do_5_1E_ca), \
  327. /* SCTP_STATE_ESTABLISHED */ \
  328. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  329. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  330. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  331. /* SCTP_STATE_SHUTDOWN_SENT */ \
  332. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  333. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  334. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  335. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  336. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  337. } /* TYPE_SCTP_COOKIE_ACK */
  338. #define TYPE_SCTP_ECN_ECNE { \
  339. /* SCTP_STATE_EMPTY */ \
  340. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  341. /* SCTP_STATE_CLOSED */ \
  342. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  343. /* SCTP_STATE_COOKIE_WAIT */ \
  344. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  345. /* SCTP_STATE_COOKIE_ECHOED */ \
  346. TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
  347. /* SCTP_STATE_ESTABLISHED */ \
  348. TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
  349. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  350. TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
  351. /* SCTP_STATE_SHUTDOWN_SENT */ \
  352. TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
  353. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  354. TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
  355. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  356. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  357. } /* TYPE_SCTP_ECN_ECNE */
  358. #define TYPE_SCTP_ECN_CWR { \
  359. /* SCTP_STATE_EMPTY */ \
  360. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  361. /* SCTP_STATE_CLOSED */ \
  362. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  363. /* SCTP_STATE_COOKIE_WAIT */ \
  364. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  365. /* SCTP_STATE_COOKIE_ECHOED */ \
  366. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  367. /* SCTP_STATE_ESTABLISHED */ \
  368. TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \
  369. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  370. TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \
  371. /* SCTP_STATE_SHUTDOWN_SENT */ \
  372. TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \
  373. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  374. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  375. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  376. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  377. } /* TYPE_SCTP_ECN_CWR */
  378. #define TYPE_SCTP_SHUTDOWN_COMPLETE { \
  379. /* SCTP_STATE_EMPTY */ \
  380. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  381. /* SCTP_STATE_CLOSED */ \
  382. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  383. /* SCTP_STATE_COOKIE_WAIT */ \
  384. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  385. /* SCTP_STATE_COOKIE_ECHOED */ \
  386. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  387. /* SCTP_STATE_ESTABLISHED */ \
  388. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  389. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  390. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  391. /* SCTP_STATE_SHUTDOWN_SENT */ \
  392. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  393. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  394. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  395. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  396. TYPE_SCTP_FUNC(sctp_sf_do_4_C), \
  397. } /* TYPE_SCTP_SHUTDOWN_COMPLETE */
  398. /* The primary index for this table is the chunk type.
  399. * The secondary index for this table is the state.
  400. *
  401. * For base protocol (RFC 2960).
  402. */
  403. static const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  404. TYPE_SCTP_DATA,
  405. TYPE_SCTP_INIT,
  406. TYPE_SCTP_INIT_ACK,
  407. TYPE_SCTP_SACK,
  408. TYPE_SCTP_HEARTBEAT,
  409. TYPE_SCTP_HEARTBEAT_ACK,
  410. TYPE_SCTP_ABORT,
  411. TYPE_SCTP_SHUTDOWN,
  412. TYPE_SCTP_SHUTDOWN_ACK,
  413. TYPE_SCTP_ERROR,
  414. TYPE_SCTP_COOKIE_ECHO,
  415. TYPE_SCTP_COOKIE_ACK,
  416. TYPE_SCTP_ECN_ECNE,
  417. TYPE_SCTP_ECN_CWR,
  418. TYPE_SCTP_SHUTDOWN_COMPLETE,
  419. }; /* state_fn_t chunk_event_table[][] */
  420. #define TYPE_SCTP_ASCONF { \
  421. /* SCTP_STATE_EMPTY */ \
  422. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  423. /* SCTP_STATE_CLOSED */ \
  424. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  425. /* SCTP_STATE_COOKIE_WAIT */ \
  426. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  427. /* SCTP_STATE_COOKIE_ECHOED */ \
  428. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  429. /* SCTP_STATE_ESTABLISHED */ \
  430. TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
  431. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  432. TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
  433. /* SCTP_STATE_SHUTDOWN_SENT */ \
  434. TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
  435. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  436. TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
  437. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  438. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  439. } /* TYPE_SCTP_ASCONF */
  440. #define TYPE_SCTP_ASCONF_ACK { \
  441. /* SCTP_STATE_EMPTY */ \
  442. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  443. /* SCTP_STATE_CLOSED */ \
  444. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  445. /* SCTP_STATE_COOKIE_WAIT */ \
  446. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  447. /* SCTP_STATE_COOKIE_ECHOED */ \
  448. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  449. /* SCTP_STATE_ESTABLISHED */ \
  450. TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
  451. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  452. TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
  453. /* SCTP_STATE_SHUTDOWN_SENT */ \
  454. TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
  455. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  456. TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
  457. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  458. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  459. } /* TYPE_SCTP_ASCONF_ACK */
  460. /* The primary index for this table is the chunk type.
  461. * The secondary index for this table is the state.
  462. */
  463. static const sctp_sm_table_entry_t addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  464. TYPE_SCTP_ASCONF,
  465. TYPE_SCTP_ASCONF_ACK,
  466. }; /*state_fn_t addip_chunk_event_table[][] */
  467. #define TYPE_SCTP_FWD_TSN { \
  468. /* SCTP_STATE_EMPTY */ \
  469. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  470. /* SCTP_STATE_CLOSED */ \
  471. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  472. /* SCTP_STATE_COOKIE_WAIT */ \
  473. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  474. /* SCTP_STATE_COOKIE_ECHOED */ \
  475. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  476. /* SCTP_STATE_ESTABLISHED */ \
  477. TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \
  478. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  479. TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \
  480. /* SCTP_STATE_SHUTDOWN_SENT */ \
  481. TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn_fast), \
  482. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  483. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  484. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  485. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  486. } /* TYPE_SCTP_FWD_TSN */
  487. /* The primary index for this table is the chunk type.
  488. * The secondary index for this table is the state.
  489. */
  490. static const sctp_sm_table_entry_t prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  491. TYPE_SCTP_FWD_TSN,
  492. }; /*state_fn_t prsctp_chunk_event_table[][] */
  493. #define TYPE_SCTP_AUTH { \
  494. /* SCTP_STATE_EMPTY */ \
  495. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  496. /* SCTP_STATE_CLOSED */ \
  497. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  498. /* SCTP_STATE_COOKIE_WAIT */ \
  499. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  500. /* SCTP_STATE_COOKIE_ECHOED */ \
  501. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  502. /* SCTP_STATE_ESTABLISHED */ \
  503. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  504. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  505. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  506. /* SCTP_STATE_SHUTDOWN_SENT */ \
  507. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  508. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  509. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  510. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  511. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  512. } /* TYPE_SCTP_AUTH */
  513. /* The primary index for this table is the chunk type.
  514. * The secondary index for this table is the state.
  515. */
  516. static const sctp_sm_table_entry_t auth_chunk_event_table[SCTP_NUM_AUTH_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  517. TYPE_SCTP_AUTH,
  518. }; /*state_fn_t auth_chunk_event_table[][] */
  519. static const sctp_sm_table_entry_t
  520. chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
  521. /* SCTP_STATE_EMPTY */
  522. TYPE_SCTP_FUNC(sctp_sf_ootb),
  523. /* SCTP_STATE_CLOSED */
  524. TYPE_SCTP_FUNC(sctp_sf_ootb),
  525. /* SCTP_STATE_COOKIE_WAIT */
  526. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  527. /* SCTP_STATE_COOKIE_ECHOED */
  528. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  529. /* SCTP_STATE_ESTABLISHED */
  530. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  531. /* SCTP_STATE_SHUTDOWN_PENDING */
  532. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  533. /* SCTP_STATE_SHUTDOWN_SENT */
  534. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  535. /* SCTP_STATE_SHUTDOWN_RECEIVED */
  536. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  537. /* SCTP_STATE_SHUTDOWN_ACK_SENT */
  538. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  539. }; /* chunk unknown */
  540. #define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \
  541. /* SCTP_STATE_EMPTY */ \
  542. TYPE_SCTP_FUNC(sctp_sf_bug), \
  543. /* SCTP_STATE_CLOSED */ \
  544. TYPE_SCTP_FUNC(sctp_sf_do_prm_asoc), \
  545. /* SCTP_STATE_COOKIE_WAIT */ \
  546. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  547. /* SCTP_STATE_COOKIE_ECHOED */ \
  548. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  549. /* SCTP_STATE_ESTABLISHED */ \
  550. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  551. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  552. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  553. /* SCTP_STATE_SHUTDOWN_SENT */ \
  554. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  555. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  556. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  557. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  558. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  559. } /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
  560. #define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \
  561. /* SCTP_STATE_EMPTY */ \
  562. TYPE_SCTP_FUNC(sctp_sf_bug), \
  563. /* SCTP_STATE_CLOSED */ \
  564. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  565. /* SCTP_STATE_COOKIE_WAIT */ \
  566. TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_shutdown), \
  567. /* SCTP_STATE_COOKIE_ECHOED */ \
  568. TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_shutdown),\
  569. /* SCTP_STATE_ESTABLISHED */ \
  570. TYPE_SCTP_FUNC(sctp_sf_do_9_2_prm_shutdown), \
  571. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  572. TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
  573. /* SCTP_STATE_SHUTDOWN_SENT */ \
  574. TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
  575. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  576. TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
  577. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  578. TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
  579. } /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
  580. #define TYPE_SCTP_PRIMITIVE_ABORT { \
  581. /* SCTP_STATE_EMPTY */ \
  582. TYPE_SCTP_FUNC(sctp_sf_bug), \
  583. /* SCTP_STATE_CLOSED */ \
  584. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  585. /* SCTP_STATE_COOKIE_WAIT */ \
  586. TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_abort), \
  587. /* SCTP_STATE_COOKIE_ECHOED */ \
  588. TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_abort), \
  589. /* SCTP_STATE_ESTABLISHED */ \
  590. TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
  591. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  592. TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_prm_abort), \
  593. /* SCTP_STATE_SHUTDOWN_SENT */ \
  594. TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_prm_abort), \
  595. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  596. TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
  597. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  598. TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_prm_abort), \
  599. } /* TYPE_SCTP_PRIMITIVE_ABORT */
  600. #define TYPE_SCTP_PRIMITIVE_SEND { \
  601. /* SCTP_STATE_EMPTY */ \
  602. TYPE_SCTP_FUNC(sctp_sf_bug), \
  603. /* SCTP_STATE_CLOSED */ \
  604. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  605. /* SCTP_STATE_COOKIE_WAIT */ \
  606. TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
  607. /* SCTP_STATE_COOKIE_ECHOED */ \
  608. TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
  609. /* SCTP_STATE_ESTABLISHED */ \
  610. TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
  611. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  612. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  613. /* SCTP_STATE_SHUTDOWN_SENT */ \
  614. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  615. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  616. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  617. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  618. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  619. } /* TYPE_SCTP_PRIMITIVE_SEND */
  620. #define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \
  621. /* SCTP_STATE_EMPTY */ \
  622. TYPE_SCTP_FUNC(sctp_sf_bug), \
  623. /* SCTP_STATE_CLOSED */ \
  624. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  625. /* SCTP_STATE_COOKIE_WAIT */ \
  626. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  627. /* SCTP_STATE_COOKIE_ECHOED */ \
  628. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  629. /* SCTP_STATE_ESTABLISHED */ \
  630. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  631. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  632. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  633. /* SCTP_STATE_SHUTDOWN_SENT */ \
  634. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  635. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  636. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  637. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  638. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  639. } /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
  640. #define TYPE_SCTP_PRIMITIVE_ASCONF { \
  641. /* SCTP_STATE_EMPTY */ \
  642. TYPE_SCTP_FUNC(sctp_sf_bug), \
  643. /* SCTP_STATE_CLOSED */ \
  644. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  645. /* SCTP_STATE_COOKIE_WAIT */ \
  646. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  647. /* SCTP_STATE_COOKIE_ECHOED */ \
  648. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  649. /* SCTP_STATE_ESTABLISHED */ \
  650. TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
  651. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  652. TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
  653. /* SCTP_STATE_SHUTDOWN_SENT */ \
  654. TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
  655. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  656. TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
  657. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  658. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  659. } /* TYPE_SCTP_PRIMITIVE_ASCONF */
  660. /* The primary index for this table is the primitive type.
  661. * The secondary index for this table is the state.
  662. */
  663. static const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = {
  664. TYPE_SCTP_PRIMITIVE_ASSOCIATE,
  665. TYPE_SCTP_PRIMITIVE_SHUTDOWN,
  666. TYPE_SCTP_PRIMITIVE_ABORT,
  667. TYPE_SCTP_PRIMITIVE_SEND,
  668. TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
  669. TYPE_SCTP_PRIMITIVE_ASCONF,
  670. };
  671. #define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
  672. /* SCTP_STATE_EMPTY */ \
  673. TYPE_SCTP_FUNC(sctp_sf_bug), \
  674. /* SCTP_STATE_CLOSED */ \
  675. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  676. /* SCTP_STATE_COOKIE_WAIT */ \
  677. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  678. /* SCTP_STATE_COOKIE_ECHOED */ \
  679. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  680. /* SCTP_STATE_ESTABLISHED */ \
  681. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  682. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  683. TYPE_SCTP_FUNC(sctp_sf_do_9_2_start_shutdown), \
  684. /* SCTP_STATE_SHUTDOWN_SENT */ \
  685. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  686. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  687. TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \
  688. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  689. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  690. }
  691. #define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH { \
  692. /* SCTP_STATE_EMPTY */ \
  693. TYPE_SCTP_FUNC(sctp_sf_bug), \
  694. /* SCTP_STATE_CLOSED */ \
  695. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  696. /* SCTP_STATE_COOKIE_WAIT */ \
  697. TYPE_SCTP_FUNC(sctp_sf_cookie_wait_icmp_abort), \
  698. /* SCTP_STATE_COOKIE_ECHOED */ \
  699. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  700. /* SCTP_STATE_ESTABLISHED */ \
  701. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  702. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  703. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  704. /* SCTP_STATE_SHUTDOWN_SENT */ \
  705. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  706. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  707. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  708. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  709. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  710. }
  711. static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = {
  712. TYPE_SCTP_OTHER_NO_PENDING_TSN,
  713. TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH,
  714. };
  715. #define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
  716. /* SCTP_STATE_EMPTY */ \
  717. TYPE_SCTP_FUNC(sctp_sf_bug), \
  718. /* SCTP_STATE_CLOSED */ \
  719. TYPE_SCTP_FUNC(sctp_sf_bug), \
  720. /* SCTP_STATE_COOKIE_WAIT */ \
  721. TYPE_SCTP_FUNC(sctp_sf_bug), \
  722. /* SCTP_STATE_COOKIE_ECHOED */ \
  723. TYPE_SCTP_FUNC(sctp_sf_bug), \
  724. /* SCTP_STATE_ESTABLISHED */ \
  725. TYPE_SCTP_FUNC(sctp_sf_bug), \
  726. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  727. TYPE_SCTP_FUNC(sctp_sf_bug), \
  728. /* SCTP_STATE_SHUTDOWN_SENT */ \
  729. TYPE_SCTP_FUNC(sctp_sf_bug), \
  730. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  731. TYPE_SCTP_FUNC(sctp_sf_bug), \
  732. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  733. TYPE_SCTP_FUNC(sctp_sf_bug), \
  734. }
  735. #define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
  736. /* SCTP_STATE_EMPTY */ \
  737. TYPE_SCTP_FUNC(sctp_sf_bug), \
  738. /* SCTP_STATE_CLOSED */ \
  739. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  740. /* SCTP_STATE_COOKIE_WAIT */ \
  741. TYPE_SCTP_FUNC(sctp_sf_bug), \
  742. /* SCTP_STATE_COOKIE_ECHOED */ \
  743. TYPE_SCTP_FUNC(sctp_sf_t1_cookie_timer_expire), \
  744. /* SCTP_STATE_ESTABLISHED */ \
  745. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  746. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  747. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  748. /* SCTP_STATE_SHUTDOWN_SENT */ \
  749. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  750. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  751. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  752. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  753. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  754. }
  755. #define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
  756. /* SCTP_STATE_EMPTY */ \
  757. TYPE_SCTP_FUNC(sctp_sf_bug), \
  758. /* SCTP_STATE_CLOSED */ \
  759. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  760. /* SCTP_STATE_COOKIE_WAIT */ \
  761. TYPE_SCTP_FUNC(sctp_sf_t1_init_timer_expire), \
  762. /* SCTP_STATE_COOKIE_ECHOED */ \
  763. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  764. /* SCTP_STATE_ESTABLISHED */ \
  765. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  766. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  767. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  768. /* SCTP_STATE_SHUTDOWN_SENT */ \
  769. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  770. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  771. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  772. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  773. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  774. }
  775. #define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
  776. /* SCTP_STATE_EMPTY */ \
  777. TYPE_SCTP_FUNC(sctp_sf_bug), \
  778. /* SCTP_STATE_CLOSED */ \
  779. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  780. /* SCTP_STATE_COOKIE_WAIT */ \
  781. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  782. /* SCTP_STATE_COOKIE_ECHOED */ \
  783. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  784. /* SCTP_STATE_ESTABLISHED */ \
  785. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  786. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  787. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  788. /* SCTP_STATE_SHUTDOWN_SENT */ \
  789. TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
  790. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  791. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  792. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  793. TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
  794. }
  795. #define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
  796. /* SCTP_STATE_EMPTY */ \
  797. TYPE_SCTP_FUNC(sctp_sf_bug), \
  798. /* SCTP_STATE_CLOSED */ \
  799. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  800. /* SCTP_STATE_COOKIE_WAIT */ \
  801. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  802. /* SCTP_STATE_COOKIE_ECHOED */ \
  803. TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
  804. /* SCTP_STATE_ESTABLISHED */ \
  805. TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
  806. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  807. TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
  808. /* SCTP_STATE_SHUTDOWN_SENT */ \
  809. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  810. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  811. TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
  812. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  813. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  814. }
  815. #define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
  816. /* SCTP_STATE_EMPTY */ \
  817. TYPE_SCTP_FUNC(sctp_sf_bug), \
  818. /* SCTP_STATE_CLOSED */ \
  819. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  820. /* SCTP_STATE_COOKIE_WAIT */ \
  821. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  822. /* SCTP_STATE_COOKIE_ECHOED */ \
  823. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  824. /* SCTP_STATE_ESTABLISHED */ \
  825. TYPE_SCTP_FUNC(sctp_sf_t4_timer_expire), \
  826. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  827. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  828. /* SCTP_STATE_SHUTDOWN_SENT */ \
  829. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  830. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  831. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  832. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  833. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  834. }
  835. #define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
  836. /* SCTP_STATE_EMPTY */ \
  837. TYPE_SCTP_FUNC(sctp_sf_bug), \
  838. /* SCTP_STATE_CLOSED */ \
  839. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  840. /* SCTP_STATE_COOKIE_WAIT */ \
  841. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  842. /* SCTP_STATE_COOKIE_ECHOED */ \
  843. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  844. /* SCTP_STATE_ESTABLISHED */ \
  845. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  846. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  847. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  848. /* SCTP_STATE_SHUTDOWN_SENT */ \
  849. TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
  850. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  851. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  852. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  853. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  854. }
  855. #define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
  856. /* SCTP_STATE_EMPTY */ \
  857. TYPE_SCTP_FUNC(sctp_sf_bug), \
  858. /* SCTP_STATE_CLOSED */ \
  859. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  860. /* SCTP_STATE_COOKIE_WAIT */ \
  861. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  862. /* SCTP_STATE_COOKIE_ECHOED */ \
  863. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  864. /* SCTP_STATE_ESTABLISHED */ \
  865. TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
  866. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  867. TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
  868. /* SCTP_STATE_SHUTDOWN_SENT */ \
  869. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  870. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  871. TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
  872. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  873. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  874. }
  875. #define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
  876. /* SCTP_STATE_EMPTY */ \
  877. TYPE_SCTP_FUNC(sctp_sf_bug), \
  878. /* SCTP_STATE_CLOSED */ \
  879. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  880. /* SCTP_STATE_COOKIE_WAIT */ \
  881. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  882. /* SCTP_STATE_COOKIE_ECHOED */ \
  883. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  884. /* SCTP_STATE_ESTABLISHED */ \
  885. TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
  886. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  887. TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
  888. /* SCTP_STATE_SHUTDOWN_SENT */ \
  889. TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
  890. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  891. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  892. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  893. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  894. }
  895. #define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
  896. /* SCTP_STATE_EMPTY */ \
  897. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  898. /* SCTP_STATE_CLOSED */ \
  899. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  900. /* SCTP_STATE_COOKIE_WAIT */ \
  901. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  902. /* SCTP_STATE_COOKIE_ECHOED */ \
  903. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  904. /* SCTP_STATE_ESTABLISHED */ \
  905. TYPE_SCTP_FUNC(sctp_sf_autoclose_timer_expire), \
  906. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  907. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  908. /* SCTP_STATE_SHUTDOWN_SENT */ \
  909. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  910. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  911. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  912. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  913. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  914. }
  915. static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
  916. TYPE_SCTP_EVENT_TIMEOUT_NONE,
  917. TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
  918. TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
  919. TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
  920. TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
  921. TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
  922. TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
  923. TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
  924. TYPE_SCTP_EVENT_TIMEOUT_SACK,
  925. TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
  926. };
  927. static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid,
  928. sctp_state_t state)
  929. {
  930. if (state > SCTP_STATE_MAX)
  931. return &bug;
  932. if (cid <= SCTP_CID_BASE_MAX)
  933. return &chunk_event_table[cid][state];
  934. if (sctp_prsctp_enable) {
  935. if (cid == SCTP_CID_FWD_TSN)
  936. return &prsctp_chunk_event_table[0][state];
  937. }
  938. if (sctp_addip_enable) {
  939. if (cid == SCTP_CID_ASCONF)
  940. return &addip_chunk_event_table[0][state];
  941. if (cid == SCTP_CID_ASCONF_ACK)
  942. return &addip_chunk_event_table[1][state];
  943. }
  944. if (sctp_auth_enable) {
  945. if (cid == SCTP_CID_AUTH)
  946. return &auth_chunk_event_table[0][state];
  947. }
  948. return &chunk_event_table_unknown[state];
  949. }