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