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