1 /* SCTP kernel reference Implementation
2 * Copyright (c) 1999-2000 Cisco, Inc.
3 * Copyright (c) 1999-2001 Motorola, Inc.
4 * Copyright (c) 2001-2003 International Business Machines, Corp.
5 * Copyright (c) 2001 Intel Corp.
6 * Copyright (c) 2001 Nokia, Inc.
8 * This file is part of the SCTP kernel reference Implementation
10 * These are the state tables for the SCTP state machine.
12 * The SCTP reference 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)
18 * The SCTP reference 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.
24 * You should have received a copy of the GNU General Public License
25 * along with GNU CC; see the file COPYING. If not, write to
26 * the Free Software Foundation, 59 Temple Place - Suite 330,
27 * Boston, MA 02111-1307, USA.
29 * Please send any bug reports or fixes you make to the
31 * lksctp developers <lksctp-developers@lists.sourceforge.net>
33 * Or submit a bug report through the following website:
34 * http://www.sf.net/projects/lksctp
36 * Written or modified by:
37 * La Monte H.P. Yarroll <piggy@acm.org>
38 * Karl Knutson <karl@athena.chicago.il.us>
39 * Jon Grimm <jgrimm@us.ibm.com>
40 * Hui Huang <hui.huang@nokia.com>
41 * Daisy Chang <daisyc@us.ibm.com>
42 * Ardelle Fan <ardelle.fan@intel.com>
44 * Any bugs reported given to us we will try to fix... any fixes shared will
45 * be incorporated into the next SCTP release.
48 #include <linux/skbuff.h>
49 #include <net/sctp/sctp.h>
50 #include <net/sctp/sm.h>
52 static const sctp_sm_table_entry_t bug = {
57 #define DO_LOOKUP(_max, _type, _table) \
58 if ((event_subtype._type > (_max))) { \
60 "sctp table %p possible attack:" \
61 " event %d exceeds max %d\n", \
62 _table, event_subtype._type, _max); \
65 return &_table[event_subtype._type][(int)state];
67 const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
69 sctp_subtype_t event_subtype)
72 case SCTP_EVENT_T_CHUNK:
73 return sctp_chunk_event_lookup(event_subtype.chunk, state);
75 case SCTP_EVENT_T_TIMEOUT:
76 DO_LOOKUP(SCTP_EVENT_TIMEOUT_MAX, timeout,
80 case SCTP_EVENT_T_OTHER:
81 DO_LOOKUP(SCTP_EVENT_OTHER_MAX, other, other_event_table);
84 case SCTP_EVENT_T_PRIMITIVE:
85 DO_LOOKUP(SCTP_EVENT_PRIMITIVE_MAX, primitive,
86 primitive_event_table);
90 /* Yikes! We got an illegal event type. */
95 #define TYPE_SCTP_DATA { \
96 /* SCTP_STATE_EMPTY */ \
97 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
98 /* SCTP_STATE_CLOSED */ \
99 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
100 /* SCTP_STATE_COOKIE_WAIT */ \
101 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
102 /* SCTP_STATE_COOKIE_ECHOED */ \
103 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
104 /* SCTP_STATE_ESTABLISHED */ \
105 {.fn = sctp_sf_eat_data_6_2, .name = "sctp_sf_eat_data_6_2"}, \
106 /* SCTP_STATE_SHUTDOWN_PENDING */ \
107 {.fn = sctp_sf_eat_data_6_2, .name = "sctp_sf_eat_data_6_2"}, \
108 /* SCTP_STATE_SHUTDOWN_SENT */ \
109 {.fn = sctp_sf_eat_data_fast_4_4, .name = "sctp_sf_eat_data_fast_4_4"}, \
110 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
111 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
112 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
113 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
114 } /* TYPE_SCTP_DATA */
116 #define TYPE_SCTP_INIT { \
117 /* SCTP_STATE_EMPTY */ \
118 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
119 /* SCTP_STATE_CLOSED */ \
120 {.fn = sctp_sf_do_5_1B_init, .name = "sctp_sf_do_5_1B_init"}, \
121 /* SCTP_STATE_COOKIE_WAIT */ \
122 {.fn = sctp_sf_do_5_2_1_siminit, .name = "sctp_sf_do_5_2_1_siminit"}, \
123 /* SCTP_STATE_COOKIE_ECHOED */ \
124 {.fn = sctp_sf_do_5_2_1_siminit, .name = "sctp_sf_do_5_2_1_siminit"}, \
125 /* SCTP_STATE_ESTABLISHED */ \
126 {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
127 /* SCTP_STATE_SHUTDOWN_PENDING */ \
128 {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
129 /* SCTP_STATE_SHUTDOWN_SENT */ \
130 {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
131 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
132 {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
133 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
134 {.fn = sctp_sf_do_9_2_reshutack, .name = "sctp_sf_do_9_2_reshutack"}, \
135 } /* TYPE_SCTP_INIT */
137 #define TYPE_SCTP_INIT_ACK { \
138 /* SCTP_STATE_EMPTY */ \
139 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
140 /* SCTP_STATE_CLOSED */ \
141 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
142 /* SCTP_STATE_COOKIE_WAIT */ \
143 {.fn = sctp_sf_do_5_1C_ack, .name = "sctp_sf_do_5_1C_ack"}, \
144 /* SCTP_STATE_COOKIE_ECHOED */ \
145 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
146 /* SCTP_STATE_ESTABLISHED */ \
147 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
148 /* SCTP_STATE_SHUTDOWN_PENDING */ \
149 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
150 /* SCTP_STATE_SHUTDOWN_SENT */ \
151 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
152 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
153 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
154 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
155 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
156 } /* TYPE_SCTP_INIT_ACK */
158 #define TYPE_SCTP_SACK { \
159 /* SCTP_STATE_EMPTY */ \
160 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
161 /* SCTP_STATE_CLOSED */ \
162 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
163 /* SCTP_STATE_COOKIE_WAIT */ \
164 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
165 /* SCTP_STATE_COOKIE_ECHOED */ \
166 {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
167 /* SCTP_STATE_ESTABLISHED */ \
168 {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
169 /* SCTP_STATE_SHUTDOWN_PENDING */ \
170 {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
171 /* SCTP_STATE_SHUTDOWN_SENT */ \
172 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
173 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
174 {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
175 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
176 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
177 } /* TYPE_SCTP_SACK */
179 #define TYPE_SCTP_HEARTBEAT { \
180 /* SCTP_STATE_EMPTY */ \
181 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
182 /* SCTP_STATE_CLOSED */ \
183 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
184 /* SCTP_STATE_COOKIE_WAIT */ \
185 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
186 /* SCTP_STATE_COOKIE_ECHOED */ \
187 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
188 /* SCTP_STATE_ESTABLISHED */ \
189 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
190 /* SCTP_STATE_SHUTDOWN_PENDING */ \
191 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
192 /* SCTP_STATE_SHUTDOWN_SENT */ \
193 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
194 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
195 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
196 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
197 /* This should not happen, but we are nice. */ \
198 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
199 } /* TYPE_SCTP_HEARTBEAT */
201 #define TYPE_SCTP_HEARTBEAT_ACK { \
202 /* SCTP_STATE_EMPTY */ \
203 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
204 /* SCTP_STATE_CLOSED */ \
205 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
206 /* SCTP_STATE_COOKIE_WAIT */ \
207 {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
208 /* SCTP_STATE_COOKIE_ECHOED */ \
209 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
210 /* SCTP_STATE_ESTABLISHED */ \
211 {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
212 /* SCTP_STATE_SHUTDOWN_PENDING */ \
213 {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
214 /* SCTP_STATE_SHUTDOWN_SENT */ \
215 {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
216 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
217 {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
218 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
219 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
220 } /* TYPE_SCTP_HEARTBEAT_ACK */
222 #define TYPE_SCTP_ABORT { \
223 /* SCTP_STATE_EMPTY */ \
224 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
225 /* SCTP_STATE_CLOSED */ \
226 {.fn = sctp_sf_pdiscard, .name = "sctp_sf_pdiscard"}, \
227 /* SCTP_STATE_COOKIE_WAIT */ \
228 {.fn = sctp_sf_cookie_wait_abort, .name = "sctp_sf_cookie_wait_abort"}, \
229 /* SCTP_STATE_COOKIE_ECHOED */ \
230 {.fn = sctp_sf_cookie_echoed_abort, \
231 .name = "sctp_sf_cookie_echoed_abort"}, \
232 /* SCTP_STATE_ESTABLISHED */ \
233 {.fn = sctp_sf_do_9_1_abort, .name = "sctp_sf_do_9_1_abort"}, \
234 /* SCTP_STATE_SHUTDOWN_PENDING */ \
235 {.fn = sctp_sf_shutdown_pending_abort, \
236 .name = "sctp_sf_shutdown_pending_abort"}, \
237 /* SCTP_STATE_SHUTDOWN_SENT */ \
238 {.fn = sctp_sf_shutdown_sent_abort, \
239 .name = "sctp_sf_shutdown_sent_abort"}, \
240 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
241 {.fn = sctp_sf_do_9_1_abort, .name = "sctp_sf_do_9_1_abort"}, \
242 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
243 {.fn = sctp_sf_shutdown_ack_sent_abort, \
244 .name = "sctp_sf_shutdown_ack_sent_abort"}, \
245 } /* TYPE_SCTP_ABORT */
247 #define TYPE_SCTP_SHUTDOWN { \
248 /* SCTP_STATE_EMPTY */ \
249 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
250 /* SCTP_STATE_CLOSED */ \
251 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
252 /* SCTP_STATE_COOKIE_WAIT */ \
253 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
254 /* SCTP_STATE_COOKIE_ECHOED */ \
255 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
256 /* SCTP_STATE_ESTABLISHED */ \
257 {.fn = sctp_sf_do_9_2_shutdown, .name = "sctp_sf_do_9_2_shutdown"}, \
258 /* SCTP_STATE_SHUTDOWN_PENDING */ \
259 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
260 /* SCTP_STATE_SHUTDOWN_SENT */ \
261 {.fn = sctp_sf_do_9_2_shutdown_ack, \
262 .name = "sctp_sf_do_9_2_shutdown_ack"}, \
263 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
264 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
265 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
266 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
267 } /* TYPE_SCTP_SHUTDOWN */
269 #define TYPE_SCTP_SHUTDOWN_ACK { \
270 /* SCTP_STATE_EMPTY */ \
271 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
272 /* SCTP_STATE_CLOSED */ \
273 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
274 /* SCTP_STATE_COOKIE_WAIT */ \
275 {.fn = sctp_sf_do_8_5_1_E_sa, .name = "sctp_sf_do_8_5_1_E_sa"}, \
276 /* SCTP_STATE_COOKIE_ECHOED */ \
277 {.fn = sctp_sf_do_8_5_1_E_sa, .name = "sctp_sf_do_8_5_1_E_sa"}, \
278 /* SCTP_STATE_ESTABLISHED */ \
279 {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
280 /* SCTP_STATE_SHUTDOWN_PENDING */ \
281 {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
282 /* SCTP_STATE_SHUTDOWN_SENT */ \
283 {.fn = sctp_sf_do_9_2_final, .name = "sctp_sf_do_9_2_final"}, \
284 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
285 {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
286 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
287 {.fn = sctp_sf_do_9_2_final, .name = "sctp_sf_do_9_2_final"}, \
288 } /* TYPE_SCTP_SHUTDOWN_ACK */
290 #define TYPE_SCTP_ERROR { \
291 /* SCTP_STATE_EMPTY */ \
292 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
293 /* SCTP_STATE_CLOSED */ \
294 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
295 /* SCTP_STATE_COOKIE_WAIT */ \
296 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
297 /* SCTP_STATE_COOKIE_ECHOED */ \
298 {.fn = sctp_sf_cookie_echoed_err, .name = "sctp_sf_cookie_echoed_err"}, \
299 /* SCTP_STATE_ESTABLISHED */ \
300 {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \
301 /* SCTP_STATE_SHUTDOWN_PENDING */ \
302 {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \
303 /* SCTP_STATE_SHUTDOWN_SENT */ \
304 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
305 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
306 {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \
307 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
308 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
309 } /* TYPE_SCTP_ERROR */
311 #define TYPE_SCTP_COOKIE_ECHO { \
312 /* SCTP_STATE_EMPTY */ \
313 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
314 /* SCTP_STATE_CLOSED */ \
315 {.fn = sctp_sf_do_5_1D_ce, .name = "sctp_sf_do_5_1D_ce"}, \
316 /* SCTP_STATE_COOKIE_WAIT */ \
317 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
318 /* SCTP_STATE_COOKIE_ECHOED */ \
319 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
320 /* SCTP_STATE_ESTABLISHED */ \
321 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
322 /* SCTP_STATE_SHUTDOWN_PENDING */ \
323 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
324 /* SCTP_STATE_SHUTDOWN_SENT */ \
325 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
326 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
327 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
328 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
329 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
330 } /* TYPE_SCTP_COOKIE_ECHO */
332 #define TYPE_SCTP_COOKIE_ACK { \
333 /* SCTP_STATE_EMPTY */ \
334 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
335 /* SCTP_STATE_CLOSED */ \
336 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
337 /* SCTP_STATE_COOKIE_WAIT */ \
338 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
339 /* SCTP_STATE_COOKIE_ECHOED */ \
340 {.fn = sctp_sf_do_5_1E_ca, .name = "sctp_sf_do_5_1E_ca"}, \
341 /* SCTP_STATE_ESTABLISHED */ \
342 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
343 /* SCTP_STATE_SHUTDOWN_PENDING */ \
344 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
345 /* SCTP_STATE_SHUTDOWN_SENT */ \
346 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
347 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
348 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
349 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
350 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
351 } /* TYPE_SCTP_COOKIE_ACK */
353 #define TYPE_SCTP_ECN_ECNE { \
354 /* SCTP_STATE_EMPTY */ \
355 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
356 /* SCTP_STATE_CLOSED */ \
357 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
358 /* SCTP_STATE_COOKIE_WAIT */ \
359 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
360 /* SCTP_STATE_COOKIE_ECHOED */ \
361 {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
362 /* SCTP_STATE_ESTABLISHED */ \
363 {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
364 /* SCTP_STATE_SHUTDOWN_PENDING */ \
365 {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
366 /* SCTP_STATE_SHUTDOWN_SENT */ \
367 {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
368 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
369 {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
370 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
371 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
372 } /* TYPE_SCTP_ECN_ECNE */
374 #define TYPE_SCTP_ECN_CWR { \
375 /* SCTP_STATE_EMPTY */ \
376 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
377 /* SCTP_STATE_CLOSED */ \
378 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
379 /* SCTP_STATE_COOKIE_WAIT */ \
380 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
381 /* SCTP_STATE_COOKIE_ECHOED */ \
382 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
383 /* SCTP_STATE_ESTABLISHED */ \
384 {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \
385 /* SCTP_STATE_SHUTDOWN_PENDING */ \
386 {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \
387 /* SCTP_STATE_SHUTDOWN_SENT */ \
388 {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \
389 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
390 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
391 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
392 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
393 } /* TYPE_SCTP_ECN_CWR */
395 #define TYPE_SCTP_SHUTDOWN_COMPLETE { \
396 /* SCTP_STATE_EMPTY */ \
397 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
398 /* SCTP_STATE_CLOSED */ \
399 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
400 /* SCTP_STATE_COOKIE_WAIT */ \
401 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
402 /* SCTP_STATE_COOKIE_ECHOED */ \
403 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
404 /* SCTP_STATE_ESTABLISHED */ \
405 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
406 /* SCTP_STATE_SHUTDOWN_PENDING */ \
407 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
408 /* SCTP_STATE_SHUTDOWN_SENT */ \
409 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
410 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
411 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
412 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
413 {.fn = sctp_sf_do_4_C, .name = "sctp_sf_do_4_C"}, \
414 } /* TYPE_SCTP_SHUTDOWN_COMPLETE */
416 /* The primary index for this table is the chunk type.
417 * The secondary index for this table is the state.
419 * For base protocol (RFC 2960).
421 const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
427 TYPE_SCTP_HEARTBEAT_ACK,
430 TYPE_SCTP_SHUTDOWN_ACK,
432 TYPE_SCTP_COOKIE_ECHO,
433 TYPE_SCTP_COOKIE_ACK,
436 TYPE_SCTP_SHUTDOWN_COMPLETE,
437 }; /* state_fn_t chunk_event_table[][] */
439 #define TYPE_SCTP_ASCONF { \
440 /* SCTP_STATE_EMPTY */ \
441 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
442 /* SCTP_STATE_CLOSED */ \
443 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
444 /* SCTP_STATE_COOKIE_WAIT */ \
445 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
446 /* SCTP_STATE_COOKIE_ECHOED */ \
447 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
448 /* SCTP_STATE_ESTABLISHED */ \
449 {.fn = sctp_sf_do_asconf, .name = "sctp_sf_do_asconf"}, \
450 /* SCTP_STATE_SHUTDOWN_PENDING */ \
451 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
452 /* SCTP_STATE_SHUTDOWN_SENT */ \
453 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
454 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
455 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
456 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
457 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
458 } /* TYPE_SCTP_ASCONF */
460 #define TYPE_SCTP_ASCONF_ACK { \
461 /* SCTP_STATE_EMPTY */ \
462 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
463 /* SCTP_STATE_CLOSED */ \
464 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
465 /* SCTP_STATE_COOKIE_WAIT */ \
466 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
467 /* SCTP_STATE_COOKIE_ECHOED */ \
468 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
469 /* SCTP_STATE_ESTABLISHED */ \
470 {.fn = sctp_sf_do_asconf_ack, .name = "sctp_sf_do_asconf_ack"}, \
471 /* SCTP_STATE_SHUTDOWN_PENDING */ \
472 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
473 /* SCTP_STATE_SHUTDOWN_SENT */ \
474 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
475 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
476 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
477 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
478 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
479 } /* TYPE_SCTP_ASCONF_ACK */
481 /* The primary index for this table is the chunk type.
482 * The secondary index for this table is the state.
484 const sctp_sm_table_entry_t addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
486 TYPE_SCTP_ASCONF_ACK,
487 }; /*state_fn_t addip_chunk_event_table[][] */
489 static const sctp_sm_table_entry_t
490 chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
491 /* SCTP_STATE_EMPTY */
492 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"},
493 /* SCTP_STATE_CLOSED */
494 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"},
495 /* SCTP_STATE_COOKIE_WAIT */
496 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
497 /* SCTP_STATE_COOKIE_ECHOED */
498 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
499 /* SCTP_STATE_ESTABLISHED */
500 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
501 /* SCTP_STATE_SHUTDOWN_PENDING */
502 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
503 /* SCTP_STATE_SHUTDOWN_SENT */
504 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
505 /* SCTP_STATE_SHUTDOWN_RECEIVED */
506 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
507 /* SCTP_STATE_SHUTDOWN_ACK_SENT */
508 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
509 }; /* chunk unknown */
512 #define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \
513 /* SCTP_STATE_EMPTY */ \
514 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
515 /* SCTP_STATE_CLOSED */ \
516 {.fn = sctp_sf_do_prm_asoc, .name = "sctp_sf_do_prm_asoc"}, \
517 /* SCTP_STATE_COOKIE_WAIT */ \
518 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
519 /* SCTP_STATE_COOKIE_ECHOED */ \
520 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
521 /* SCTP_STATE_ESTABLISHED */ \
522 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
523 /* SCTP_STATE_SHUTDOWN_PENDING */ \
524 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
525 /* SCTP_STATE_SHUTDOWN_SENT */ \
526 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
527 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
528 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
529 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
530 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
531 } /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
533 #define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \
534 /* SCTP_STATE_EMPTY */ \
535 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
536 /* SCTP_STATE_CLOSED */ \
537 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
538 /* SCTP_STATE_COOKIE_WAIT */ \
539 {.fn = sctp_sf_cookie_wait_prm_shutdown, \
540 .name = "sctp_sf_cookie_wait_prm_shutdown"}, \
541 /* SCTP_STATE_COOKIE_ECHOED */ \
542 {.fn = sctp_sf_cookie_echoed_prm_shutdown, \
543 .name = "sctp_sf_cookie_echoed_prm_shutdown"},\
544 /* SCTP_STATE_ESTABLISHED */ \
545 {.fn = sctp_sf_do_9_2_prm_shutdown, \
546 .name = "sctp_sf_do_9_2_prm_shutdown"}, \
547 /* SCTP_STATE_SHUTDOWN_PENDING */ \
548 {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
549 /* SCTP_STATE_SHUTDOWN_SENT */ \
550 {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
551 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
552 {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
553 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
554 {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
555 } /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
557 #define TYPE_SCTP_PRIMITIVE_ABORT { \
558 /* SCTP_STATE_EMPTY */ \
559 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
560 /* SCTP_STATE_CLOSED */ \
561 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
562 /* SCTP_STATE_COOKIE_WAIT */ \
563 {.fn = sctp_sf_cookie_wait_prm_abort, \
564 .name = "sctp_sf_cookie_wait_prm_abort"}, \
565 /* SCTP_STATE_COOKIE_ECHOED */ \
566 {.fn = sctp_sf_cookie_echoed_prm_abort, \
567 .name = "sctp_sf_cookie_echoed_prm_abort"}, \
568 /* SCTP_STATE_ESTABLISHED */ \
569 {.fn = sctp_sf_do_9_1_prm_abort, \
570 .name = "sctp_sf_do_9_1_prm_abort"}, \
571 /* SCTP_STATE_SHUTDOWN_PENDING */ \
572 {.fn = sctp_sf_shutdown_pending_prm_abort, \
573 .name = "sctp_sf_shutdown_pending_prm_abort"}, \
574 /* SCTP_STATE_SHUTDOWN_SENT */ \
575 {.fn = sctp_sf_shutdown_sent_prm_abort, \
576 .name = "sctp_sf_shutdown_sent_prm_abort"}, \
577 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
578 {.fn = sctp_sf_do_9_1_prm_abort, \
579 .name = "sctp_sf_do_9_1_prm_abort"}, \
580 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
581 {.fn = sctp_sf_shutdown_ack_sent_prm_abort, \
582 .name = "sctp_sf_shutdown_ack_sent_prm_abort"}, \
583 } /* TYPE_SCTP_PRIMITIVE_ABORT */
585 #define TYPE_SCTP_PRIMITIVE_SEND { \
586 /* SCTP_STATE_EMPTY */ \
587 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
588 /* SCTP_STATE_CLOSED */ \
589 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
590 /* SCTP_STATE_COOKIE_WAIT */ \
591 {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \
592 /* SCTP_STATE_COOKIE_ECHOED */ \
593 {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \
594 /* SCTP_STATE_ESTABLISHED */ \
595 {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \
596 /* SCTP_STATE_SHUTDOWN_PENDING */ \
597 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
598 /* SCTP_STATE_SHUTDOWN_SENT */ \
599 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
600 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
601 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
602 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
603 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
604 } /* TYPE_SCTP_PRIMITIVE_SEND */
606 #define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \
607 /* SCTP_STATE_EMPTY */ \
608 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
609 /* SCTP_STATE_CLOSED */ \
610 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
611 /* SCTP_STATE_COOKIE_WAIT */ \
612 {.fn = sctp_sf_do_prm_requestheartbeat, \
613 .name = "sctp_sf_do_prm_requestheartbeat"}, \
614 /* SCTP_STATE_COOKIE_ECHOED */ \
615 {.fn = sctp_sf_do_prm_requestheartbeat, \
616 .name = "sctp_sf_do_prm_requestheartbeat"}, \
617 /* SCTP_STATE_ESTABLISHED */ \
618 {.fn = sctp_sf_do_prm_requestheartbeat, \
619 .name = "sctp_sf_do_prm_requestheartbeat"}, \
620 /* SCTP_STATE_SHUTDOWN_PENDING */ \
621 {.fn = sctp_sf_do_prm_requestheartbeat, \
622 .name = "sctp_sf_do_prm_requestheartbeat"}, \
623 /* SCTP_STATE_SHUTDOWN_SENT */ \
624 {.fn = sctp_sf_do_prm_requestheartbeat, \
625 .name = "sctp_sf_do_prm_requestheartbeat"}, \
626 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
627 {.fn = sctp_sf_do_prm_requestheartbeat, \
628 .name = "sctp_sf_do_prm_requestheartbeat"}, \
629 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
630 {.fn = sctp_sf_do_prm_requestheartbeat, \
631 .name = "sctp_sf_do_prm_requestheartbeat"}, \
632 } /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
634 #define TYPE_SCTP_PRIMITIVE_ASCONF { \
635 /* SCTP_STATE_EMPTY */ \
636 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
637 /* SCTP_STATE_CLOSED */ \
638 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
639 /* SCTP_STATE_COOKIE_WAIT */ \
640 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
641 /* SCTP_STATE_COOKIE_ECHOED */ \
642 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
643 /* SCTP_STATE_ESTABLISHED */ \
644 {.fn = sctp_sf_do_prm_asconf, .name = "sctp_sf_do_prm_asconf"}, \
645 /* SCTP_STATE_SHUTDOWN_PENDING */ \
646 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
647 /* SCTP_STATE_SHUTDOWN_SENT */ \
648 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
649 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
650 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
651 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
652 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
653 } /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
655 /* The primary index for this table is the primitive type.
656 * The secondary index for this table is the state.
658 const sctp_sm_table_entry_t 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,
667 #define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
668 /* SCTP_STATE_EMPTY */ \
669 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
670 /* SCTP_STATE_CLOSED */ \
671 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
672 /* SCTP_STATE_COOKIE_WAIT */ \
673 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
674 /* SCTP_STATE_COOKIE_ECHOED */ \
675 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
676 /* SCTP_STATE_ESTABLISHED */ \
677 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
678 /* SCTP_STATE_SHUTDOWN_PENDING */ \
679 {.fn = sctp_sf_do_9_2_start_shutdown, \
680 .name = "sctp_do_9_2_start_shutdown"}, \
681 /* SCTP_STATE_SHUTDOWN_SENT */ \
682 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
683 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
684 {.fn = sctp_sf_do_9_2_shutdown_ack, \
685 .name = "sctp_sf_do_9_2_shutdown_ack"}, \
686 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
687 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
690 const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = {
691 TYPE_SCTP_OTHER_NO_PENDING_TSN,
694 #define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
695 /* SCTP_STATE_EMPTY */ \
696 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
697 /* SCTP_STATE_CLOSED */ \
698 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
699 /* SCTP_STATE_COOKIE_WAIT */ \
700 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
701 /* SCTP_STATE_COOKIE_ECHOED */ \
702 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
703 /* SCTP_STATE_ESTABLISHED */ \
704 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
705 /* SCTP_STATE_SHUTDOWN_PENDING */ \
706 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
707 /* SCTP_STATE_SHUTDOWN_SENT */ \
708 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
709 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
710 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
711 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
712 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
715 #define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
716 /* SCTP_STATE_EMPTY */ \
717 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
718 /* SCTP_STATE_CLOSED */ \
719 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
720 /* SCTP_STATE_COOKIE_WAIT */ \
721 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
722 /* SCTP_STATE_COOKIE_ECHOED */ \
723 {.fn = sctp_sf_t1_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \
724 /* SCTP_STATE_ESTABLISHED */ \
725 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
726 /* SCTP_STATE_SHUTDOWN_PENDING */ \
727 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
728 /* SCTP_STATE_SHUTDOWN_SENT */ \
729 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
730 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
731 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
732 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
733 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
736 #define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
737 /* SCTP_STATE_EMPTY */ \
738 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
739 /* SCTP_STATE_CLOSED */ \
740 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
741 /* SCTP_STATE_COOKIE_WAIT */ \
742 {.fn = sctp_sf_t1_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \
743 /* SCTP_STATE_COOKIE_ECHOED */ \
744 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
745 /* SCTP_STATE_ESTABLISHED */ \
746 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
747 /* SCTP_STATE_SHUTDOWN_PENDING */ \
748 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
749 /* SCTP_STATE_SHUTDOWN_SENT */ \
750 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
751 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
752 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
753 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
754 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
757 #define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
758 /* SCTP_STATE_EMPTY */ \
759 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
760 /* SCTP_STATE_CLOSED */ \
761 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
762 /* SCTP_STATE_COOKIE_WAIT */ \
763 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
764 /* SCTP_STATE_COOKIE_ECHOED */ \
765 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
766 /* SCTP_STATE_ESTABLISHED */ \
767 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
768 /* SCTP_STATE_SHUTDOWN_PENDING */ \
769 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
770 /* SCTP_STATE_SHUTDOWN_SENT */ \
771 {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \
772 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
773 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
774 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
775 {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \
778 #define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
779 /* SCTP_STATE_EMPTY */ \
780 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
781 /* SCTP_STATE_CLOSED */ \
782 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
783 /* SCTP_STATE_COOKIE_WAIT */ \
784 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
785 /* SCTP_STATE_COOKIE_ECHOED */ \
786 {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
787 /* SCTP_STATE_ESTABLISHED */ \
788 {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
789 /* SCTP_STATE_SHUTDOWN_PENDING */ \
790 {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
791 /* SCTP_STATE_SHUTDOWN_SENT */ \
792 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
793 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
794 {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
795 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
796 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
799 #define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
800 /* SCTP_STATE_EMPTY */ \
801 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
802 /* SCTP_STATE_CLOSED */ \
803 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
804 /* SCTP_STATE_COOKIE_WAIT */ \
805 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
806 /* SCTP_STATE_COOKIE_ECHOED */ \
807 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
808 /* SCTP_STATE_ESTABLISHED */ \
809 {.fn = sctp_sf_t4_timer_expire, .name = "sctp_sf_t4_timer_expire"}, \
810 /* SCTP_STATE_SHUTDOWN_PENDING */ \
811 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
812 /* SCTP_STATE_SHUTDOWN_SENT */ \
813 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
814 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
815 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
816 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
817 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
820 #define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
821 /* SCTP_STATE_EMPTY */ \
822 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
823 /* SCTP_STATE_CLOSED */ \
824 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
825 /* SCTP_STATE_COOKIE_WAIT */ \
826 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
827 /* SCTP_STATE_COOKIE_ECHOED */ \
828 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
829 /* SCTP_STATE_ESTABLISHED */ \
830 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
831 /* SCTP_STATE_SHUTDOWN_PENDING */ \
832 {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \
833 /* SCTP_STATE_SHUTDOWN_SENT */ \
834 {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \
835 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
836 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
837 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
838 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
841 #define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
842 /* SCTP_STATE_EMPTY */ \
843 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
844 /* SCTP_STATE_CLOSED */ \
845 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
846 /* SCTP_STATE_COOKIE_WAIT */ \
847 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
848 /* SCTP_STATE_COOKIE_ECHOED */ \
849 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
850 /* SCTP_STATE_ESTABLISHED */ \
851 {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
852 /* SCTP_STATE_SHUTDOWN_PENDING */ \
853 {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
854 /* SCTP_STATE_SHUTDOWN_SENT */ \
855 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
856 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
857 {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
858 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
859 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
862 #define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
863 /* SCTP_STATE_EMPTY */ \
864 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
865 /* SCTP_STATE_CLOSED */ \
866 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
867 /* SCTP_STATE_COOKIE_WAIT */ \
868 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
869 /* SCTP_STATE_COOKIE_ECHOED */ \
870 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
871 /* SCTP_STATE_ESTABLISHED */ \
872 {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
873 /* SCTP_STATE_SHUTDOWN_PENDING */ \
874 {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
875 /* SCTP_STATE_SHUTDOWN_SENT */ \
876 {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
877 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
878 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
879 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
880 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
883 #define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
884 /* SCTP_STATE_EMPTY */ \
885 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
886 /* SCTP_STATE_CLOSED */ \
887 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
888 /* SCTP_STATE_COOKIE_WAIT */ \
889 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
890 /* SCTP_STATE_COOKIE_ECHOED */ \
891 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
892 /* SCTP_STATE_ESTABLISHED */ \
893 {.fn = sctp_sf_autoclose_timer_expire, \
894 .name = "sctp_sf_autoclose_timer_expire"}, \
895 /* SCTP_STATE_SHUTDOWN_PENDING */ \
896 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
897 /* SCTP_STATE_SHUTDOWN_SENT */ \
898 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
899 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
900 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
901 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
902 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
905 const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
906 TYPE_SCTP_EVENT_TIMEOUT_NONE,
907 TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
908 TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
909 TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
910 TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
911 TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
912 TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
913 TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
914 TYPE_SCTP_EVENT_TIMEOUT_SACK,
915 TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
918 const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid,
921 if (state > SCTP_STATE_MAX)
924 if (cid >= 0 && cid <= SCTP_CID_BASE_MAX) {
925 return &chunk_event_table[cid][state];
928 if (cid >= SCTP_CID_ADDIP_MIN && cid <= SCTP_CID_ADDIP_MAX) {
929 return &addip_chunk_event_table
930 [cid - SCTP_CID_ADDIP_MIN][state];
933 return &chunk_event_table_unknown[state];