]> git.ipfire.org Git - people/ms/linux.git/blame - net/sctp/sm_statetable.c
Merge tag 'tegra-for-5.20-arm64-defconfig' of git://git.kernel.org/pub/scm/linux...
[people/ms/linux.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
745a3211
XL
529static const struct sctp_sm_table_entry
530pad_chunk_event_table[SCTP_STATE_NUM_STATES] = {
531 /* SCTP_STATE_CLOSED */
532 TYPE_SCTP_FUNC(sctp_sf_discard_chunk),
533 /* SCTP_STATE_COOKIE_WAIT */
534 TYPE_SCTP_FUNC(sctp_sf_discard_chunk),
535 /* SCTP_STATE_COOKIE_ECHOED */
536 TYPE_SCTP_FUNC(sctp_sf_discard_chunk),
537 /* SCTP_STATE_ESTABLISHED */
538 TYPE_SCTP_FUNC(sctp_sf_discard_chunk),
539 /* SCTP_STATE_SHUTDOWN_PENDING */
540 TYPE_SCTP_FUNC(sctp_sf_discard_chunk),
541 /* SCTP_STATE_SHUTDOWN_SENT */
542 TYPE_SCTP_FUNC(sctp_sf_discard_chunk),
543 /* SCTP_STATE_SHUTDOWN_RECEIVED */
544 TYPE_SCTP_FUNC(sctp_sf_discard_chunk),
545 /* SCTP_STATE_SHUTDOWN_ACK_SENT */
546 TYPE_SCTP_FUNC(sctp_sf_discard_chunk),
547}; /* chunk pad */
548
8ee821ae 549static const struct sctp_sm_table_entry
1da177e4 550chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
1da177e4 551 /* SCTP_STATE_CLOSED */
ece25dfa 552 TYPE_SCTP_FUNC(sctp_sf_ootb),
1da177e4 553 /* SCTP_STATE_COOKIE_WAIT */
1ed176a8 554 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 555 /* SCTP_STATE_COOKIE_ECHOED */
1ed176a8 556 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 557 /* SCTP_STATE_ESTABLISHED */
1ed176a8 558 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 559 /* SCTP_STATE_SHUTDOWN_PENDING */
1ed176a8 560 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 561 /* SCTP_STATE_SHUTDOWN_SENT */
1ed176a8 562 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 563 /* SCTP_STATE_SHUTDOWN_RECEIVED */
1ed176a8 564 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 565 /* SCTP_STATE_SHUTDOWN_ACK_SENT */
1ed176a8 566 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4
LT
567}; /* chunk unknown */
568
569
570#define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \
1da177e4 571 /* SCTP_STATE_CLOSED */ \
1ed176a8 572 TYPE_SCTP_FUNC(sctp_sf_do_prm_asoc), \
1da177e4 573 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 574 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 575 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 576 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 577 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 578 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 579 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 580 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 581 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 582 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 583 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 584 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 585 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 586 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4
LT
587} /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
588
589#define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \
1da177e4 590 /* SCTP_STATE_CLOSED */ \
1ed176a8 591 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 592 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 593 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_shutdown), \
1da177e4 594 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 595 TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_shutdown),\
1da177e4 596 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 597 TYPE_SCTP_FUNC(sctp_sf_do_9_2_prm_shutdown), \
1da177e4 598 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 599 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
1da177e4 600 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 601 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
1da177e4 602 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 603 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
1da177e4 604 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 605 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
1da177e4
LT
606} /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
607
608#define TYPE_SCTP_PRIMITIVE_ABORT { \
1da177e4 609 /* SCTP_STATE_CLOSED */ \
1ed176a8 610 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 611 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 612 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_abort), \
1da177e4 613 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 614 TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_abort), \
1da177e4 615 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 616 TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
1da177e4 617 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 618 TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_prm_abort), \
1da177e4 619 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 620 TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_prm_abort), \
1da177e4 621 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 622 TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
1da177e4 623 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 624 TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_prm_abort), \
1da177e4
LT
625} /* TYPE_SCTP_PRIMITIVE_ABORT */
626
627#define TYPE_SCTP_PRIMITIVE_SEND { \
1da177e4 628 /* SCTP_STATE_CLOSED */ \
1ed176a8 629 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 630 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 631 TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
1da177e4 632 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 633 TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
1da177e4 634 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 635 TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
1da177e4 636 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 637 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
1da177e4 638 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 639 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
1da177e4 640 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 641 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
1da177e4 642 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 643 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
1da177e4
LT
644} /* TYPE_SCTP_PRIMITIVE_SEND */
645
646#define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \
1da177e4 647 /* SCTP_STATE_CLOSED */ \
1ed176a8 648 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 649 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 650 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 651 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 652 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 653 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 654 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 655 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 656 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 657 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 658 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 659 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 660 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 661 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 662 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4
LT
663} /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
664
665#define TYPE_SCTP_PRIMITIVE_ASCONF { \
1da177e4 666 /* SCTP_STATE_CLOSED */ \
1ed176a8 667 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 668 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 669 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 670 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 671 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 672 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 673 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
1da177e4 674 /* SCTP_STATE_SHUTDOWN_PENDING */ \
ba8a06da 675 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
1da177e4 676 /* SCTP_STATE_SHUTDOWN_SENT */ \
ba8a06da 677 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
1da177e4 678 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
ba8a06da 679 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
1da177e4 680 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 681 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
4553e88d 682} /* TYPE_SCTP_PRIMITIVE_ASCONF */
1da177e4 683
7a090b04
XL
684#define TYPE_SCTP_PRIMITIVE_RECONF { \
685 /* SCTP_STATE_CLOSED */ \
686 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
687 /* SCTP_STATE_COOKIE_WAIT */ \
688 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
689 /* SCTP_STATE_COOKIE_ECHOED */ \
690 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
691 /* SCTP_STATE_ESTABLISHED */ \
692 TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
693 /* SCTP_STATE_SHUTDOWN_PENDING */ \
694 TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
695 /* SCTP_STATE_SHUTDOWN_SENT */ \
696 TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
697 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
698 TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
699 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
700 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
701} /* TYPE_SCTP_PRIMITIVE_RECONF */
702
1da177e4
LT
703/* The primary index for this table is the primitive type.
704 * The secondary index for this table is the state.
705 */
8ee821ae
XL
706static const struct sctp_sm_table_entry
707primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = {
1da177e4
LT
708 TYPE_SCTP_PRIMITIVE_ASSOCIATE,
709 TYPE_SCTP_PRIMITIVE_SHUTDOWN,
710 TYPE_SCTP_PRIMITIVE_ABORT,
711 TYPE_SCTP_PRIMITIVE_SEND,
712 TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
713 TYPE_SCTP_PRIMITIVE_ASCONF,
7a090b04 714 TYPE_SCTP_PRIMITIVE_RECONF,
1da177e4
LT
715};
716
717#define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
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 */ \
e1cdd553 725 TYPE_SCTP_FUNC(sctp_sf_do_no_pending_tsn), \
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 { \
1da177e4 737 /* SCTP_STATE_CLOSED */ \
1ed176a8 738 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 739 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 740 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_icmp_abort), \
1da177e4 741 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 742 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 743 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 744 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 745 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 746 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 747 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 748 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 749 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 750 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 751 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 752 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4
LT
753}
754
8ee821ae
XL
755static const struct sctp_sm_table_entry
756other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = {
1da177e4
LT
757 TYPE_SCTP_OTHER_NO_PENDING_TSN,
758 TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH,
759};
760
761#define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
1da177e4 762 /* SCTP_STATE_CLOSED */ \
1ed176a8 763 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 764 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 765 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 766 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 767 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 768 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 769 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 770 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 771 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 772 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 773 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 774 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 775 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 776 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 777 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4
LT
778}
779
780#define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
1da177e4 781 /* SCTP_STATE_CLOSED */ \
1ed176a8 782 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 783 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 784 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 785 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 786 TYPE_SCTP_FUNC(sctp_sf_t1_cookie_timer_expire), \
1da177e4 787 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 788 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 789 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 790 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 791 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 792 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 793 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 794 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 795 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 796 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
797}
798
799#define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
1da177e4 800 /* SCTP_STATE_CLOSED */ \
1ed176a8 801 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 802 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 803 TYPE_SCTP_FUNC(sctp_sf_t1_init_timer_expire), \
1da177e4 804 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 805 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 806 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 807 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 808 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 809 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 810 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 811 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 812 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 813 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 814 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 815 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
816}
817
818#define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
1da177e4 819 /* SCTP_STATE_CLOSED */ \
1ed176a8 820 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 821 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 822 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 823 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 824 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 825 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 826 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 827 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 828 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 829 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 830 TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
1da177e4 831 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 832 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 833 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 834 TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
1da177e4
LT
835}
836
837#define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
1da177e4 838 /* SCTP_STATE_CLOSED */ \
1ed176a8 839 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 840 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 841 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 842 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 843 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
1da177e4 844 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 845 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
1da177e4 846 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 847 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
1da177e4 848 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 849 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 850 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 851 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
1da177e4 852 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 853 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
854}
855
856#define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
1da177e4 857 /* SCTP_STATE_CLOSED */ \
1ed176a8 858 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 859 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 860 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 861 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 862 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 863 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 864 TYPE_SCTP_FUNC(sctp_sf_t4_timer_expire), \
1da177e4 865 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 866 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 867 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 868 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 869 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 870 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 871 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 872 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
873}
874
875#define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
1da177e4 876 /* SCTP_STATE_CLOSED */ \
1ed176a8 877 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 878 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 879 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 880 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 881 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 882 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 883 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 884 /* SCTP_STATE_SHUTDOWN_PENDING */ \
f8d96052 885 TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
1da177e4 886 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 887 TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
1da177e4 888 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 889 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 890 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 891 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
892}
893
894#define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
1da177e4 895 /* SCTP_STATE_CLOSED */ \
1ed176a8 896 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 897 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 898 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 899 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 900 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 901 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 902 TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
1da177e4 903 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 904 TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
1da177e4 905 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 906 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 907 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 908 TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
1da177e4 909 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 910 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
911}
912
913#define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
1da177e4 914 /* SCTP_STATE_CLOSED */ \
1ed176a8 915 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 916 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 917 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 918 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 919 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 920 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 921 TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
1da177e4 922 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 923 TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
1da177e4 924 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 925 TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
1da177e4 926 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 927 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 928 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 929 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
930}
931
932#define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
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_autoclose_timer_expire), \
1da177e4 941 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 942 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 943 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 944 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
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
7b9438de
XL
951#define TYPE_SCTP_EVENT_TIMEOUT_RECONF { \
952 /* SCTP_STATE_CLOSED */ \
953 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
954 /* SCTP_STATE_COOKIE_WAIT */ \
955 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
956 /* SCTP_STATE_COOKIE_ECHOED */ \
957 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
958 /* SCTP_STATE_ESTABLISHED */ \
959 TYPE_SCTP_FUNC(sctp_sf_send_reconf), \
960 /* SCTP_STATE_SHUTDOWN_PENDING */ \
961 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
962 /* SCTP_STATE_SHUTDOWN_SENT */ \
963 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
964 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
965 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
966 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
967 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
968}
969
92548ec2
XL
970#define TYPE_SCTP_EVENT_TIMEOUT_PROBE { \
971 /* SCTP_STATE_CLOSED */ \
972 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
973 /* SCTP_STATE_COOKIE_WAIT */ \
974 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
975 /* SCTP_STATE_COOKIE_ECHOED */ \
976 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
977 /* SCTP_STATE_ESTABLISHED */ \
978 TYPE_SCTP_FUNC(sctp_sf_send_probe), \
979 /* SCTP_STATE_SHUTDOWN_PENDING */ \
980 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
981 /* SCTP_STATE_SHUTDOWN_SENT */ \
982 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
983 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
984 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
985 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
986 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
987}
988
8ee821ae
XL
989static const struct sctp_sm_table_entry
990timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
1da177e4
LT
991 TYPE_SCTP_EVENT_TIMEOUT_NONE,
992 TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
993 TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
994 TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
995 TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
996 TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
997 TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
998 TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
7b9438de 999 TYPE_SCTP_EVENT_TIMEOUT_RECONF,
92548ec2 1000 TYPE_SCTP_EVENT_TIMEOUT_PROBE,
1da177e4
LT
1001 TYPE_SCTP_EVENT_TIMEOUT_SACK,
1002 TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
1003};
1004
8ee821ae 1005static const struct sctp_sm_table_entry *sctp_chunk_event_lookup(
52106019
XL
1006 struct net *net,
1007 enum sctp_cid cid,
1008 enum sctp_state state)
1da177e4
LT
1009{
1010 if (state > SCTP_STATE_MAX)
1011 return &bug;
1012
0fc2ea92 1013 if (cid == SCTP_CID_I_DATA)
9d4ceaf1
XL
1014 cid = SCTP_CID_DATA;
1015
75202e76 1016 if (cid <= SCTP_CID_BASE_MAX)
1da177e4
LT
1017 return &chunk_event_table[cid][state];
1018
2f757634
XL
1019 switch ((u16)cid) {
1020 case SCTP_CID_FWD_TSN:
1021 case SCTP_CID_I_FWD_TSN:
1022 return &prsctp_chunk_event_table[0][state];
1da177e4 1023
2f757634
XL
1024 case SCTP_CID_ASCONF:
1025 return &addip_chunk_event_table[0][state];
1da177e4 1026
2f757634
XL
1027 case SCTP_CID_ASCONF_ACK:
1028 return &addip_chunk_event_table[1][state];
1da177e4 1029
2f757634
XL
1030 case SCTP_CID_RECONF:
1031 return &reconf_chunk_event_table[0][state];
d884aa63 1032
2f757634
XL
1033 case SCTP_CID_AUTH:
1034 return &auth_chunk_event_table[0][state];
745a3211
XL
1035
1036 case SCTP_CID_PAD:
1037 return &pad_chunk_event_table[state];
bbd0d598
VY
1038 }
1039
1da177e4
LT
1040 return &chunk_event_table_unknown[state];
1041}