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