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