1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* SCTP kernel implementation 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 * 9 * This file is part of the SCTP kernel implementation 10 * 11 * These are the state tables for the SCTP state machine. 12 * 13 * Please send any bug reports or fixes you make to the 14 * email address(es): 15 * lksctp developers <linux-sctp@vger.kernel.org> 16 * 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> 25 */ 26 27 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 28 29 #include <linux/skbuff.h> 30 #include <net/sctp/sctp.h> 31 #include <net/sctp/sm.h> 32 33 static const struct sctp_sm_table_entry 34 primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES]; 35 static const struct sctp_sm_table_entry 36 other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES]; 37 static const struct sctp_sm_table_entry 38 timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES]; 39 40 static const struct sctp_sm_table_entry *sctp_chunk_event_lookup( 41 struct net *net, 42 enum sctp_cid cid, 43 enum sctp_state state); 44 45 46 static const struct sctp_sm_table_entry bug = { 47 .fn = sctp_sf_bug, 48 .name = "sctp_sf_bug" 49 }; 50 51 #define DO_LOOKUP(_max, _type, _table) \ 52 ({ \ 53 const struct sctp_sm_table_entry *rtn; \ 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); \ 58 rtn = &bug; \ 59 } else \ 60 rtn = &_table[event_subtype._type][(int)state]; \ 61 \ 62 rtn; \ 63 }) 64 65 const struct sctp_sm_table_entry *sctp_sm_lookup_event( 66 struct net *net, 67 enum sctp_event_type event_type, 68 enum sctp_state state, 69 union sctp_subtype event_subtype) 70 { 71 switch (event_type) { 72 case SCTP_EVENT_T_CHUNK: 73 return sctp_chunk_event_lookup(net, event_subtype.chunk, state); 74 case SCTP_EVENT_T_TIMEOUT: 75 return DO_LOOKUP(SCTP_EVENT_TIMEOUT_MAX, timeout, 76 timeout_event_table); 77 case SCTP_EVENT_T_OTHER: 78 return DO_LOOKUP(SCTP_EVENT_OTHER_MAX, other, 79 other_event_table); 80 case SCTP_EVENT_T_PRIMITIVE: 81 return DO_LOOKUP(SCTP_EVENT_PRIMITIVE_MAX, primitive, 82 primitive_event_table); 83 default: 84 /* Yikes! We got an illegal event type. */ 85 return &bug; 86 } 87 } 88 89 #define TYPE_SCTP_FUNC(func) {.fn = func, .name = #func} 90 91 #define TYPE_SCTP_DATA { \ 92 /* SCTP_STATE_CLOSED */ \ 93 TYPE_SCTP_FUNC(sctp_sf_ootb), \ 94 /* SCTP_STATE_COOKIE_WAIT */ \ 95 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 96 /* SCTP_STATE_COOKIE_ECHOED */ \ 97 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 98 /* SCTP_STATE_ESTABLISHED */ \ 99 TYPE_SCTP_FUNC(sctp_sf_eat_data_6_2), \ 100 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 101 TYPE_SCTP_FUNC(sctp_sf_eat_data_6_2), \ 102 /* SCTP_STATE_SHUTDOWN_SENT */ \ 103 TYPE_SCTP_FUNC(sctp_sf_eat_data_fast_4_4), \ 104 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 105 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 106 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 107 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 108 } /* TYPE_SCTP_DATA */ 109 110 #define TYPE_SCTP_INIT { \ 111 /* SCTP_STATE_CLOSED */ \ 112 TYPE_SCTP_FUNC(sctp_sf_do_5_1B_init), \ 113 /* SCTP_STATE_COOKIE_WAIT */ \ 114 TYPE_SCTP_FUNC(sctp_sf_do_5_2_1_siminit), \ 115 /* SCTP_STATE_COOKIE_ECHOED */ \ 116 TYPE_SCTP_FUNC(sctp_sf_do_5_2_1_siminit), \ 117 /* SCTP_STATE_ESTABLISHED */ \ 118 TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \ 119 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 120 TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \ 121 /* SCTP_STATE_SHUTDOWN_SENT */ \ 122 TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \ 123 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 124 TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \ 125 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 126 TYPE_SCTP_FUNC(sctp_sf_do_9_2_reshutack), \ 127 } /* TYPE_SCTP_INIT */ 128 129 #define TYPE_SCTP_INIT_ACK { \ 130 /* SCTP_STATE_CLOSED */ \ 131 TYPE_SCTP_FUNC(sctp_sf_do_5_2_3_initack), \ 132 /* SCTP_STATE_COOKIE_WAIT */ \ 133 TYPE_SCTP_FUNC(sctp_sf_do_5_1C_ack), \ 134 /* SCTP_STATE_COOKIE_ECHOED */ \ 135 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 136 /* SCTP_STATE_ESTABLISHED */ \ 137 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 138 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 139 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 140 /* SCTP_STATE_SHUTDOWN_SENT */ \ 141 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 142 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 143 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 144 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 145 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 146 } /* TYPE_SCTP_INIT_ACK */ 147 148 #define TYPE_SCTP_SACK { \ 149 /* SCTP_STATE_CLOSED */ \ 150 TYPE_SCTP_FUNC(sctp_sf_ootb), \ 151 /* SCTP_STATE_COOKIE_WAIT */ \ 152 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 153 /* SCTP_STATE_COOKIE_ECHOED */ \ 154 TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \ 155 /* SCTP_STATE_ESTABLISHED */ \ 156 TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \ 157 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 158 TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \ 159 /* SCTP_STATE_SHUTDOWN_SENT */ \ 160 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 161 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 162 TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \ 163 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 164 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 165 } /* TYPE_SCTP_SACK */ 166 167 #define TYPE_SCTP_HEARTBEAT { \ 168 /* SCTP_STATE_CLOSED */ \ 169 TYPE_SCTP_FUNC(sctp_sf_ootb), \ 170 /* SCTP_STATE_COOKIE_WAIT */ \ 171 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 172 /* SCTP_STATE_COOKIE_ECHOED */ \ 173 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ 174 /* SCTP_STATE_ESTABLISHED */ \ 175 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ 176 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 177 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ 178 /* SCTP_STATE_SHUTDOWN_SENT */ \ 179 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ 180 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 181 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ 182 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 183 /* This should not happen, but we are nice. */ \ 184 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ 185 } /* TYPE_SCTP_HEARTBEAT */ 186 187 #define TYPE_SCTP_HEARTBEAT_ACK { \ 188 /* SCTP_STATE_CLOSED */ \ 189 TYPE_SCTP_FUNC(sctp_sf_ootb), \ 190 /* SCTP_STATE_COOKIE_WAIT */ \ 191 TYPE_SCTP_FUNC(sctp_sf_violation), \ 192 /* SCTP_STATE_COOKIE_ECHOED */ \ 193 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 194 /* SCTP_STATE_ESTABLISHED */ \ 195 TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \ 196 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 197 TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \ 198 /* SCTP_STATE_SHUTDOWN_SENT */ \ 199 TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \ 200 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 201 TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \ 202 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 203 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 204 } /* TYPE_SCTP_HEARTBEAT_ACK */ 205 206 #define TYPE_SCTP_ABORT { \ 207 /* SCTP_STATE_CLOSED */ \ 208 TYPE_SCTP_FUNC(sctp_sf_pdiscard), \ 209 /* SCTP_STATE_COOKIE_WAIT */ \ 210 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_abort), \ 211 /* SCTP_STATE_COOKIE_ECHOED */ \ 212 TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_abort), \ 213 /* SCTP_STATE_ESTABLISHED */ \ 214 TYPE_SCTP_FUNC(sctp_sf_do_9_1_abort), \ 215 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 216 TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_abort), \ 217 /* SCTP_STATE_SHUTDOWN_SENT */ \ 218 TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_abort), \ 219 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 220 TYPE_SCTP_FUNC(sctp_sf_do_9_1_abort), \ 221 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 222 TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_abort), \ 223 } /* TYPE_SCTP_ABORT */ 224 225 #define TYPE_SCTP_SHUTDOWN { \ 226 /* SCTP_STATE_CLOSED */ \ 227 TYPE_SCTP_FUNC(sctp_sf_ootb), \ 228 /* SCTP_STATE_COOKIE_WAIT */ \ 229 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 230 /* SCTP_STATE_COOKIE_ECHOED */ \ 231 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 232 /* SCTP_STATE_ESTABLISHED */ \ 233 TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown), \ 234 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 235 TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown), \ 236 /* SCTP_STATE_SHUTDOWN_SENT */ \ 237 TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \ 238 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 239 TYPE_SCTP_FUNC(sctp_sf_do_9_2_shut_ctsn), \ 240 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 241 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 242 } /* TYPE_SCTP_SHUTDOWN */ 243 244 #define TYPE_SCTP_SHUTDOWN_ACK { \ 245 /* SCTP_STATE_CLOSED */ \ 246 TYPE_SCTP_FUNC(sctp_sf_ootb), \ 247 /* SCTP_STATE_COOKIE_WAIT */ \ 248 TYPE_SCTP_FUNC(sctp_sf_do_8_5_1_E_sa), \ 249 /* SCTP_STATE_COOKIE_ECHOED */ \ 250 TYPE_SCTP_FUNC(sctp_sf_do_8_5_1_E_sa), \ 251 /* SCTP_STATE_ESTABLISHED */ \ 252 TYPE_SCTP_FUNC(sctp_sf_violation), \ 253 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 254 TYPE_SCTP_FUNC(sctp_sf_violation), \ 255 /* SCTP_STATE_SHUTDOWN_SENT */ \ 256 TYPE_SCTP_FUNC(sctp_sf_do_9_2_final), \ 257 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 258 TYPE_SCTP_FUNC(sctp_sf_violation), \ 259 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 260 TYPE_SCTP_FUNC(sctp_sf_do_9_2_final), \ 261 } /* TYPE_SCTP_SHUTDOWN_ACK */ 262 263 #define TYPE_SCTP_ERROR { \ 264 /* SCTP_STATE_CLOSED */ \ 265 TYPE_SCTP_FUNC(sctp_sf_ootb), \ 266 /* SCTP_STATE_COOKIE_WAIT */ \ 267 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 268 /* SCTP_STATE_COOKIE_ECHOED */ \ 269 TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_err), \ 270 /* SCTP_STATE_ESTABLISHED */ \ 271 TYPE_SCTP_FUNC(sctp_sf_operr_notify), \ 272 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 273 TYPE_SCTP_FUNC(sctp_sf_operr_notify), \ 274 /* SCTP_STATE_SHUTDOWN_SENT */ \ 275 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 276 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 277 TYPE_SCTP_FUNC(sctp_sf_operr_notify), \ 278 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 279 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 280 } /* TYPE_SCTP_ERROR */ 281 282 #define TYPE_SCTP_COOKIE_ECHO { \ 283 /* SCTP_STATE_CLOSED */ \ 284 TYPE_SCTP_FUNC(sctp_sf_do_5_1D_ce), \ 285 /* SCTP_STATE_COOKIE_WAIT */ \ 286 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ 287 /* SCTP_STATE_COOKIE_ECHOED */ \ 288 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ 289 /* SCTP_STATE_ESTABLISHED */ \ 290 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ 291 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 292 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ 293 /* SCTP_STATE_SHUTDOWN_SENT */ \ 294 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ 295 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 296 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ 297 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 298 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ 299 } /* TYPE_SCTP_COOKIE_ECHO */ 300 301 #define TYPE_SCTP_COOKIE_ACK { \ 302 /* SCTP_STATE_CLOSED */ \ 303 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 304 /* SCTP_STATE_COOKIE_WAIT */ \ 305 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 306 /* SCTP_STATE_COOKIE_ECHOED */ \ 307 TYPE_SCTP_FUNC(sctp_sf_do_5_1E_ca), \ 308 /* SCTP_STATE_ESTABLISHED */ \ 309 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 310 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 311 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 312 /* SCTP_STATE_SHUTDOWN_SENT */ \ 313 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 314 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 315 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 316 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 317 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 318 } /* TYPE_SCTP_COOKIE_ACK */ 319 320 #define TYPE_SCTP_ECN_ECNE { \ 321 /* SCTP_STATE_CLOSED */ \ 322 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 323 /* SCTP_STATE_COOKIE_WAIT */ \ 324 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 325 /* SCTP_STATE_COOKIE_ECHOED */ \ 326 TYPE_SCTP_FUNC(sctp_sf_do_ecne), \ 327 /* SCTP_STATE_ESTABLISHED */ \ 328 TYPE_SCTP_FUNC(sctp_sf_do_ecne), \ 329 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 330 TYPE_SCTP_FUNC(sctp_sf_do_ecne), \ 331 /* SCTP_STATE_SHUTDOWN_SENT */ \ 332 TYPE_SCTP_FUNC(sctp_sf_do_ecne), \ 333 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 334 TYPE_SCTP_FUNC(sctp_sf_do_ecne), \ 335 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 336 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 337 } /* TYPE_SCTP_ECN_ECNE */ 338 339 #define TYPE_SCTP_ECN_CWR { \ 340 /* SCTP_STATE_CLOSED */ \ 341 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 342 /* SCTP_STATE_COOKIE_WAIT */ \ 343 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 344 /* SCTP_STATE_COOKIE_ECHOED */ \ 345 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 346 /* SCTP_STATE_ESTABLISHED */ \ 347 TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \ 348 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 349 TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \ 350 /* SCTP_STATE_SHUTDOWN_SENT */ \ 351 TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \ 352 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 353 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 354 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 355 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 356 } /* TYPE_SCTP_ECN_CWR */ 357 358 #define TYPE_SCTP_SHUTDOWN_COMPLETE { \ 359 /* SCTP_STATE_CLOSED */ \ 360 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 361 /* SCTP_STATE_COOKIE_WAIT */ \ 362 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 363 /* SCTP_STATE_COOKIE_ECHOED */ \ 364 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 365 /* SCTP_STATE_ESTABLISHED */ \ 366 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 367 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 368 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 369 /* SCTP_STATE_SHUTDOWN_SENT */ \ 370 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 371 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 372 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 373 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 374 TYPE_SCTP_FUNC(sctp_sf_do_4_C), \ 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 */ 382 static const struct sctp_sm_table_entry 383 chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { 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 { \ 402 /* SCTP_STATE_CLOSED */ \ 403 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 404 /* SCTP_STATE_COOKIE_WAIT */ \ 405 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 406 /* SCTP_STATE_COOKIE_ECHOED */ \ 407 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 408 /* SCTP_STATE_ESTABLISHED */ \ 409 TYPE_SCTP_FUNC(sctp_sf_do_asconf), \ 410 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 411 TYPE_SCTP_FUNC(sctp_sf_do_asconf), \ 412 /* SCTP_STATE_SHUTDOWN_SENT */ \ 413 TYPE_SCTP_FUNC(sctp_sf_do_asconf), \ 414 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 415 TYPE_SCTP_FUNC(sctp_sf_do_asconf), \ 416 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 417 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 418 } /* TYPE_SCTP_ASCONF */ 419 420 #define TYPE_SCTP_ASCONF_ACK { \ 421 /* SCTP_STATE_CLOSED */ \ 422 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 423 /* SCTP_STATE_COOKIE_WAIT */ \ 424 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 425 /* SCTP_STATE_COOKIE_ECHOED */ \ 426 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 427 /* SCTP_STATE_ESTABLISHED */ \ 428 TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \ 429 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 430 TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \ 431 /* SCTP_STATE_SHUTDOWN_SENT */ \ 432 TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \ 433 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 434 TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \ 435 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 436 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 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 */ 442 static const struct sctp_sm_table_entry 443 addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { 444 TYPE_SCTP_ASCONF, 445 TYPE_SCTP_ASCONF_ACK, 446 }; /*state_fn_t addip_chunk_event_table[][] */ 447 448 #define TYPE_SCTP_FWD_TSN { \ 449 /* SCTP_STATE_CLOSED */ \ 450 TYPE_SCTP_FUNC(sctp_sf_ootb), \ 451 /* SCTP_STATE_COOKIE_WAIT */ \ 452 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 453 /* SCTP_STATE_COOKIE_ECHOED */ \ 454 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 455 /* SCTP_STATE_ESTABLISHED */ \ 456 TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \ 457 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 458 TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \ 459 /* SCTP_STATE_SHUTDOWN_SENT */ \ 460 TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn_fast), \ 461 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 462 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 463 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 464 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ 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 */ 470 static const struct sctp_sm_table_entry 471 prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { 472 TYPE_SCTP_FWD_TSN, 473 }; /*state_fn_t prsctp_chunk_event_table[][] */ 474 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 */ 497 static const struct sctp_sm_table_entry 498 reconf_chunk_event_table[SCTP_NUM_RECONF_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { 499 TYPE_SCTP_RECONF, 500 }; /*state_fn_t reconf_chunk_event_table[][] */ 501 502 #define TYPE_SCTP_AUTH { \ 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 */ 524 static const struct sctp_sm_table_entry 525 auth_chunk_event_table[SCTP_NUM_AUTH_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { 526 TYPE_SCTP_AUTH, 527 }; /*state_fn_t auth_chunk_event_table[][] */ 528 529 static const struct sctp_sm_table_entry 530 pad_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 549 static const struct sctp_sm_table_entry 550 chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = { 551 /* SCTP_STATE_CLOSED */ 552 TYPE_SCTP_FUNC(sctp_sf_ootb), 553 /* SCTP_STATE_COOKIE_WAIT */ 554 TYPE_SCTP_FUNC(sctp_sf_unk_chunk), 555 /* SCTP_STATE_COOKIE_ECHOED */ 556 TYPE_SCTP_FUNC(sctp_sf_unk_chunk), 557 /* SCTP_STATE_ESTABLISHED */ 558 TYPE_SCTP_FUNC(sctp_sf_unk_chunk), 559 /* SCTP_STATE_SHUTDOWN_PENDING */ 560 TYPE_SCTP_FUNC(sctp_sf_unk_chunk), 561 /* SCTP_STATE_SHUTDOWN_SENT */ 562 TYPE_SCTP_FUNC(sctp_sf_unk_chunk), 563 /* SCTP_STATE_SHUTDOWN_RECEIVED */ 564 TYPE_SCTP_FUNC(sctp_sf_unk_chunk), 565 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ 566 TYPE_SCTP_FUNC(sctp_sf_unk_chunk), 567 }; /* chunk unknown */ 568 569 570 #define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \ 571 /* SCTP_STATE_CLOSED */ \ 572 TYPE_SCTP_FUNC(sctp_sf_do_prm_asoc), \ 573 /* SCTP_STATE_COOKIE_WAIT */ \ 574 TYPE_SCTP_FUNC(sctp_sf_not_impl), \ 575 /* SCTP_STATE_COOKIE_ECHOED */ \ 576 TYPE_SCTP_FUNC(sctp_sf_not_impl), \ 577 /* SCTP_STATE_ESTABLISHED */ \ 578 TYPE_SCTP_FUNC(sctp_sf_not_impl), \ 579 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 580 TYPE_SCTP_FUNC(sctp_sf_not_impl), \ 581 /* SCTP_STATE_SHUTDOWN_SENT */ \ 582 TYPE_SCTP_FUNC(sctp_sf_not_impl), \ 583 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 584 TYPE_SCTP_FUNC(sctp_sf_not_impl), \ 585 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 586 TYPE_SCTP_FUNC(sctp_sf_not_impl), \ 587 } /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */ 588 589 #define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \ 590 /* SCTP_STATE_CLOSED */ \ 591 TYPE_SCTP_FUNC(sctp_sf_error_closed), \ 592 /* SCTP_STATE_COOKIE_WAIT */ \ 593 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_shutdown), \ 594 /* SCTP_STATE_COOKIE_ECHOED */ \ 595 TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_shutdown),\ 596 /* SCTP_STATE_ESTABLISHED */ \ 597 TYPE_SCTP_FUNC(sctp_sf_do_9_2_prm_shutdown), \ 598 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 599 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \ 600 /* SCTP_STATE_SHUTDOWN_SENT */ \ 601 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \ 602 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 603 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \ 604 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 605 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \ 606 } /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */ 607 608 #define TYPE_SCTP_PRIMITIVE_ABORT { \ 609 /* SCTP_STATE_CLOSED */ \ 610 TYPE_SCTP_FUNC(sctp_sf_error_closed), \ 611 /* SCTP_STATE_COOKIE_WAIT */ \ 612 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_abort), \ 613 /* SCTP_STATE_COOKIE_ECHOED */ \ 614 TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_abort), \ 615 /* SCTP_STATE_ESTABLISHED */ \ 616 TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \ 617 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 618 TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_prm_abort), \ 619 /* SCTP_STATE_SHUTDOWN_SENT */ \ 620 TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_prm_abort), \ 621 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 622 TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \ 623 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 624 TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_prm_abort), \ 625 } /* TYPE_SCTP_PRIMITIVE_ABORT */ 626 627 #define TYPE_SCTP_PRIMITIVE_SEND { \ 628 /* SCTP_STATE_CLOSED */ \ 629 TYPE_SCTP_FUNC(sctp_sf_error_closed), \ 630 /* SCTP_STATE_COOKIE_WAIT */ \ 631 TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \ 632 /* SCTP_STATE_COOKIE_ECHOED */ \ 633 TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \ 634 /* SCTP_STATE_ESTABLISHED */ \ 635 TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \ 636 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 637 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \ 638 /* SCTP_STATE_SHUTDOWN_SENT */ \ 639 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \ 640 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 641 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \ 642 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 643 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \ 644 } /* TYPE_SCTP_PRIMITIVE_SEND */ 645 646 #define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \ 647 /* SCTP_STATE_CLOSED */ \ 648 TYPE_SCTP_FUNC(sctp_sf_error_closed), \ 649 /* SCTP_STATE_COOKIE_WAIT */ \ 650 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ 651 /* SCTP_STATE_COOKIE_ECHOED */ \ 652 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ 653 /* SCTP_STATE_ESTABLISHED */ \ 654 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ 655 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 656 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ 657 /* SCTP_STATE_SHUTDOWN_SENT */ \ 658 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ 659 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 660 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ 661 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 662 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ 663 } /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */ 664 665 #define TYPE_SCTP_PRIMITIVE_ASCONF { \ 666 /* SCTP_STATE_CLOSED */ \ 667 TYPE_SCTP_FUNC(sctp_sf_error_closed), \ 668 /* SCTP_STATE_COOKIE_WAIT */ \ 669 TYPE_SCTP_FUNC(sctp_sf_error_closed), \ 670 /* SCTP_STATE_COOKIE_ECHOED */ \ 671 TYPE_SCTP_FUNC(sctp_sf_error_closed), \ 672 /* SCTP_STATE_ESTABLISHED */ \ 673 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \ 674 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 675 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \ 676 /* SCTP_STATE_SHUTDOWN_SENT */ \ 677 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \ 678 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 679 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \ 680 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 681 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \ 682 } /* TYPE_SCTP_PRIMITIVE_ASCONF */ 683 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 703 /* The primary index for this table is the primitive type. 704 * The secondary index for this table is the state. 705 */ 706 static const struct sctp_sm_table_entry 707 primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = { 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, 714 TYPE_SCTP_PRIMITIVE_RECONF, 715 }; 716 717 #define TYPE_SCTP_OTHER_NO_PENDING_TSN { \ 718 /* SCTP_STATE_CLOSED */ \ 719 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 720 /* SCTP_STATE_COOKIE_WAIT */ \ 721 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 722 /* SCTP_STATE_COOKIE_ECHOED */ \ 723 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 724 /* SCTP_STATE_ESTABLISHED */ \ 725 TYPE_SCTP_FUNC(sctp_sf_do_no_pending_tsn), \ 726 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 727 TYPE_SCTP_FUNC(sctp_sf_do_9_2_start_shutdown), \ 728 /* SCTP_STATE_SHUTDOWN_SENT */ \ 729 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 730 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 731 TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \ 732 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 733 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 734 } 735 736 #define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH { \ 737 /* SCTP_STATE_CLOSED */ \ 738 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 739 /* SCTP_STATE_COOKIE_WAIT */ \ 740 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_icmp_abort), \ 741 /* SCTP_STATE_COOKIE_ECHOED */ \ 742 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 743 /* SCTP_STATE_ESTABLISHED */ \ 744 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 745 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 746 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 747 /* SCTP_STATE_SHUTDOWN_SENT */ \ 748 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 749 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 750 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 751 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 752 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ 753 } 754 755 static const struct sctp_sm_table_entry 756 other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = { 757 TYPE_SCTP_OTHER_NO_PENDING_TSN, 758 TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH, 759 }; 760 761 #define TYPE_SCTP_EVENT_TIMEOUT_NONE { \ 762 /* SCTP_STATE_CLOSED */ \ 763 TYPE_SCTP_FUNC(sctp_sf_bug), \ 764 /* SCTP_STATE_COOKIE_WAIT */ \ 765 TYPE_SCTP_FUNC(sctp_sf_bug), \ 766 /* SCTP_STATE_COOKIE_ECHOED */ \ 767 TYPE_SCTP_FUNC(sctp_sf_bug), \ 768 /* SCTP_STATE_ESTABLISHED */ \ 769 TYPE_SCTP_FUNC(sctp_sf_bug), \ 770 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 771 TYPE_SCTP_FUNC(sctp_sf_bug), \ 772 /* SCTP_STATE_SHUTDOWN_SENT */ \ 773 TYPE_SCTP_FUNC(sctp_sf_bug), \ 774 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 775 TYPE_SCTP_FUNC(sctp_sf_bug), \ 776 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 777 TYPE_SCTP_FUNC(sctp_sf_bug), \ 778 } 779 780 #define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \ 781 /* SCTP_STATE_CLOSED */ \ 782 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 783 /* SCTP_STATE_COOKIE_WAIT */ \ 784 TYPE_SCTP_FUNC(sctp_sf_bug), \ 785 /* SCTP_STATE_COOKIE_ECHOED */ \ 786 TYPE_SCTP_FUNC(sctp_sf_t1_cookie_timer_expire), \ 787 /* SCTP_STATE_ESTABLISHED */ \ 788 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 789 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 790 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 791 /* SCTP_STATE_SHUTDOWN_SENT */ \ 792 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 793 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 794 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 795 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 796 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 797 } 798 799 #define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \ 800 /* SCTP_STATE_CLOSED */ \ 801 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 802 /* SCTP_STATE_COOKIE_WAIT */ \ 803 TYPE_SCTP_FUNC(sctp_sf_t1_init_timer_expire), \ 804 /* SCTP_STATE_COOKIE_ECHOED */ \ 805 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 806 /* SCTP_STATE_ESTABLISHED */ \ 807 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 808 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 809 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 810 /* SCTP_STATE_SHUTDOWN_SENT */ \ 811 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 812 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 813 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 814 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 815 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 816 } 817 818 #define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \ 819 /* SCTP_STATE_CLOSED */ \ 820 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 821 /* SCTP_STATE_COOKIE_WAIT */ \ 822 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 823 /* SCTP_STATE_COOKIE_ECHOED */ \ 824 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 825 /* SCTP_STATE_ESTABLISHED */ \ 826 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 827 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 828 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 829 /* SCTP_STATE_SHUTDOWN_SENT */ \ 830 TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \ 831 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 832 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 833 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 834 TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \ 835 } 836 837 #define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \ 838 /* SCTP_STATE_CLOSED */ \ 839 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 840 /* SCTP_STATE_COOKIE_WAIT */ \ 841 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 842 /* SCTP_STATE_COOKIE_ECHOED */ \ 843 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \ 844 /* SCTP_STATE_ESTABLISHED */ \ 845 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \ 846 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 847 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \ 848 /* SCTP_STATE_SHUTDOWN_SENT */ \ 849 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 850 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 851 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \ 852 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 853 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 854 } 855 856 #define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \ 857 /* SCTP_STATE_CLOSED */ \ 858 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 859 /* SCTP_STATE_COOKIE_WAIT */ \ 860 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 861 /* SCTP_STATE_COOKIE_ECHOED */ \ 862 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 863 /* SCTP_STATE_ESTABLISHED */ \ 864 TYPE_SCTP_FUNC(sctp_sf_t4_timer_expire), \ 865 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 866 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 867 /* SCTP_STATE_SHUTDOWN_SENT */ \ 868 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 869 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 870 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 871 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 872 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 873 } 874 875 #define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \ 876 /* SCTP_STATE_CLOSED */ \ 877 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 878 /* SCTP_STATE_COOKIE_WAIT */ \ 879 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 880 /* SCTP_STATE_COOKIE_ECHOED */ \ 881 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 882 /* SCTP_STATE_ESTABLISHED */ \ 883 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 884 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 885 TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \ 886 /* SCTP_STATE_SHUTDOWN_SENT */ \ 887 TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \ 888 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 889 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 890 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 891 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 892 } 893 894 #define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \ 895 /* SCTP_STATE_CLOSED */ \ 896 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 897 /* SCTP_STATE_COOKIE_WAIT */ \ 898 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 899 /* SCTP_STATE_COOKIE_ECHOED */ \ 900 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 901 /* SCTP_STATE_ESTABLISHED */ \ 902 TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \ 903 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 904 TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \ 905 /* SCTP_STATE_SHUTDOWN_SENT */ \ 906 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 907 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 908 TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \ 909 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 910 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 911 } 912 913 #define TYPE_SCTP_EVENT_TIMEOUT_SACK { \ 914 /* SCTP_STATE_CLOSED */ \ 915 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 916 /* SCTP_STATE_COOKIE_WAIT */ \ 917 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 918 /* SCTP_STATE_COOKIE_ECHOED */ \ 919 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 920 /* SCTP_STATE_ESTABLISHED */ \ 921 TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \ 922 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 923 TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \ 924 /* SCTP_STATE_SHUTDOWN_SENT */ \ 925 TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \ 926 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 927 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 928 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 929 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 930 } 931 932 #define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \ 933 /* SCTP_STATE_CLOSED */ \ 934 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 935 /* SCTP_STATE_COOKIE_WAIT */ \ 936 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 937 /* SCTP_STATE_COOKIE_ECHOED */ \ 938 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 939 /* SCTP_STATE_ESTABLISHED */ \ 940 TYPE_SCTP_FUNC(sctp_sf_autoclose_timer_expire), \ 941 /* SCTP_STATE_SHUTDOWN_PENDING */ \ 942 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 943 /* SCTP_STATE_SHUTDOWN_SENT */ \ 944 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 945 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ 946 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 947 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ 948 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ 949 } 950 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 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 989 static const struct sctp_sm_table_entry 990 timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = { 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, 999 TYPE_SCTP_EVENT_TIMEOUT_RECONF, 1000 TYPE_SCTP_EVENT_TIMEOUT_PROBE, 1001 TYPE_SCTP_EVENT_TIMEOUT_SACK, 1002 TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE, 1003 }; 1004 1005 static const struct sctp_sm_table_entry *sctp_chunk_event_lookup( 1006 struct net *net, 1007 enum sctp_cid cid, 1008 enum sctp_state state) 1009 { 1010 if (state > SCTP_STATE_MAX) 1011 return &bug; 1012 1013 if (cid == SCTP_CID_I_DATA) 1014 cid = SCTP_CID_DATA; 1015 1016 if (cid <= SCTP_CID_BASE_MAX) 1017 return &chunk_event_table[cid][state]; 1018 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]; 1023 1024 case SCTP_CID_ASCONF: 1025 return &addip_chunk_event_table[0][state]; 1026 1027 case SCTP_CID_ASCONF_ACK: 1028 return &addip_chunk_event_table[1][state]; 1029 1030 case SCTP_CID_RECONF: 1031 return &reconf_chunk_event_table[0][state]; 1032 1033 case SCTP_CID_AUTH: 1034 return &auth_chunk_event_table[0][state]; 1035 1036 case SCTP_CID_PAD: 1037 return &pad_chunk_event_table[state]; 1038 } 1039 1040 return &chunk_event_table_unknown[state]; 1041 } 1042