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