sm_statetable.c 34 KB

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