sm_statetable.c 34 KB

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