sm_statetable.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  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 struct sctp_sm_table_entry
  46. primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES];
  47. static const struct sctp_sm_table_entry
  48. other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES];
  49. static const struct sctp_sm_table_entry
  50. timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES];
  51. static const struct sctp_sm_table_entry *sctp_chunk_event_lookup(
  52. struct net *net,
  53. enum sctp_cid cid,
  54. enum sctp_state state);
  55. static const struct sctp_sm_table_entry bug = {
  56. .fn = sctp_sf_bug,
  57. .name = "sctp_sf_bug"
  58. };
  59. #define DO_LOOKUP(_max, _type, _table) \
  60. ({ \
  61. const struct sctp_sm_table_entry *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 struct sctp_sm_table_entry *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 struct sctp_sm_table_entry
  373. chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  374. TYPE_SCTP_DATA,
  375. TYPE_SCTP_INIT,
  376. TYPE_SCTP_INIT_ACK,
  377. TYPE_SCTP_SACK,
  378. TYPE_SCTP_HEARTBEAT,
  379. TYPE_SCTP_HEARTBEAT_ACK,
  380. TYPE_SCTP_ABORT,
  381. TYPE_SCTP_SHUTDOWN,
  382. TYPE_SCTP_SHUTDOWN_ACK,
  383. TYPE_SCTP_ERROR,
  384. TYPE_SCTP_COOKIE_ECHO,
  385. TYPE_SCTP_COOKIE_ACK,
  386. TYPE_SCTP_ECN_ECNE,
  387. TYPE_SCTP_ECN_CWR,
  388. TYPE_SCTP_SHUTDOWN_COMPLETE,
  389. }; /* state_fn_t chunk_event_table[][] */
  390. #define TYPE_SCTP_ASCONF { \
  391. /* SCTP_STATE_CLOSED */ \
  392. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  393. /* SCTP_STATE_COOKIE_WAIT */ \
  394. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  395. /* SCTP_STATE_COOKIE_ECHOED */ \
  396. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  397. /* SCTP_STATE_ESTABLISHED */ \
  398. TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
  399. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  400. TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
  401. /* SCTP_STATE_SHUTDOWN_SENT */ \
  402. TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
  403. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  404. TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
  405. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  406. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  407. } /* TYPE_SCTP_ASCONF */
  408. #define TYPE_SCTP_ASCONF_ACK { \
  409. /* SCTP_STATE_CLOSED */ \
  410. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  411. /* SCTP_STATE_COOKIE_WAIT */ \
  412. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  413. /* SCTP_STATE_COOKIE_ECHOED */ \
  414. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  415. /* SCTP_STATE_ESTABLISHED */ \
  416. TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
  417. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  418. TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
  419. /* SCTP_STATE_SHUTDOWN_SENT */ \
  420. TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
  421. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  422. TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
  423. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  424. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  425. } /* TYPE_SCTP_ASCONF_ACK */
  426. /* The primary index for this table is the chunk type.
  427. * The secondary index for this table is the state.
  428. */
  429. static const struct sctp_sm_table_entry
  430. addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  431. TYPE_SCTP_ASCONF,
  432. TYPE_SCTP_ASCONF_ACK,
  433. }; /*state_fn_t addip_chunk_event_table[][] */
  434. #define TYPE_SCTP_FWD_TSN { \
  435. /* SCTP_STATE_CLOSED */ \
  436. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  437. /* SCTP_STATE_COOKIE_WAIT */ \
  438. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  439. /* SCTP_STATE_COOKIE_ECHOED */ \
  440. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  441. /* SCTP_STATE_ESTABLISHED */ \
  442. TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \
  443. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  444. TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \
  445. /* SCTP_STATE_SHUTDOWN_SENT */ \
  446. TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn_fast), \
  447. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  448. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  449. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  450. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  451. } /* TYPE_SCTP_FWD_TSN */
  452. /* The primary index for this table is the chunk type.
  453. * The secondary index for this table is the state.
  454. */
  455. static const struct sctp_sm_table_entry
  456. prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  457. TYPE_SCTP_FWD_TSN,
  458. }; /*state_fn_t prsctp_chunk_event_table[][] */
  459. #define TYPE_SCTP_RECONF { \
  460. /* SCTP_STATE_CLOSED */ \
  461. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  462. /* SCTP_STATE_COOKIE_WAIT */ \
  463. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  464. /* SCTP_STATE_COOKIE_ECHOED */ \
  465. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  466. /* SCTP_STATE_ESTABLISHED */ \
  467. TYPE_SCTP_FUNC(sctp_sf_do_reconf), \
  468. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  469. TYPE_SCTP_FUNC(sctp_sf_do_reconf), \
  470. /* SCTP_STATE_SHUTDOWN_SENT */ \
  471. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  472. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  473. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  474. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  475. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  476. } /* TYPE_SCTP_RECONF */
  477. /* The primary index for this table is the chunk type.
  478. * The secondary index for this table is the state.
  479. */
  480. static const struct sctp_sm_table_entry
  481. reconf_chunk_event_table[SCTP_NUM_RECONF_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  482. TYPE_SCTP_RECONF,
  483. }; /*state_fn_t reconf_chunk_event_table[][] */
  484. #define TYPE_SCTP_AUTH { \
  485. /* SCTP_STATE_CLOSED */ \
  486. TYPE_SCTP_FUNC(sctp_sf_ootb), \
  487. /* SCTP_STATE_COOKIE_WAIT */ \
  488. TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
  489. /* SCTP_STATE_COOKIE_ECHOED */ \
  490. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  491. /* SCTP_STATE_ESTABLISHED */ \
  492. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  493. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  494. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  495. /* SCTP_STATE_SHUTDOWN_SENT */ \
  496. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  497. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  498. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  499. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  500. TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
  501. } /* TYPE_SCTP_AUTH */
  502. /* The primary index for this table is the chunk type.
  503. * The secondary index for this table is the state.
  504. */
  505. static const struct sctp_sm_table_entry
  506. auth_chunk_event_table[SCTP_NUM_AUTH_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
  507. TYPE_SCTP_AUTH,
  508. }; /*state_fn_t auth_chunk_event_table[][] */
  509. static const struct sctp_sm_table_entry
  510. chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
  511. /* SCTP_STATE_CLOSED */
  512. TYPE_SCTP_FUNC(sctp_sf_ootb),
  513. /* SCTP_STATE_COOKIE_WAIT */
  514. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  515. /* SCTP_STATE_COOKIE_ECHOED */
  516. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  517. /* SCTP_STATE_ESTABLISHED */
  518. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  519. /* SCTP_STATE_SHUTDOWN_PENDING */
  520. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  521. /* SCTP_STATE_SHUTDOWN_SENT */
  522. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  523. /* SCTP_STATE_SHUTDOWN_RECEIVED */
  524. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  525. /* SCTP_STATE_SHUTDOWN_ACK_SENT */
  526. TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
  527. }; /* chunk unknown */
  528. #define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \
  529. /* SCTP_STATE_CLOSED */ \
  530. TYPE_SCTP_FUNC(sctp_sf_do_prm_asoc), \
  531. /* SCTP_STATE_COOKIE_WAIT */ \
  532. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  533. /* SCTP_STATE_COOKIE_ECHOED */ \
  534. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  535. /* SCTP_STATE_ESTABLISHED */ \
  536. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  537. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  538. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  539. /* SCTP_STATE_SHUTDOWN_SENT */ \
  540. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  541. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  542. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  543. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  544. TYPE_SCTP_FUNC(sctp_sf_not_impl), \
  545. } /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
  546. #define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \
  547. /* SCTP_STATE_CLOSED */ \
  548. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  549. /* SCTP_STATE_COOKIE_WAIT */ \
  550. TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_shutdown), \
  551. /* SCTP_STATE_COOKIE_ECHOED */ \
  552. TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_shutdown),\
  553. /* SCTP_STATE_ESTABLISHED */ \
  554. TYPE_SCTP_FUNC(sctp_sf_do_9_2_prm_shutdown), \
  555. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  556. TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
  557. /* SCTP_STATE_SHUTDOWN_SENT */ \
  558. TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
  559. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  560. TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
  561. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  562. TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
  563. } /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
  564. #define TYPE_SCTP_PRIMITIVE_ABORT { \
  565. /* SCTP_STATE_CLOSED */ \
  566. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  567. /* SCTP_STATE_COOKIE_WAIT */ \
  568. TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_abort), \
  569. /* SCTP_STATE_COOKIE_ECHOED */ \
  570. TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_abort), \
  571. /* SCTP_STATE_ESTABLISHED */ \
  572. TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
  573. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  574. TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_prm_abort), \
  575. /* SCTP_STATE_SHUTDOWN_SENT */ \
  576. TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_prm_abort), \
  577. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  578. TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
  579. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  580. TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_prm_abort), \
  581. } /* TYPE_SCTP_PRIMITIVE_ABORT */
  582. #define TYPE_SCTP_PRIMITIVE_SEND { \
  583. /* SCTP_STATE_CLOSED */ \
  584. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  585. /* SCTP_STATE_COOKIE_WAIT */ \
  586. TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
  587. /* SCTP_STATE_COOKIE_ECHOED */ \
  588. TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
  589. /* SCTP_STATE_ESTABLISHED */ \
  590. TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
  591. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  592. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  593. /* SCTP_STATE_SHUTDOWN_SENT */ \
  594. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  595. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  596. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  597. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  598. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  599. } /* TYPE_SCTP_PRIMITIVE_SEND */
  600. #define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \
  601. /* SCTP_STATE_CLOSED */ \
  602. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  603. /* SCTP_STATE_COOKIE_WAIT */ \
  604. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  605. /* SCTP_STATE_COOKIE_ECHOED */ \
  606. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  607. /* SCTP_STATE_ESTABLISHED */ \
  608. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  609. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  610. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  611. /* SCTP_STATE_SHUTDOWN_SENT */ \
  612. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  613. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  614. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  615. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  616. TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
  617. } /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
  618. #define TYPE_SCTP_PRIMITIVE_ASCONF { \
  619. /* SCTP_STATE_CLOSED */ \
  620. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  621. /* SCTP_STATE_COOKIE_WAIT */ \
  622. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  623. /* SCTP_STATE_COOKIE_ECHOED */ \
  624. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  625. /* SCTP_STATE_ESTABLISHED */ \
  626. TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
  627. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  628. TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
  629. /* SCTP_STATE_SHUTDOWN_SENT */ \
  630. TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
  631. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  632. TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
  633. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  634. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  635. } /* TYPE_SCTP_PRIMITIVE_ASCONF */
  636. #define TYPE_SCTP_PRIMITIVE_RECONF { \
  637. /* SCTP_STATE_CLOSED */ \
  638. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  639. /* SCTP_STATE_COOKIE_WAIT */ \
  640. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  641. /* SCTP_STATE_COOKIE_ECHOED */ \
  642. TYPE_SCTP_FUNC(sctp_sf_error_closed), \
  643. /* SCTP_STATE_ESTABLISHED */ \
  644. TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
  645. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  646. TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
  647. /* SCTP_STATE_SHUTDOWN_SENT */ \
  648. TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
  649. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  650. TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
  651. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  652. TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
  653. } /* TYPE_SCTP_PRIMITIVE_RECONF */
  654. /* The primary index for this table is the primitive type.
  655. * The secondary index for this table is the state.
  656. */
  657. static const struct sctp_sm_table_entry
  658. primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = {
  659. TYPE_SCTP_PRIMITIVE_ASSOCIATE,
  660. TYPE_SCTP_PRIMITIVE_SHUTDOWN,
  661. TYPE_SCTP_PRIMITIVE_ABORT,
  662. TYPE_SCTP_PRIMITIVE_SEND,
  663. TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
  664. TYPE_SCTP_PRIMITIVE_ASCONF,
  665. TYPE_SCTP_PRIMITIVE_RECONF,
  666. };
  667. #define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
  668. /* SCTP_STATE_CLOSED */ \
  669. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  670. /* SCTP_STATE_COOKIE_WAIT */ \
  671. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  672. /* SCTP_STATE_COOKIE_ECHOED */ \
  673. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  674. /* SCTP_STATE_ESTABLISHED */ \
  675. TYPE_SCTP_FUNC(sctp_sf_do_no_pending_tsn), \
  676. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  677. TYPE_SCTP_FUNC(sctp_sf_do_9_2_start_shutdown), \
  678. /* SCTP_STATE_SHUTDOWN_SENT */ \
  679. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  680. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  681. TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \
  682. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  683. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  684. }
  685. #define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH { \
  686. /* SCTP_STATE_CLOSED */ \
  687. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  688. /* SCTP_STATE_COOKIE_WAIT */ \
  689. TYPE_SCTP_FUNC(sctp_sf_cookie_wait_icmp_abort), \
  690. /* SCTP_STATE_COOKIE_ECHOED */ \
  691. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  692. /* SCTP_STATE_ESTABLISHED */ \
  693. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  694. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  695. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  696. /* SCTP_STATE_SHUTDOWN_SENT */ \
  697. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  698. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  699. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  700. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  701. TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
  702. }
  703. static const struct sctp_sm_table_entry
  704. other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = {
  705. TYPE_SCTP_OTHER_NO_PENDING_TSN,
  706. TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH,
  707. };
  708. #define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
  709. /* SCTP_STATE_CLOSED */ \
  710. TYPE_SCTP_FUNC(sctp_sf_bug), \
  711. /* SCTP_STATE_COOKIE_WAIT */ \
  712. TYPE_SCTP_FUNC(sctp_sf_bug), \
  713. /* SCTP_STATE_COOKIE_ECHOED */ \
  714. TYPE_SCTP_FUNC(sctp_sf_bug), \
  715. /* SCTP_STATE_ESTABLISHED */ \
  716. TYPE_SCTP_FUNC(sctp_sf_bug), \
  717. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  718. TYPE_SCTP_FUNC(sctp_sf_bug), \
  719. /* SCTP_STATE_SHUTDOWN_SENT */ \
  720. TYPE_SCTP_FUNC(sctp_sf_bug), \
  721. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  722. TYPE_SCTP_FUNC(sctp_sf_bug), \
  723. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  724. TYPE_SCTP_FUNC(sctp_sf_bug), \
  725. }
  726. #define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
  727. /* SCTP_STATE_CLOSED */ \
  728. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  729. /* SCTP_STATE_COOKIE_WAIT */ \
  730. TYPE_SCTP_FUNC(sctp_sf_bug), \
  731. /* SCTP_STATE_COOKIE_ECHOED */ \
  732. TYPE_SCTP_FUNC(sctp_sf_t1_cookie_timer_expire), \
  733. /* SCTP_STATE_ESTABLISHED */ \
  734. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  735. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  736. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  737. /* SCTP_STATE_SHUTDOWN_SENT */ \
  738. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  739. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  740. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  741. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  742. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  743. }
  744. #define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
  745. /* SCTP_STATE_CLOSED */ \
  746. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  747. /* SCTP_STATE_COOKIE_WAIT */ \
  748. TYPE_SCTP_FUNC(sctp_sf_t1_init_timer_expire), \
  749. /* SCTP_STATE_COOKIE_ECHOED */ \
  750. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  751. /* SCTP_STATE_ESTABLISHED */ \
  752. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  753. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  754. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  755. /* SCTP_STATE_SHUTDOWN_SENT */ \
  756. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  757. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  758. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  759. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  760. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  761. }
  762. #define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
  763. /* SCTP_STATE_CLOSED */ \
  764. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  765. /* SCTP_STATE_COOKIE_WAIT */ \
  766. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  767. /* SCTP_STATE_COOKIE_ECHOED */ \
  768. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  769. /* SCTP_STATE_ESTABLISHED */ \
  770. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  771. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  772. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  773. /* SCTP_STATE_SHUTDOWN_SENT */ \
  774. TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
  775. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  776. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  777. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  778. TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
  779. }
  780. #define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
  781. /* SCTP_STATE_CLOSED */ \
  782. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  783. /* SCTP_STATE_COOKIE_WAIT */ \
  784. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  785. /* SCTP_STATE_COOKIE_ECHOED */ \
  786. TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
  787. /* SCTP_STATE_ESTABLISHED */ \
  788. TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
  789. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  790. TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
  791. /* SCTP_STATE_SHUTDOWN_SENT */ \
  792. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  793. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  794. TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
  795. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  796. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  797. }
  798. #define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
  799. /* SCTP_STATE_CLOSED */ \
  800. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  801. /* SCTP_STATE_COOKIE_WAIT */ \
  802. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  803. /* SCTP_STATE_COOKIE_ECHOED */ \
  804. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  805. /* SCTP_STATE_ESTABLISHED */ \
  806. TYPE_SCTP_FUNC(sctp_sf_t4_timer_expire), \
  807. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  808. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  809. /* SCTP_STATE_SHUTDOWN_SENT */ \
  810. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  811. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  812. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  813. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  814. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  815. }
  816. #define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
  817. /* SCTP_STATE_CLOSED */ \
  818. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  819. /* SCTP_STATE_COOKIE_WAIT */ \
  820. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  821. /* SCTP_STATE_COOKIE_ECHOED */ \
  822. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  823. /* SCTP_STATE_ESTABLISHED */ \
  824. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  825. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  826. TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
  827. /* SCTP_STATE_SHUTDOWN_SENT */ \
  828. TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
  829. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  830. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  831. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  832. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  833. }
  834. #define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
  835. /* SCTP_STATE_CLOSED */ \
  836. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  837. /* SCTP_STATE_COOKIE_WAIT */ \
  838. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  839. /* SCTP_STATE_COOKIE_ECHOED */ \
  840. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  841. /* SCTP_STATE_ESTABLISHED */ \
  842. TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
  843. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  844. TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
  845. /* SCTP_STATE_SHUTDOWN_SENT */ \
  846. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  847. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  848. TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
  849. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  850. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  851. }
  852. #define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
  853. /* SCTP_STATE_CLOSED */ \
  854. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  855. /* SCTP_STATE_COOKIE_WAIT */ \
  856. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  857. /* SCTP_STATE_COOKIE_ECHOED */ \
  858. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  859. /* SCTP_STATE_ESTABLISHED */ \
  860. TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
  861. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  862. TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
  863. /* SCTP_STATE_SHUTDOWN_SENT */ \
  864. TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
  865. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  866. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  867. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  868. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  869. }
  870. #define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
  871. /* SCTP_STATE_CLOSED */ \
  872. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  873. /* SCTP_STATE_COOKIE_WAIT */ \
  874. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  875. /* SCTP_STATE_COOKIE_ECHOED */ \
  876. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  877. /* SCTP_STATE_ESTABLISHED */ \
  878. TYPE_SCTP_FUNC(sctp_sf_autoclose_timer_expire), \
  879. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  880. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  881. /* SCTP_STATE_SHUTDOWN_SENT */ \
  882. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  883. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  884. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  885. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  886. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  887. }
  888. #define TYPE_SCTP_EVENT_TIMEOUT_RECONF { \
  889. /* SCTP_STATE_CLOSED */ \
  890. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  891. /* SCTP_STATE_COOKIE_WAIT */ \
  892. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  893. /* SCTP_STATE_COOKIE_ECHOED */ \
  894. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  895. /* SCTP_STATE_ESTABLISHED */ \
  896. TYPE_SCTP_FUNC(sctp_sf_send_reconf), \
  897. /* SCTP_STATE_SHUTDOWN_PENDING */ \
  898. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  899. /* SCTP_STATE_SHUTDOWN_SENT */ \
  900. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  901. /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
  902. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  903. /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
  904. TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
  905. }
  906. static const struct sctp_sm_table_entry
  907. timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
  908. TYPE_SCTP_EVENT_TIMEOUT_NONE,
  909. TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
  910. TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
  911. TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
  912. TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
  913. TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
  914. TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
  915. TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
  916. TYPE_SCTP_EVENT_TIMEOUT_RECONF,
  917. TYPE_SCTP_EVENT_TIMEOUT_SACK,
  918. TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
  919. };
  920. static const struct sctp_sm_table_entry *sctp_chunk_event_lookup(
  921. struct net *net,
  922. enum sctp_cid cid,
  923. enum sctp_state state)
  924. {
  925. if (state > SCTP_STATE_MAX)
  926. return &bug;
  927. if (cid <= SCTP_CID_BASE_MAX)
  928. return &chunk_event_table[cid][state];
  929. if (net->sctp.prsctp_enable) {
  930. if (cid == SCTP_CID_FWD_TSN)
  931. return &prsctp_chunk_event_table[0][state];
  932. }
  933. if (net->sctp.addip_enable) {
  934. if (cid == SCTP_CID_ASCONF)
  935. return &addip_chunk_event_table[0][state];
  936. if (cid == SCTP_CID_ASCONF_ACK)
  937. return &addip_chunk_event_table[1][state];
  938. }
  939. if (net->sctp.reconf_enable)
  940. if (cid == SCTP_CID_RECONF)
  941. return &reconf_chunk_event_table[0][state];
  942. if (net->sctp.auth_enable) {
  943. if (cid == SCTP_CID_AUTH)
  944. return &auth_chunk_event_table[0][state];
  945. }
  946. return &chunk_event_table_unknown[state];
  947. }