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