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