sm_statetable.c 34 KB

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