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