linux/net/sctp/sm_statetable.c
<<
>>
Prefs
   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
  53static const sctp_sm_table_entry_t
  54primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES];
  55static const sctp_sm_table_entry_t
  56other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES];
  57static const sctp_sm_table_entry_t
  58timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES];
  59
  60static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid,
  61                                                            sctp_state_t state);
  62
  63
  64static 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
  79const 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 */
 430static 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 */
 493static 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 */
 522static 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 */
 550static 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
 554static const sctp_sm_table_entry_t
 555chunk_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_REQUESTHEARTBEAT */
 702
 703/* The primary index for this table is the primitive type.
 704 * The secondary index for this table is the state.
 705 */
 706static 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
 757static 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
 972static 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
 985static 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