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