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