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