1 /* SCTP kernel reference 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 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>
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 bug = {
58 #define DO_LOOKUP(_max, _type, _table) \
59 if ((event_subtype._type > (_max))) { \
61 "sctp table %p possible attack:" \
62 " event %d exceeds max %d\n", \
63 _table, event_subtype._type, _max); \
66 return &_table[event_subtype._type][(int)state];
68 const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type,
70 sctp_subtype_t event_subtype)
73 case SCTP_EVENT_T_CHUNK:
74 return sctp_chunk_event_lookup(event_subtype.chunk, state);
76 case SCTP_EVENT_T_TIMEOUT:
77 DO_LOOKUP(SCTP_EVENT_TIMEOUT_MAX, timeout,
81 case SCTP_EVENT_T_OTHER:
82 DO_LOOKUP(SCTP_EVENT_OTHER_MAX, other, other_event_table);
85 case SCTP_EVENT_T_PRIMITIVE:
86 DO_LOOKUP(SCTP_EVENT_PRIMITIVE_MAX, primitive,
87 primitive_event_table);
91 /* Yikes! We got an illegal event type. */
96 #define TYPE_SCTP_DATA { \
97 /* SCTP_STATE_EMPTY */ \
98 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
99 /* SCTP_STATE_CLOSED */ \
100 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
101 /* SCTP_STATE_COOKIE_WAIT */ \
102 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
103 /* SCTP_STATE_COOKIE_ECHOED */ \
104 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
105 /* SCTP_STATE_ESTABLISHED */ \
106 {.fn = sctp_sf_eat_data_6_2, .name = "sctp_sf_eat_data_6_2"}, \
107 /* SCTP_STATE_SHUTDOWN_PENDING */ \
108 {.fn = sctp_sf_eat_data_6_2, .name = "sctp_sf_eat_data_6_2"}, \
109 /* SCTP_STATE_SHUTDOWN_SENT */ \
110 {.fn = sctp_sf_eat_data_fast_4_4, .name = "sctp_sf_eat_data_fast_4_4"}, \
111 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
112 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
113 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
114 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
115 } /* TYPE_SCTP_DATA */
117 #define TYPE_SCTP_INIT { \
118 /* SCTP_STATE_EMPTY */ \
119 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
120 /* SCTP_STATE_CLOSED */ \
121 {.fn = sctp_sf_do_5_1B_init, .name = "sctp_sf_do_5_1B_init"}, \
122 /* SCTP_STATE_COOKIE_WAIT */ \
123 {.fn = sctp_sf_do_5_2_1_siminit, .name = "sctp_sf_do_5_2_1_siminit"}, \
124 /* SCTP_STATE_COOKIE_ECHOED */ \
125 {.fn = sctp_sf_do_5_2_1_siminit, .name = "sctp_sf_do_5_2_1_siminit"}, \
126 /* SCTP_STATE_ESTABLISHED */ \
127 {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
128 /* SCTP_STATE_SHUTDOWN_PENDING */ \
129 {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
130 /* SCTP_STATE_SHUTDOWN_SENT */ \
131 {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
132 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
133 {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \
134 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
135 {.fn = sctp_sf_do_9_2_reshutack, .name = "sctp_sf_do_9_2_reshutack"}, \
136 } /* TYPE_SCTP_INIT */
138 #define TYPE_SCTP_INIT_ACK { \
139 /* SCTP_STATE_EMPTY */ \
140 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
141 /* SCTP_STATE_CLOSED */ \
142 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
143 /* SCTP_STATE_COOKIE_WAIT */ \
144 {.fn = sctp_sf_do_5_1C_ack, .name = "sctp_sf_do_5_1C_ack"}, \
145 /* SCTP_STATE_COOKIE_ECHOED */ \
146 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
147 /* SCTP_STATE_ESTABLISHED */ \
148 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
149 /* SCTP_STATE_SHUTDOWN_PENDING */ \
150 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
151 /* SCTP_STATE_SHUTDOWN_SENT */ \
152 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
153 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
154 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
155 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
156 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
157 } /* TYPE_SCTP_INIT_ACK */
159 #define TYPE_SCTP_SACK { \
160 /* SCTP_STATE_EMPTY */ \
161 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
162 /* SCTP_STATE_CLOSED */ \
163 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
164 /* SCTP_STATE_COOKIE_WAIT */ \
165 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
166 /* SCTP_STATE_COOKIE_ECHOED */ \
167 {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
168 /* SCTP_STATE_ESTABLISHED */ \
169 {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
170 /* SCTP_STATE_SHUTDOWN_PENDING */ \
171 {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
172 /* SCTP_STATE_SHUTDOWN_SENT */ \
173 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
174 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
175 {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \
176 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
177 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
178 } /* TYPE_SCTP_SACK */
180 #define TYPE_SCTP_HEARTBEAT { \
181 /* SCTP_STATE_EMPTY */ \
182 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
183 /* SCTP_STATE_CLOSED */ \
184 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
185 /* SCTP_STATE_COOKIE_WAIT */ \
186 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
187 /* SCTP_STATE_COOKIE_ECHOED */ \
188 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
189 /* SCTP_STATE_ESTABLISHED */ \
190 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
191 /* SCTP_STATE_SHUTDOWN_PENDING */ \
192 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
193 /* SCTP_STATE_SHUTDOWN_SENT */ \
194 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
195 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
196 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
197 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
198 /* This should not happen, but we are nice. */ \
199 {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \
200 } /* TYPE_SCTP_HEARTBEAT */
202 #define TYPE_SCTP_HEARTBEAT_ACK { \
203 /* SCTP_STATE_EMPTY */ \
204 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
205 /* SCTP_STATE_CLOSED */ \
206 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
207 /* SCTP_STATE_COOKIE_WAIT */ \
208 {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
209 /* SCTP_STATE_COOKIE_ECHOED */ \
210 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
211 /* SCTP_STATE_ESTABLISHED */ \
212 {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
213 /* SCTP_STATE_SHUTDOWN_PENDING */ \
214 {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
215 /* SCTP_STATE_SHUTDOWN_SENT */ \
216 {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
217 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
218 {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \
219 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
220 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
221 } /* TYPE_SCTP_HEARTBEAT_ACK */
223 #define TYPE_SCTP_ABORT { \
224 /* SCTP_STATE_EMPTY */ \
225 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
226 /* SCTP_STATE_CLOSED */ \
227 {.fn = sctp_sf_pdiscard, .name = "sctp_sf_pdiscard"}, \
228 /* SCTP_STATE_COOKIE_WAIT */ \
229 {.fn = sctp_sf_cookie_wait_abort, .name = "sctp_sf_cookie_wait_abort"}, \
230 /* SCTP_STATE_COOKIE_ECHOED */ \
231 {.fn = sctp_sf_cookie_echoed_abort, \
232 .name = "sctp_sf_cookie_echoed_abort"}, \
233 /* SCTP_STATE_ESTABLISHED */ \
234 {.fn = sctp_sf_do_9_1_abort, .name = "sctp_sf_do_9_1_abort"}, \
235 /* SCTP_STATE_SHUTDOWN_PENDING */ \
236 {.fn = sctp_sf_shutdown_pending_abort, \
237 .name = "sctp_sf_shutdown_pending_abort"}, \
238 /* SCTP_STATE_SHUTDOWN_SENT */ \
239 {.fn = sctp_sf_shutdown_sent_abort, \
240 .name = "sctp_sf_shutdown_sent_abort"}, \
241 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
242 {.fn = sctp_sf_do_9_1_abort, .name = "sctp_sf_do_9_1_abort"}, \
243 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
244 {.fn = sctp_sf_shutdown_ack_sent_abort, \
245 .name = "sctp_sf_shutdown_ack_sent_abort"}, \
246 } /* TYPE_SCTP_ABORT */
248 #define TYPE_SCTP_SHUTDOWN { \
249 /* SCTP_STATE_EMPTY */ \
250 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
251 /* SCTP_STATE_CLOSED */ \
252 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
253 /* SCTP_STATE_COOKIE_WAIT */ \
254 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
255 /* SCTP_STATE_COOKIE_ECHOED */ \
256 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
257 /* SCTP_STATE_ESTABLISHED */ \
258 {.fn = sctp_sf_do_9_2_shutdown, .name = "sctp_sf_do_9_2_shutdown"}, \
259 /* SCTP_STATE_SHUTDOWN_PENDING */ \
260 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
261 /* SCTP_STATE_SHUTDOWN_SENT */ \
262 {.fn = sctp_sf_do_9_2_shutdown_ack, \
263 .name = "sctp_sf_do_9_2_shutdown_ack"}, \
264 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
265 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
266 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
267 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
268 } /* TYPE_SCTP_SHUTDOWN */
270 #define TYPE_SCTP_SHUTDOWN_ACK { \
271 /* SCTP_STATE_EMPTY */ \
272 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
273 /* SCTP_STATE_CLOSED */ \
274 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
275 /* SCTP_STATE_COOKIE_WAIT */ \
276 {.fn = sctp_sf_do_8_5_1_E_sa, .name = "sctp_sf_do_8_5_1_E_sa"}, \
277 /* SCTP_STATE_COOKIE_ECHOED */ \
278 {.fn = sctp_sf_do_8_5_1_E_sa, .name = "sctp_sf_do_8_5_1_E_sa"}, \
279 /* SCTP_STATE_ESTABLISHED */ \
280 {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
281 /* SCTP_STATE_SHUTDOWN_PENDING */ \
282 {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
283 /* SCTP_STATE_SHUTDOWN_SENT */ \
284 {.fn = sctp_sf_do_9_2_final, .name = "sctp_sf_do_9_2_final"}, \
285 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
286 {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \
287 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
288 {.fn = sctp_sf_do_9_2_final, .name = "sctp_sf_do_9_2_final"}, \
289 } /* TYPE_SCTP_SHUTDOWN_ACK */
291 #define TYPE_SCTP_ERROR { \
292 /* SCTP_STATE_EMPTY */ \
293 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
294 /* SCTP_STATE_CLOSED */ \
295 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \
296 /* SCTP_STATE_COOKIE_WAIT */ \
297 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
298 /* SCTP_STATE_COOKIE_ECHOED */ \
299 {.fn = sctp_sf_cookie_echoed_err, .name = "sctp_sf_cookie_echoed_err"}, \
300 /* SCTP_STATE_ESTABLISHED */ \
301 {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \
302 /* SCTP_STATE_SHUTDOWN_PENDING */ \
303 {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \
304 /* SCTP_STATE_SHUTDOWN_SENT */ \
305 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
306 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
307 {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \
308 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
309 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
310 } /* TYPE_SCTP_ERROR */
312 #define TYPE_SCTP_COOKIE_ECHO { \
313 /* SCTP_STATE_EMPTY */ \
314 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
315 /* SCTP_STATE_CLOSED */ \
316 {.fn = sctp_sf_do_5_1D_ce, .name = "sctp_sf_do_5_1D_ce"}, \
317 /* SCTP_STATE_COOKIE_WAIT */ \
318 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
319 /* SCTP_STATE_COOKIE_ECHOED */ \
320 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
321 /* SCTP_STATE_ESTABLISHED */ \
322 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
323 /* SCTP_STATE_SHUTDOWN_PENDING */ \
324 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
325 /* SCTP_STATE_SHUTDOWN_SENT */ \
326 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
327 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
328 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
329 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
330 {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \
331 } /* TYPE_SCTP_COOKIE_ECHO */
333 #define TYPE_SCTP_COOKIE_ACK { \
334 /* SCTP_STATE_EMPTY */ \
335 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
336 /* SCTP_STATE_CLOSED */ \
337 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
338 /* SCTP_STATE_COOKIE_WAIT */ \
339 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
340 /* SCTP_STATE_COOKIE_ECHOED */ \
341 {.fn = sctp_sf_do_5_1E_ca, .name = "sctp_sf_do_5_1E_ca"}, \
342 /* SCTP_STATE_ESTABLISHED */ \
343 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
344 /* SCTP_STATE_SHUTDOWN_PENDING */ \
345 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
346 /* SCTP_STATE_SHUTDOWN_SENT */ \
347 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
348 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
349 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
350 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
351 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
352 } /* TYPE_SCTP_COOKIE_ACK */
354 #define TYPE_SCTP_ECN_ECNE { \
355 /* SCTP_STATE_EMPTY */ \
356 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
357 /* SCTP_STATE_CLOSED */ \
358 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
359 /* SCTP_STATE_COOKIE_WAIT */ \
360 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
361 /* SCTP_STATE_COOKIE_ECHOED */ \
362 {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
363 /* SCTP_STATE_ESTABLISHED */ \
364 {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
365 /* SCTP_STATE_SHUTDOWN_PENDING */ \
366 {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
367 /* SCTP_STATE_SHUTDOWN_SENT */ \
368 {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
369 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
370 {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
371 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
372 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
373 } /* TYPE_SCTP_ECN_ECNE */
375 #define TYPE_SCTP_ECN_CWR { \
376 /* SCTP_STATE_EMPTY */ \
377 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
378 /* SCTP_STATE_CLOSED */ \
379 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
380 /* SCTP_STATE_COOKIE_WAIT */ \
381 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
382 /* SCTP_STATE_COOKIE_ECHOED */ \
383 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
384 /* SCTP_STATE_ESTABLISHED */ \
385 {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \
386 /* SCTP_STATE_SHUTDOWN_PENDING */ \
387 {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \
388 /* SCTP_STATE_SHUTDOWN_SENT */ \
389 {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \
390 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
391 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
392 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
393 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
394 } /* TYPE_SCTP_ECN_CWR */
396 #define TYPE_SCTP_SHUTDOWN_COMPLETE { \
397 /* SCTP_STATE_EMPTY */ \
398 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
399 /* SCTP_STATE_CLOSED */ \
400 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
401 /* SCTP_STATE_COOKIE_WAIT */ \
402 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
403 /* SCTP_STATE_COOKIE_ECHOED */ \
404 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
405 /* SCTP_STATE_ESTABLISHED */ \
406 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
407 /* SCTP_STATE_SHUTDOWN_PENDING */ \
408 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
409 /* SCTP_STATE_SHUTDOWN_SENT */ \
410 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
411 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
412 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
413 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
414 {.fn = sctp_sf_do_4_C, .name = "sctp_sf_do_4_C"}, \
415 } /* TYPE_SCTP_SHUTDOWN_COMPLETE */
417 /* The primary index for this table is the chunk type.
418 * The secondary index for this table is the state.
420 * For base protocol (RFC 2960).
422 const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
428 TYPE_SCTP_HEARTBEAT_ACK,
431 TYPE_SCTP_SHUTDOWN_ACK,
433 TYPE_SCTP_COOKIE_ECHO,
434 TYPE_SCTP_COOKIE_ACK,
437 TYPE_SCTP_SHUTDOWN_COMPLETE,
438 }; /* state_fn_t chunk_event_table[][] */
440 #define TYPE_SCTP_ASCONF { \
441 /* SCTP_STATE_EMPTY */ \
442 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
443 /* SCTP_STATE_CLOSED */ \
444 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
445 /* SCTP_STATE_COOKIE_WAIT */ \
446 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
447 /* SCTP_STATE_COOKIE_ECHOED */ \
448 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
449 /* SCTP_STATE_ESTABLISHED */ \
450 {.fn = sctp_sf_do_asconf, .name = "sctp_sf_do_asconf"}, \
451 /* SCTP_STATE_SHUTDOWN_PENDING */ \
452 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
453 /* SCTP_STATE_SHUTDOWN_SENT */ \
454 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
455 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
456 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
457 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
458 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
459 } /* TYPE_SCTP_ASCONF */
461 #define TYPE_SCTP_ASCONF_ACK { \
462 /* SCTP_STATE_EMPTY */ \
463 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
464 /* SCTP_STATE_CLOSED */ \
465 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
466 /* SCTP_STATE_COOKIE_WAIT */ \
467 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
468 /* SCTP_STATE_COOKIE_ECHOED */ \
469 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
470 /* SCTP_STATE_ESTABLISHED */ \
471 {.fn = sctp_sf_do_asconf_ack, .name = "sctp_sf_do_asconf_ack"}, \
472 /* SCTP_STATE_SHUTDOWN_PENDING */ \
473 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
474 /* SCTP_STATE_SHUTDOWN_SENT */ \
475 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
476 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
477 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
478 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
479 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
480 } /* TYPE_SCTP_ASCONF_ACK */
482 /* The primary index for this table is the chunk type.
483 * The secondary index for this table is the state.
485 const sctp_sm_table_entry_t addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
487 TYPE_SCTP_ASCONF_ACK,
488 }; /*state_fn_t addip_chunk_event_table[][] */
490 #define TYPE_SCTP_FWD_TSN { \
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_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
497 /* SCTP_STATE_COOKIE_ECHOED */ \
498 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
499 /* SCTP_STATE_ESTABLISHED */ \
500 {.fn = sctp_sf_eat_fwd_tsn, .name = "sctp_sf_eat_fwd_tsn"}, \
501 /* SCTP_STATE_SHUTDOWN_PENDING */ \
502 {.fn = sctp_sf_eat_fwd_tsn, .name = "sctp_sf_eat_fwd_tsn"}, \
503 /* SCTP_STATE_SHUTDOWN_SENT */ \
504 {.fn = sctp_sf_eat_fwd_tsn_fast, .name = "sctp_sf_eat_fwd_tsn_fast"}, \
505 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
506 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
507 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
508 {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
509 } /* TYPE_SCTP_FWD_TSN */
511 /* The primary index for this table is the chunk type.
512 * The secondary index for this table is the state.
514 const sctp_sm_table_entry_t prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
516 }; /*state_fn_t prsctp_chunk_event_table[][] */
518 static const sctp_sm_table_entry_t
519 chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
520 /* SCTP_STATE_EMPTY */
521 {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"},
522 /* SCTP_STATE_CLOSED */
523 {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"},
524 /* SCTP_STATE_COOKIE_WAIT */
525 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
526 /* SCTP_STATE_COOKIE_ECHOED */
527 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
528 /* SCTP_STATE_ESTABLISHED */
529 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
530 /* SCTP_STATE_SHUTDOWN_PENDING */
531 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
532 /* SCTP_STATE_SHUTDOWN_SENT */
533 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
534 /* SCTP_STATE_SHUTDOWN_RECEIVED */
535 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
536 /* SCTP_STATE_SHUTDOWN_ACK_SENT */
537 {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"},
538 }; /* chunk unknown */
541 #define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \
542 /* SCTP_STATE_EMPTY */ \
543 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
544 /* SCTP_STATE_CLOSED */ \
545 {.fn = sctp_sf_do_prm_asoc, .name = "sctp_sf_do_prm_asoc"}, \
546 /* SCTP_STATE_COOKIE_WAIT */ \
547 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
548 /* SCTP_STATE_COOKIE_ECHOED */ \
549 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
550 /* SCTP_STATE_ESTABLISHED */ \
551 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
552 /* SCTP_STATE_SHUTDOWN_PENDING */ \
553 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
554 /* SCTP_STATE_SHUTDOWN_SENT */ \
555 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
556 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
557 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
558 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
559 {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \
560 } /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
562 #define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \
563 /* SCTP_STATE_EMPTY */ \
564 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
565 /* SCTP_STATE_CLOSED */ \
566 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
567 /* SCTP_STATE_COOKIE_WAIT */ \
568 {.fn = sctp_sf_cookie_wait_prm_shutdown, \
569 .name = "sctp_sf_cookie_wait_prm_shutdown"}, \
570 /* SCTP_STATE_COOKIE_ECHOED */ \
571 {.fn = sctp_sf_cookie_echoed_prm_shutdown, \
572 .name = "sctp_sf_cookie_echoed_prm_shutdown"},\
573 /* SCTP_STATE_ESTABLISHED */ \
574 {.fn = sctp_sf_do_9_2_prm_shutdown, \
575 .name = "sctp_sf_do_9_2_prm_shutdown"}, \
576 /* SCTP_STATE_SHUTDOWN_PENDING */ \
577 {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
578 /* SCTP_STATE_SHUTDOWN_SENT */ \
579 {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
580 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
581 {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
582 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
583 {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \
584 } /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
586 #define TYPE_SCTP_PRIMITIVE_ABORT { \
587 /* SCTP_STATE_EMPTY */ \
588 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
589 /* SCTP_STATE_CLOSED */ \
590 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
591 /* SCTP_STATE_COOKIE_WAIT */ \
592 {.fn = sctp_sf_cookie_wait_prm_abort, \
593 .name = "sctp_sf_cookie_wait_prm_abort"}, \
594 /* SCTP_STATE_COOKIE_ECHOED */ \
595 {.fn = sctp_sf_cookie_echoed_prm_abort, \
596 .name = "sctp_sf_cookie_echoed_prm_abort"}, \
597 /* SCTP_STATE_ESTABLISHED */ \
598 {.fn = sctp_sf_do_9_1_prm_abort, \
599 .name = "sctp_sf_do_9_1_prm_abort"}, \
600 /* SCTP_STATE_SHUTDOWN_PENDING */ \
601 {.fn = sctp_sf_shutdown_pending_prm_abort, \
602 .name = "sctp_sf_shutdown_pending_prm_abort"}, \
603 /* SCTP_STATE_SHUTDOWN_SENT */ \
604 {.fn = sctp_sf_shutdown_sent_prm_abort, \
605 .name = "sctp_sf_shutdown_sent_prm_abort"}, \
606 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
607 {.fn = sctp_sf_do_9_1_prm_abort, \
608 .name = "sctp_sf_do_9_1_prm_abort"}, \
609 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
610 {.fn = sctp_sf_shutdown_ack_sent_prm_abort, \
611 .name = "sctp_sf_shutdown_ack_sent_prm_abort"}, \
612 } /* TYPE_SCTP_PRIMITIVE_ABORT */
614 #define TYPE_SCTP_PRIMITIVE_SEND { \
615 /* SCTP_STATE_EMPTY */ \
616 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
617 /* SCTP_STATE_CLOSED */ \
618 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
619 /* SCTP_STATE_COOKIE_WAIT */ \
620 {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \
621 /* SCTP_STATE_COOKIE_ECHOED */ \
622 {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \
623 /* SCTP_STATE_ESTABLISHED */ \
624 {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \
625 /* SCTP_STATE_SHUTDOWN_PENDING */ \
626 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
627 /* SCTP_STATE_SHUTDOWN_SENT */ \
628 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
629 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
630 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
631 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
632 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
633 } /* TYPE_SCTP_PRIMITIVE_SEND */
635 #define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \
636 /* SCTP_STATE_EMPTY */ \
637 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
638 /* SCTP_STATE_CLOSED */ \
639 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
640 /* SCTP_STATE_COOKIE_WAIT */ \
641 {.fn = sctp_sf_do_prm_requestheartbeat, \
642 .name = "sctp_sf_do_prm_requestheartbeat"}, \
643 /* SCTP_STATE_COOKIE_ECHOED */ \
644 {.fn = sctp_sf_do_prm_requestheartbeat, \
645 .name = "sctp_sf_do_prm_requestheartbeat"}, \
646 /* SCTP_STATE_ESTABLISHED */ \
647 {.fn = sctp_sf_do_prm_requestheartbeat, \
648 .name = "sctp_sf_do_prm_requestheartbeat"}, \
649 /* SCTP_STATE_SHUTDOWN_PENDING */ \
650 {.fn = sctp_sf_do_prm_requestheartbeat, \
651 .name = "sctp_sf_do_prm_requestheartbeat"}, \
652 /* SCTP_STATE_SHUTDOWN_SENT */ \
653 {.fn = sctp_sf_do_prm_requestheartbeat, \
654 .name = "sctp_sf_do_prm_requestheartbeat"}, \
655 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
656 {.fn = sctp_sf_do_prm_requestheartbeat, \
657 .name = "sctp_sf_do_prm_requestheartbeat"}, \
658 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
659 {.fn = sctp_sf_do_prm_requestheartbeat, \
660 .name = "sctp_sf_do_prm_requestheartbeat"}, \
661 } /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
663 #define TYPE_SCTP_PRIMITIVE_ASCONF { \
664 /* SCTP_STATE_EMPTY */ \
665 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
666 /* SCTP_STATE_CLOSED */ \
667 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
668 /* SCTP_STATE_COOKIE_WAIT */ \
669 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
670 /* SCTP_STATE_COOKIE_ECHOED */ \
671 {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
672 /* SCTP_STATE_ESTABLISHED */ \
673 {.fn = sctp_sf_do_prm_asconf, .name = "sctp_sf_do_prm_asconf"}, \
674 /* SCTP_STATE_SHUTDOWN_PENDING */ \
675 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
676 /* SCTP_STATE_SHUTDOWN_SENT */ \
677 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
678 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
679 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
680 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
681 {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \
682 } /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
684 /* The primary index for this table is the primitive type.
685 * The secondary index for this table is the state.
687 const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = {
688 TYPE_SCTP_PRIMITIVE_ASSOCIATE,
689 TYPE_SCTP_PRIMITIVE_SHUTDOWN,
690 TYPE_SCTP_PRIMITIVE_ABORT,
691 TYPE_SCTP_PRIMITIVE_SEND,
692 TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
693 TYPE_SCTP_PRIMITIVE_ASCONF,
696 #define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
697 /* SCTP_STATE_EMPTY */ \
698 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
699 /* SCTP_STATE_CLOSED */ \
700 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
701 /* SCTP_STATE_COOKIE_WAIT */ \
702 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
703 /* SCTP_STATE_COOKIE_ECHOED */ \
704 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
705 /* SCTP_STATE_ESTABLISHED */ \
706 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
707 /* SCTP_STATE_SHUTDOWN_PENDING */ \
708 {.fn = sctp_sf_do_9_2_start_shutdown, \
709 .name = "sctp_do_9_2_start_shutdown"}, \
710 /* SCTP_STATE_SHUTDOWN_SENT */ \
711 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
712 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
713 {.fn = sctp_sf_do_9_2_shutdown_ack, \
714 .name = "sctp_sf_do_9_2_shutdown_ack"}, \
715 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
716 {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \
719 const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = {
720 TYPE_SCTP_OTHER_NO_PENDING_TSN,
723 #define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
724 /* SCTP_STATE_EMPTY */ \
725 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
726 /* SCTP_STATE_CLOSED */ \
727 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
728 /* SCTP_STATE_COOKIE_WAIT */ \
729 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
730 /* SCTP_STATE_COOKIE_ECHOED */ \
731 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
732 /* SCTP_STATE_ESTABLISHED */ \
733 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
734 /* SCTP_STATE_SHUTDOWN_PENDING */ \
735 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
736 /* SCTP_STATE_SHUTDOWN_SENT */ \
737 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
738 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
739 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
740 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
741 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
744 #define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
745 /* SCTP_STATE_EMPTY */ \
746 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
747 /* SCTP_STATE_CLOSED */ \
748 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
749 /* SCTP_STATE_COOKIE_WAIT */ \
750 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
751 /* SCTP_STATE_COOKIE_ECHOED */ \
752 {.fn = sctp_sf_t1_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \
753 /* SCTP_STATE_ESTABLISHED */ \
754 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
755 /* SCTP_STATE_SHUTDOWN_PENDING */ \
756 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
757 /* SCTP_STATE_SHUTDOWN_SENT */ \
758 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
759 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
760 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
761 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
762 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
765 #define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
766 /* SCTP_STATE_EMPTY */ \
767 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
768 /* SCTP_STATE_CLOSED */ \
769 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
770 /* SCTP_STATE_COOKIE_WAIT */ \
771 {.fn = sctp_sf_t1_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \
772 /* SCTP_STATE_COOKIE_ECHOED */ \
773 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
774 /* SCTP_STATE_ESTABLISHED */ \
775 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
776 /* SCTP_STATE_SHUTDOWN_PENDING */ \
777 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
778 /* SCTP_STATE_SHUTDOWN_SENT */ \
779 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
780 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
781 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
782 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
783 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
786 #define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
787 /* SCTP_STATE_EMPTY */ \
788 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
789 /* SCTP_STATE_CLOSED */ \
790 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
791 /* SCTP_STATE_COOKIE_WAIT */ \
792 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
793 /* SCTP_STATE_COOKIE_ECHOED */ \
794 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
795 /* SCTP_STATE_ESTABLISHED */ \
796 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
797 /* SCTP_STATE_SHUTDOWN_PENDING */ \
798 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
799 /* SCTP_STATE_SHUTDOWN_SENT */ \
800 {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \
801 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
802 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
803 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
804 {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \
807 #define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
808 /* SCTP_STATE_EMPTY */ \
809 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
810 /* SCTP_STATE_CLOSED */ \
811 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
812 /* SCTP_STATE_COOKIE_WAIT */ \
813 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
814 /* SCTP_STATE_COOKIE_ECHOED */ \
815 {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
816 /* SCTP_STATE_ESTABLISHED */ \
817 {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
818 /* SCTP_STATE_SHUTDOWN_PENDING */ \
819 {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
820 /* SCTP_STATE_SHUTDOWN_SENT */ \
821 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
822 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
823 {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
824 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
825 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
828 #define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
829 /* SCTP_STATE_EMPTY */ \
830 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
831 /* SCTP_STATE_CLOSED */ \
832 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
833 /* SCTP_STATE_COOKIE_WAIT */ \
834 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
835 /* SCTP_STATE_COOKIE_ECHOED */ \
836 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
837 /* SCTP_STATE_ESTABLISHED */ \
838 {.fn = sctp_sf_t4_timer_expire, .name = "sctp_sf_t4_timer_expire"}, \
839 /* SCTP_STATE_SHUTDOWN_PENDING */ \
840 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
841 /* SCTP_STATE_SHUTDOWN_SENT */ \
842 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
843 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
844 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
845 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
846 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
849 #define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
850 /* SCTP_STATE_EMPTY */ \
851 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
852 /* SCTP_STATE_CLOSED */ \
853 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
854 /* SCTP_STATE_COOKIE_WAIT */ \
855 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
856 /* SCTP_STATE_COOKIE_ECHOED */ \
857 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
858 /* SCTP_STATE_ESTABLISHED */ \
859 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
860 /* SCTP_STATE_SHUTDOWN_PENDING */ \
861 {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \
862 /* SCTP_STATE_SHUTDOWN_SENT */ \
863 {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \
864 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
865 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
866 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
867 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
870 #define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
871 /* SCTP_STATE_EMPTY */ \
872 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
873 /* SCTP_STATE_CLOSED */ \
874 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
875 /* SCTP_STATE_COOKIE_WAIT */ \
876 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
877 /* SCTP_STATE_COOKIE_ECHOED */ \
878 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
879 /* SCTP_STATE_ESTABLISHED */ \
880 {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
881 /* SCTP_STATE_SHUTDOWN_PENDING */ \
882 {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
883 /* SCTP_STATE_SHUTDOWN_SENT */ \
884 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
885 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
886 {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
887 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
888 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
891 #define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
892 /* SCTP_STATE_EMPTY */ \
893 {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
894 /* SCTP_STATE_CLOSED */ \
895 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
896 /* SCTP_STATE_COOKIE_WAIT */ \
897 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
898 /* SCTP_STATE_COOKIE_ECHOED */ \
899 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
900 /* SCTP_STATE_ESTABLISHED */ \
901 {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
902 /* SCTP_STATE_SHUTDOWN_PENDING */ \
903 {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
904 /* SCTP_STATE_SHUTDOWN_SENT */ \
905 {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
906 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
907 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
908 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
909 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
912 #define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
913 /* SCTP_STATE_EMPTY */ \
914 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
915 /* SCTP_STATE_CLOSED */ \
916 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
917 /* SCTP_STATE_COOKIE_WAIT */ \
918 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
919 /* SCTP_STATE_COOKIE_ECHOED */ \
920 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
921 /* SCTP_STATE_ESTABLISHED */ \
922 {.fn = sctp_sf_autoclose_timer_expire, \
923 .name = "sctp_sf_autoclose_timer_expire"}, \
924 /* SCTP_STATE_SHUTDOWN_PENDING */ \
925 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
926 /* SCTP_STATE_SHUTDOWN_SENT */ \
927 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
928 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
929 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
930 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
931 {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
934 const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
935 TYPE_SCTP_EVENT_TIMEOUT_NONE,
936 TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
937 TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
938 TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
939 TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
940 TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
941 TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
942 TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
943 TYPE_SCTP_EVENT_TIMEOUT_SACK,
944 TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
947 const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid,
950 if (state > SCTP_STATE_MAX)
953 if (cid >= 0 && cid <= SCTP_CID_BASE_MAX)
954 return &chunk_event_table[cid][state];
956 if (sctp_prsctp_enable) {
957 if (cid == SCTP_CID_FWD_TSN)
958 return &prsctp_chunk_event_table[0][state];
961 if (sctp_addip_enable) {
962 if (cid == SCTP_CID_ASCONF)
963 return &addip_chunk_event_table[0][state];
965 if (cid == SCTP_CID_ASCONF_ACK)
966 return &addip_chunk_event_table[1][state];
969 return &chunk_event_table_unknown[state];