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