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
 530chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
 531        /* SCTP_STATE_CLOSED */
 532        TYPE_SCTP_FUNC(sctp_sf_ootb),
 533        /* SCTP_STATE_COOKIE_WAIT */
 534        TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
 535        /* SCTP_STATE_COOKIE_ECHOED */
 536        TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
 537        /* SCTP_STATE_ESTABLISHED */
 538        TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
 539        /* SCTP_STATE_SHUTDOWN_PENDING */
 540        TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
 541        /* SCTP_STATE_SHUTDOWN_SENT */
 542        TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
 543        /* SCTP_STATE_SHUTDOWN_RECEIVED */
 544        TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
 545        /* SCTP_STATE_SHUTDOWN_ACK_SENT */
 546        TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
 547};      /* chunk unknown */
 548
 549
 550#define TYPE_SCTP_PRIMITIVE_ASSOCIATE  { \
 551        /* SCTP_STATE_CLOSED */ \
 552        TYPE_SCTP_FUNC(sctp_sf_do_prm_asoc), \
 553        /* SCTP_STATE_COOKIE_WAIT */ \
 554        TYPE_SCTP_FUNC(sctp_sf_not_impl), \
 555        /* SCTP_STATE_COOKIE_ECHOED */ \
 556        TYPE_SCTP_FUNC(sctp_sf_not_impl), \
 557        /* SCTP_STATE_ESTABLISHED */ \
 558        TYPE_SCTP_FUNC(sctp_sf_not_impl), \
 559        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 560        TYPE_SCTP_FUNC(sctp_sf_not_impl), \
 561        /* SCTP_STATE_SHUTDOWN_SENT */ \
 562        TYPE_SCTP_FUNC(sctp_sf_not_impl), \
 563        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 564        TYPE_SCTP_FUNC(sctp_sf_not_impl), \
 565        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 566        TYPE_SCTP_FUNC(sctp_sf_not_impl), \
 567} /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
 568
 569#define TYPE_SCTP_PRIMITIVE_SHUTDOWN  { \
 570        /* SCTP_STATE_CLOSED */ \
 571        TYPE_SCTP_FUNC(sctp_sf_error_closed), \
 572        /* SCTP_STATE_COOKIE_WAIT */ \
 573        TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_shutdown), \
 574        /* SCTP_STATE_COOKIE_ECHOED */ \
 575        TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_shutdown),\
 576        /* SCTP_STATE_ESTABLISHED */ \
 577        TYPE_SCTP_FUNC(sctp_sf_do_9_2_prm_shutdown), \
 578        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 579        TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
 580        /* SCTP_STATE_SHUTDOWN_SENT */ \
 581        TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
 582        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 583        TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
 584        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 585        TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
 586} /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
 587
 588#define TYPE_SCTP_PRIMITIVE_ABORT  { \
 589        /* SCTP_STATE_CLOSED */ \
 590        TYPE_SCTP_FUNC(sctp_sf_error_closed), \
 591        /* SCTP_STATE_COOKIE_WAIT */ \
 592        TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_abort), \
 593        /* SCTP_STATE_COOKIE_ECHOED */ \
 594        TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_abort), \
 595        /* SCTP_STATE_ESTABLISHED */ \
 596        TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
 597        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 598        TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_prm_abort), \
 599        /* SCTP_STATE_SHUTDOWN_SENT */ \
 600        TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_prm_abort), \
 601        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 602        TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
 603        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 604        TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_prm_abort), \
 605} /* TYPE_SCTP_PRIMITIVE_ABORT */
 606
 607#define TYPE_SCTP_PRIMITIVE_SEND  { \
 608        /* SCTP_STATE_CLOSED */ \
 609        TYPE_SCTP_FUNC(sctp_sf_error_closed), \
 610        /* SCTP_STATE_COOKIE_WAIT */ \
 611        TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
 612        /* SCTP_STATE_COOKIE_ECHOED */ \
 613        TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
 614        /* SCTP_STATE_ESTABLISHED */ \
 615        TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
 616        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 617        TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
 618        /* SCTP_STATE_SHUTDOWN_SENT */ \
 619        TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
 620        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 621        TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
 622        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 623        TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
 624} /* TYPE_SCTP_PRIMITIVE_SEND */
 625
 626#define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT  { \
 627        /* SCTP_STATE_CLOSED */ \
 628        TYPE_SCTP_FUNC(sctp_sf_error_closed), \
 629        /* SCTP_STATE_COOKIE_WAIT */ \
 630        TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
 631        /* SCTP_STATE_COOKIE_ECHOED */ \
 632        TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
 633        /* SCTP_STATE_ESTABLISHED */ \
 634        TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
 635        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 636        TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
 637        /* SCTP_STATE_SHUTDOWN_SENT */ \
 638        TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
 639        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 640        TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
 641        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 642        TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
 643} /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
 644
 645#define TYPE_SCTP_PRIMITIVE_ASCONF { \
 646        /* SCTP_STATE_CLOSED */ \
 647        TYPE_SCTP_FUNC(sctp_sf_error_closed), \
 648        /* SCTP_STATE_COOKIE_WAIT */ \
 649        TYPE_SCTP_FUNC(sctp_sf_error_closed), \
 650        /* SCTP_STATE_COOKIE_ECHOED */ \
 651        TYPE_SCTP_FUNC(sctp_sf_error_closed), \
 652        /* SCTP_STATE_ESTABLISHED */ \
 653        TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
 654        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 655        TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
 656        /* SCTP_STATE_SHUTDOWN_SENT */ \
 657        TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
 658        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 659        TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
 660        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 661        TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
 662} /* TYPE_SCTP_PRIMITIVE_ASCONF */
 663
 664#define TYPE_SCTP_PRIMITIVE_RECONF { \
 665        /* SCTP_STATE_CLOSED */ \
 666        TYPE_SCTP_FUNC(sctp_sf_error_closed), \
 667        /* SCTP_STATE_COOKIE_WAIT */ \
 668        TYPE_SCTP_FUNC(sctp_sf_error_closed), \
 669        /* SCTP_STATE_COOKIE_ECHOED */ \
 670        TYPE_SCTP_FUNC(sctp_sf_error_closed), \
 671        /* SCTP_STATE_ESTABLISHED */ \
 672        TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
 673        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 674        TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
 675        /* SCTP_STATE_SHUTDOWN_SENT */ \
 676        TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
 677        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 678        TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
 679        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 680        TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
 681} /* TYPE_SCTP_PRIMITIVE_RECONF */
 682
 683/* The primary index for this table is the primitive type.
 684 * The secondary index for this table is the state.
 685 */
 686static const struct sctp_sm_table_entry
 687primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = {
 688        TYPE_SCTP_PRIMITIVE_ASSOCIATE,
 689        TYPE_SCTP_PRIMITIVE_SHUTDOWN,
 690        TYPE_SCTP_PRIMITIVE_ABORT,
 691        TYPE_SCTP_PRIMITIVE_SEND,
 692        TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
 693        TYPE_SCTP_PRIMITIVE_ASCONF,
 694        TYPE_SCTP_PRIMITIVE_RECONF,
 695};
 696
 697#define TYPE_SCTP_OTHER_NO_PENDING_TSN  { \
 698        /* SCTP_STATE_CLOSED */ \
 699        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 700        /* SCTP_STATE_COOKIE_WAIT */ \
 701        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 702        /* SCTP_STATE_COOKIE_ECHOED */ \
 703        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 704        /* SCTP_STATE_ESTABLISHED */ \
 705        TYPE_SCTP_FUNC(sctp_sf_do_no_pending_tsn), \
 706        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 707        TYPE_SCTP_FUNC(sctp_sf_do_9_2_start_shutdown), \
 708        /* SCTP_STATE_SHUTDOWN_SENT */ \
 709        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 710        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 711        TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \
 712        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 713        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 714}
 715
 716#define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH  { \
 717        /* SCTP_STATE_CLOSED */ \
 718        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 719        /* SCTP_STATE_COOKIE_WAIT */ \
 720        TYPE_SCTP_FUNC(sctp_sf_cookie_wait_icmp_abort), \
 721        /* SCTP_STATE_COOKIE_ECHOED */ \
 722        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 723        /* SCTP_STATE_ESTABLISHED */ \
 724        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 725        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 726        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 727        /* SCTP_STATE_SHUTDOWN_SENT */ \
 728        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 729        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 730        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 731        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 732        TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
 733}
 734
 735static const struct sctp_sm_table_entry
 736other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = {
 737        TYPE_SCTP_OTHER_NO_PENDING_TSN,
 738        TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH,
 739};
 740
 741#define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
 742        /* SCTP_STATE_CLOSED */ \
 743        TYPE_SCTP_FUNC(sctp_sf_bug), \
 744        /* SCTP_STATE_COOKIE_WAIT */ \
 745        TYPE_SCTP_FUNC(sctp_sf_bug), \
 746        /* SCTP_STATE_COOKIE_ECHOED */ \
 747        TYPE_SCTP_FUNC(sctp_sf_bug), \
 748        /* SCTP_STATE_ESTABLISHED */ \
 749        TYPE_SCTP_FUNC(sctp_sf_bug), \
 750        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 751        TYPE_SCTP_FUNC(sctp_sf_bug), \
 752        /* SCTP_STATE_SHUTDOWN_SENT */ \
 753        TYPE_SCTP_FUNC(sctp_sf_bug), \
 754        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 755        TYPE_SCTP_FUNC(sctp_sf_bug), \
 756        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 757        TYPE_SCTP_FUNC(sctp_sf_bug), \
 758}
 759
 760#define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
 761        /* SCTP_STATE_CLOSED */ \
 762        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 763        /* SCTP_STATE_COOKIE_WAIT */ \
 764        TYPE_SCTP_FUNC(sctp_sf_bug), \
 765        /* SCTP_STATE_COOKIE_ECHOED */ \
 766        TYPE_SCTP_FUNC(sctp_sf_t1_cookie_timer_expire), \
 767        /* SCTP_STATE_ESTABLISHED */ \
 768        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 769        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 770        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 771        /* SCTP_STATE_SHUTDOWN_SENT */ \
 772        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 773        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 774        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 775        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 776        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 777}
 778
 779#define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
 780        /* SCTP_STATE_CLOSED */ \
 781        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 782        /* SCTP_STATE_COOKIE_WAIT */ \
 783        TYPE_SCTP_FUNC(sctp_sf_t1_init_timer_expire), \
 784        /* SCTP_STATE_COOKIE_ECHOED */ \
 785        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 786        /* SCTP_STATE_ESTABLISHED */ \
 787        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 788        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 789        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 790        /* SCTP_STATE_SHUTDOWN_SENT */ \
 791        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 792        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 793        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 794        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 795        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 796}
 797
 798#define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
 799        /* SCTP_STATE_CLOSED */ \
 800        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 801        /* SCTP_STATE_COOKIE_WAIT */ \
 802        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 803        /* SCTP_STATE_COOKIE_ECHOED */ \
 804        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 805        /* SCTP_STATE_ESTABLISHED */ \
 806        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 807        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 808        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 809        /* SCTP_STATE_SHUTDOWN_SENT */ \
 810        TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
 811        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 812        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 813        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 814        TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
 815}
 816
 817#define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
 818        /* SCTP_STATE_CLOSED */ \
 819        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 820        /* SCTP_STATE_COOKIE_WAIT */ \
 821        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 822        /* SCTP_STATE_COOKIE_ECHOED */ \
 823        TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
 824        /* SCTP_STATE_ESTABLISHED */ \
 825        TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
 826        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 827        TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
 828        /* SCTP_STATE_SHUTDOWN_SENT */ \
 829        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 830        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 831        TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
 832        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 833        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 834}
 835
 836#define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
 837        /* SCTP_STATE_CLOSED */ \
 838        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 839        /* SCTP_STATE_COOKIE_WAIT */ \
 840        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 841        /* SCTP_STATE_COOKIE_ECHOED */ \
 842        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 843        /* SCTP_STATE_ESTABLISHED */ \
 844        TYPE_SCTP_FUNC(sctp_sf_t4_timer_expire), \
 845        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 846        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 847        /* SCTP_STATE_SHUTDOWN_SENT */ \
 848        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 849        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 850        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 851        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 852        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 853}
 854
 855#define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
 856        /* SCTP_STATE_CLOSED */ \
 857        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 858        /* SCTP_STATE_COOKIE_WAIT */ \
 859        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 860        /* SCTP_STATE_COOKIE_ECHOED */ \
 861        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 862        /* SCTP_STATE_ESTABLISHED */ \
 863        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 864        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 865        TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
 866        /* SCTP_STATE_SHUTDOWN_SENT */ \
 867        TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
 868        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 869        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 870        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 871        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 872}
 873
 874#define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
 875        /* SCTP_STATE_CLOSED */ \
 876        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 877        /* SCTP_STATE_COOKIE_WAIT */ \
 878        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 879        /* SCTP_STATE_COOKIE_ECHOED */ \
 880        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 881        /* SCTP_STATE_ESTABLISHED */ \
 882        TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
 883        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 884        TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
 885        /* SCTP_STATE_SHUTDOWN_SENT */ \
 886        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 887        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 888        TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
 889        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 890        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 891}
 892
 893#define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
 894        /* SCTP_STATE_CLOSED */ \
 895        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 896        /* SCTP_STATE_COOKIE_WAIT */ \
 897        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 898        /* SCTP_STATE_COOKIE_ECHOED */ \
 899        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 900        /* SCTP_STATE_ESTABLISHED */ \
 901        TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
 902        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 903        TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
 904        /* SCTP_STATE_SHUTDOWN_SENT */ \
 905        TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
 906        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 907        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 908        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 909        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 910}
 911
 912#define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
 913        /* SCTP_STATE_CLOSED */ \
 914        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 915        /* SCTP_STATE_COOKIE_WAIT */ \
 916        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 917        /* SCTP_STATE_COOKIE_ECHOED */ \
 918        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 919        /* SCTP_STATE_ESTABLISHED */ \
 920        TYPE_SCTP_FUNC(sctp_sf_autoclose_timer_expire), \
 921        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 922        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 923        /* SCTP_STATE_SHUTDOWN_SENT */ \
 924        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 925        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 926        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 927        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 928        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 929}
 930
 931#define TYPE_SCTP_EVENT_TIMEOUT_RECONF { \
 932        /* SCTP_STATE_CLOSED */ \
 933        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 934        /* SCTP_STATE_COOKIE_WAIT */ \
 935        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 936        /* SCTP_STATE_COOKIE_ECHOED */ \
 937        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 938        /* SCTP_STATE_ESTABLISHED */ \
 939        TYPE_SCTP_FUNC(sctp_sf_send_reconf), \
 940        /* SCTP_STATE_SHUTDOWN_PENDING */ \
 941        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 942        /* SCTP_STATE_SHUTDOWN_SENT */ \
 943        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 944        /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
 945        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 946        /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
 947        TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
 948}
 949
 950static const struct sctp_sm_table_entry
 951timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
 952        TYPE_SCTP_EVENT_TIMEOUT_NONE,
 953        TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
 954        TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
 955        TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
 956        TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
 957        TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
 958        TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
 959        TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
 960        TYPE_SCTP_EVENT_TIMEOUT_RECONF,
 961        TYPE_SCTP_EVENT_TIMEOUT_SACK,
 962        TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
 963};
 964
 965static const struct sctp_sm_table_entry *sctp_chunk_event_lookup(
 966                                                struct net *net,
 967                                                enum sctp_cid cid,
 968                                                enum sctp_state state)
 969{
 970        if (state > SCTP_STATE_MAX)
 971                return &bug;
 972
 973        if (cid == SCTP_CID_I_DATA)
 974                cid = SCTP_CID_DATA;
 975
 976        if (cid <= SCTP_CID_BASE_MAX)
 977                return &chunk_event_table[cid][state];
 978
 979        if (net->sctp.prsctp_enable) {
 980                if (cid == SCTP_CID_FWD_TSN || cid == SCTP_CID_I_FWD_TSN)
 981                        return &prsctp_chunk_event_table[0][state];
 982        }
 983
 984        if (net->sctp.addip_enable) {
 985                if (cid == SCTP_CID_ASCONF)
 986                        return &addip_chunk_event_table[0][state];
 987
 988                if (cid == SCTP_CID_ASCONF_ACK)
 989                        return &addip_chunk_event_table[1][state];
 990        }
 991
 992        if (net->sctp.reconf_enable)
 993                if (cid == SCTP_CID_RECONF)
 994                        return &reconf_chunk_event_table[0][state];
 995
 996        if (net->sctp.auth_enable) {
 997                if (cid == SCTP_CID_AUTH)
 998                        return &auth_chunk_event_table[0][state];
 999        }
1000
1001        return &chunk_event_table_unknown[state];
1002}
1003