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