2008-01-11 17:57:09 +03:00
/* SCTP kernel implementation
2005-04-17 02:20:36 +04:00
* ( C ) Copyright IBM Corp . 2001 , 2004
* Copyright ( c ) 1999 - 2000 Cisco , Inc .
* Copyright ( c ) 1999 - 2001 Motorola , Inc .
* Copyright ( c ) 2001 Intel Corp .
* Copyright ( c ) 2001 Nokia , Inc .
*
2008-01-11 17:57:09 +03:00
* This file is part of the SCTP kernel implementation
2005-04-17 02:20:36 +04:00
*
* These are the state tables for the SCTP state machine .
*
2008-01-11 17:57:09 +03:00
* This SCTP implementation is free software ;
2005-04-17 02:20:36 +04:00
* you can redistribute it and / or modify it under the terms of
* the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
2008-01-11 17:57:09 +03:00
* This SCTP implementation is distributed in the hope that it
2005-04-17 02:20:36 +04:00
* will be useful , but WITHOUT ANY WARRANTY ; without even the implied
* * * * * * * * * * * * * * * * * * * * * * * * *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
* See the GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with GNU CC ; see the file COPYING . If not , write to
* the Free Software Foundation , 59 Temple Place - Suite 330 ,
* Boston , MA 02111 - 1307 , USA .
*
* Please send any bug reports or fixes you make to the
* email address ( es ) :
* lksctp developers < lksctp - developers @ lists . sourceforge . net >
*
* Or submit a bug report through the following website :
* http : //www.sf.net/projects/lksctp
*
* Written or modified by :
* La Monte H . P . Yarroll < piggy @ acm . org >
* Karl Knutson < karl @ athena . chicago . il . us >
* Jon Grimm < jgrimm @ us . ibm . com >
* Hui Huang < hui . huang @ nokia . com >
* Daisy Chang < daisyc @ us . ibm . com >
* Ardelle Fan < ardelle . fan @ intel . com >
* Sridhar Samudrala < sri @ us . ibm . com >
*
* Any bugs reported given to us we will try to fix . . . any fixes shared will
* be incorporated into the next SCTP release .
*/
2010-08-24 17:21:08 +04:00
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2005-04-17 02:20:36 +04:00
# include <linux/skbuff.h>
# include <net/sctp/sctp.h>
# include <net/sctp/sm.h>
static const sctp_sm_table_entry_t
primitive_event_table [ SCTP_NUM_PRIMITIVE_TYPES ] [ SCTP_STATE_NUM_STATES ] ;
static const sctp_sm_table_entry_t
other_event_table [ SCTP_NUM_OTHER_TYPES ] [ SCTP_STATE_NUM_STATES ] ;
static const sctp_sm_table_entry_t
timeout_event_table [ SCTP_NUM_TIMEOUT_TYPES ] [ SCTP_STATE_NUM_STATES ] ;
static const sctp_sm_table_entry_t * sctp_chunk_event_lookup ( sctp_cid_t cid ,
sctp_state_t state ) ;
static const sctp_sm_table_entry_t bug = {
. fn = sctp_sf_bug ,
. name = " sctp_sf_bug "
} ;
2010-08-24 17:21:08 +04:00
# define DO_LOOKUP(_max, _type, _table) \
( { \
const sctp_sm_table_entry_t * rtn ; \
\
if ( ( event_subtype . _type > ( _max ) ) ) { \
pr_warn ( " table %p possible attack: event %d exceeds max %d \n " , \
_table , event_subtype . _type , _max ) ; \
rtn = & bug ; \
} else \
rtn = & _table [ event_subtype . _type ] [ ( int ) state ] ; \
\
rtn ; \
} )
2005-04-17 02:20:36 +04:00
const sctp_sm_table_entry_t * sctp_sm_lookup_event ( sctp_event_t event_type ,
sctp_state_t state ,
sctp_subtype_t event_subtype )
{
switch ( event_type ) {
case SCTP_EVENT_T_CHUNK :
return sctp_chunk_event_lookup ( event_subtype . chunk , state ) ;
case SCTP_EVENT_T_TIMEOUT :
2010-08-24 17:21:08 +04:00
return DO_LOOKUP ( SCTP_EVENT_TIMEOUT_MAX , timeout ,
timeout_event_table ) ;
2005-04-17 02:20:36 +04:00
case SCTP_EVENT_T_OTHER :
2010-08-24 17:21:08 +04:00
return DO_LOOKUP ( SCTP_EVENT_OTHER_MAX , other ,
other_event_table ) ;
2005-04-17 02:20:36 +04:00
case SCTP_EVENT_T_PRIMITIVE :
2010-08-24 17:21:08 +04:00
return DO_LOOKUP ( SCTP_EVENT_PRIMITIVE_MAX , primitive ,
primitive_event_table ) ;
2005-04-17 02:20:36 +04:00
default :
/* Yikes! We got an illegal event type. */
return & bug ;
2007-04-21 04:09:22 +04:00
}
2005-04-17 02:20:36 +04:00
}
2006-11-14 03:19:07 +03:00
# define TYPE_SCTP_FUNC(func) {.fn = func, .name = #func}
2005-04-17 02:20:36 +04:00
# define TYPE_SCTP_DATA { \
/* SCTP_STATE_CLOSED */ \
2007-09-08 00:30:54 +04:00
TYPE_SCTP_FUNC ( sctp_sf_ootb ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_eat_data_6_2 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_eat_data_6_2 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_eat_data_fast_4_4 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_DATA */
# define TYPE_SCTP_INIT { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_1B_init ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_1_siminit ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_1_siminit ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_2_dupinit ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_2_dupinit ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_2_dupinit ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_2_dupinit ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_2_reshutack ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_INIT */
# define TYPE_SCTP_INIT_ACK { \
/* SCTP_STATE_CLOSED */ \
2007-01-16 06:18:30 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_3_initack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_1C_ack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_INIT_ACK */
# define TYPE_SCTP_SACK { \
/* SCTP_STATE_CLOSED */ \
2007-09-08 00:30:54 +04:00
TYPE_SCTP_FUNC ( sctp_sf_ootb ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_eat_sack_6_2 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_eat_sack_6_2 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_eat_sack_6_2 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_eat_sack_6_2 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_SACK */
# define TYPE_SCTP_HEARTBEAT { \
/* SCTP_STATE_CLOSED */ \
2007-09-08 00:30:54 +04:00
TYPE_SCTP_FUNC ( sctp_sf_ootb ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_beat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_beat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_beat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_beat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_beat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
/* This should not happen, but we are nice. */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_beat_8_3 ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_HEARTBEAT */
# define TYPE_SCTP_HEARTBEAT_ACK { \
/* SCTP_STATE_CLOSED */ \
2007-09-08 00:30:54 +04:00
TYPE_SCTP_FUNC ( sctp_sf_ootb ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_violation ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_backbeat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_backbeat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_backbeat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_backbeat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_HEARTBEAT_ACK */
# define TYPE_SCTP_ABORT { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_pdiscard ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_cookie_wait_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_cookie_echoed_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_1_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_shutdown_pending_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_shutdown_sent_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_1_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_shutdown_ack_sent_abort ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_ABORT */
# define TYPE_SCTP_SHUTDOWN { \
/* SCTP_STATE_CLOSED */ \
2007-09-08 00:30:54 +04:00
TYPE_SCTP_FUNC ( sctp_sf_ootb ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_2_shutdown ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2008-10-23 12:00:49 +04:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_2_shutdown ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_2_shutdown_ack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2008-10-23 12:01:18 +04:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_2_shut_ctsn ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_SHUTDOWN */
# define TYPE_SCTP_SHUTDOWN_ACK { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ootb ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_8_5_1_E_sa ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_8_5_1_E_sa ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_violation ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_violation ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_2_final ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_violation ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_2_final ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_SHUTDOWN_ACK */
# define TYPE_SCTP_ERROR { \
/* SCTP_STATE_CLOSED */ \
2007-09-08 00:30:54 +04:00
TYPE_SCTP_FUNC ( sctp_sf_ootb ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_cookie_echoed_err ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_operr_notify ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_operr_notify ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_operr_notify ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_ERROR */
# define TYPE_SCTP_COOKIE_ECHO { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_1D_ce ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_4_dupcook ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_4_dupcook ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_4_dupcook ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_4_dupcook ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_4_dupcook ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_4_dupcook ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_2_4_dupcook ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_COOKIE_ECHO */
# define TYPE_SCTP_COOKIE_ACK { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_5_1E_ca ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_COOKIE_ACK */
# define TYPE_SCTP_ECN_ECNE { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_ecne ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_ecne ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_ecne ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_ecne ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_ecne ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_ECN_ECNE */
# define TYPE_SCTP_ECN_CWR { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_ecn_cwr ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_ecn_cwr ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_ecn_cwr ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_ECN_CWR */
# define TYPE_SCTP_SHUTDOWN_COMPLETE { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_4_C ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_SHUTDOWN_COMPLETE */
/* The primary index for this table is the chunk type.
* The secondary index for this table is the state .
*
* For base protocol ( RFC 2960 ) .
*/
static const sctp_sm_table_entry_t chunk_event_table [ SCTP_NUM_BASE_CHUNK_TYPES ] [ SCTP_STATE_NUM_STATES ] = {
TYPE_SCTP_DATA ,
TYPE_SCTP_INIT ,
TYPE_SCTP_INIT_ACK ,
TYPE_SCTP_SACK ,
TYPE_SCTP_HEARTBEAT ,
TYPE_SCTP_HEARTBEAT_ACK ,
TYPE_SCTP_ABORT ,
TYPE_SCTP_SHUTDOWN ,
TYPE_SCTP_SHUTDOWN_ACK ,
TYPE_SCTP_ERROR ,
TYPE_SCTP_COOKIE_ECHO ,
TYPE_SCTP_COOKIE_ACK ,
TYPE_SCTP_ECN_ECNE ,
TYPE_SCTP_ECN_CWR ,
TYPE_SCTP_SHUTDOWN_COMPLETE ,
} ; /* state_fn_t chunk_event_table[][] */
# define TYPE_SCTP_ASCONF { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_asconf ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2007-12-21 01:11:11 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_asconf ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2007-12-21 01:11:11 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_asconf ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2007-12-21 01:11:11 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_asconf ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_ASCONF */
# define TYPE_SCTP_ASCONF_ACK { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_asconf_ack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2007-12-21 01:11:11 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_asconf_ack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2007-12-21 01:11:11 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_asconf_ack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2007-12-21 01:11:11 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_asconf_ack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_ASCONF_ACK */
/* The primary index for this table is the chunk type.
* The secondary index for this table is the state .
*/
static const sctp_sm_table_entry_t addip_chunk_event_table [ SCTP_NUM_ADDIP_CHUNK_TYPES ] [ SCTP_STATE_NUM_STATES ] = {
TYPE_SCTP_ASCONF ,
TYPE_SCTP_ASCONF_ACK ,
} ; /*state_fn_t addip_chunk_event_table[][] */
# define TYPE_SCTP_FWD_TSN { \
/* SCTP_STATE_CLOSED */ \
2007-09-08 00:30:54 +04:00
TYPE_SCTP_FUNC ( sctp_sf_ootb ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_eat_fwd_tsn ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_eat_fwd_tsn ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_eat_fwd_tsn_fast ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_FWD_TSN */
/* The primary index for this table is the chunk type.
* The secondary index for this table is the state .
*/
static const sctp_sm_table_entry_t prsctp_chunk_event_table [ SCTP_NUM_PRSCTP_CHUNK_TYPES ] [ SCTP_STATE_NUM_STATES ] = {
TYPE_SCTP_FWD_TSN ,
} ; /*state_fn_t prsctp_chunk_event_table[][] */
2007-10-04 04:51:34 +04:00
# define TYPE_SCTP_AUTH { \
/* SCTP_STATE_CLOSED */ \
TYPE_SCTP_FUNC ( sctp_sf_ootb ) , \
/* SCTP_STATE_COOKIE_WAIT */ \
TYPE_SCTP_FUNC ( sctp_sf_discard_chunk ) , \
/* SCTP_STATE_COOKIE_ECHOED */ \
TYPE_SCTP_FUNC ( sctp_sf_eat_auth ) , \
/* SCTP_STATE_ESTABLISHED */ \
TYPE_SCTP_FUNC ( sctp_sf_eat_auth ) , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
TYPE_SCTP_FUNC ( sctp_sf_eat_auth ) , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
TYPE_SCTP_FUNC ( sctp_sf_eat_auth ) , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
TYPE_SCTP_FUNC ( sctp_sf_eat_auth ) , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
TYPE_SCTP_FUNC ( sctp_sf_eat_auth ) , \
} /* TYPE_SCTP_AUTH */
/* The primary index for this table is the chunk type.
* The secondary index for this table is the state .
*/
static const sctp_sm_table_entry_t auth_chunk_event_table [ SCTP_NUM_AUTH_CHUNK_TYPES ] [ SCTP_STATE_NUM_STATES ] = {
TYPE_SCTP_AUTH ,
} ; /*state_fn_t auth_chunk_event_table[][] */
2005-04-17 02:20:36 +04:00
static const sctp_sm_table_entry_t
chunk_event_table_unknown [ SCTP_STATE_NUM_STATES ] = {
/* SCTP_STATE_CLOSED */
2007-09-08 00:30:54 +04:00
TYPE_SCTP_FUNC ( sctp_sf_ootb ) ,
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_unk_chunk ) ,
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_unk_chunk ) ,
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_unk_chunk ) ,
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_unk_chunk ) ,
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_unk_chunk ) ,
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_unk_chunk ) ,
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_unk_chunk ) ,
2005-04-17 02:20:36 +04:00
} ; /* chunk unknown */
# define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_asoc ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_not_impl ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_not_impl ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_not_impl ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_not_impl ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_not_impl ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_not_impl ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_not_impl ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
# define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_closed ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_cookie_wait_prm_shutdown ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_cookie_echoed_prm_shutdown ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_2_prm_shutdown ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_primitive ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_primitive ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_primitive ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_primitive ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
# define TYPE_SCTP_PRIMITIVE_ABORT { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_closed ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_cookie_wait_prm_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_cookie_echoed_prm_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_1_prm_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_shutdown_pending_prm_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_shutdown_sent_prm_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_1_prm_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_shutdown_ack_sent_prm_abort ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_PRIMITIVE_ABORT */
# define TYPE_SCTP_PRIMITIVE_SEND { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_closed ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_send ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_send ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_send ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_shutdown ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_shutdown ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_shutdown ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_shutdown ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_PRIMITIVE_SEND */
# define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_closed ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_requestheartbeat ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_requestheartbeat ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_requestheartbeat ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_requestheartbeat ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_requestheartbeat ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_requestheartbeat ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_requestheartbeat ) , \
2005-04-17 02:20:36 +04:00
} /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
# define TYPE_SCTP_PRIMITIVE_ASCONF { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_closed ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_closed ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_closed ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_asconf ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2007-12-21 01:11:11 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_asconf ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2007-12-21 01:11:11 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_asconf ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2007-12-21 01:11:11 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_prm_asconf ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_error_shutdown ) , \
2009-04-07 12:36:14 +04:00
} /* TYPE_SCTP_PRIMITIVE_ASCONF */
2005-04-17 02:20:36 +04:00
/* The primary index for this table is the primitive type.
* The secondary index for this table is the state .
*/
static const sctp_sm_table_entry_t primitive_event_table [ SCTP_NUM_PRIMITIVE_TYPES ] [ SCTP_STATE_NUM_STATES ] = {
TYPE_SCTP_PRIMITIVE_ASSOCIATE ,
TYPE_SCTP_PRIMITIVE_SHUTDOWN ,
TYPE_SCTP_PRIMITIVE_ABORT ,
TYPE_SCTP_PRIMITIVE_SEND ,
TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT ,
TYPE_SCTP_PRIMITIVE_ASCONF ,
} ;
# define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2011-04-17 21:29:03 +04:00
TYPE_SCTP_FUNC ( sctp_sf_do_no_pending_tsn ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_2_start_shutdown ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_9_2_shutdown_ack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
}
# define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_cookie_wait_icmp_abort ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_ignore_other ) , \
2005-04-17 02:20:36 +04:00
}
static const sctp_sm_table_entry_t other_event_table [ SCTP_NUM_OTHER_TYPES ] [ SCTP_STATE_NUM_STATES ] = {
TYPE_SCTP_OTHER_NO_PENDING_TSN ,
TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH ,
} ;
# define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_bug ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_bug ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_bug ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_bug ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_bug ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_bug ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_bug ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_bug ) , \
2005-04-17 02:20:36 +04:00
}
# define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_bug ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_t1_cookie_timer_expire ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
}
# define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_t1_init_timer_expire ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
}
# define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_t2_timer_expire ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_t2_timer_expire ) , \
2005-04-17 02:20:36 +04:00
}
# define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_6_3_3_rtx ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_6_3_3_rtx ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_6_3_3_rtx ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_6_3_3_rtx ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
}
# define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_t4_timer_expire ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
}
# define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2011-07-07 04:28:35 +04:00
TYPE_SCTP_FUNC ( sctp_sf_t5_timer_expire ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_t5_timer_expire ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
}
# define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_sendbeat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_sendbeat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_sendbeat_8_3 ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
}
# define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_6_2_sack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_6_2_sack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_do_6_2_sack ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
}
# define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
/* SCTP_STATE_CLOSED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_COOKIE_ECHOED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_ESTABLISHED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_autoclose_timer_expire ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_PENDING */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-11-14 03:19:07 +03:00
TYPE_SCTP_FUNC ( sctp_sf_timer_ignore ) , \
2005-04-17 02:20:36 +04:00
}
static const sctp_sm_table_entry_t timeout_event_table [ SCTP_NUM_TIMEOUT_TYPES ] [ SCTP_STATE_NUM_STATES ] = {
TYPE_SCTP_EVENT_TIMEOUT_NONE ,
TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE ,
TYPE_SCTP_EVENT_TIMEOUT_T1_INIT ,
TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN ,
TYPE_SCTP_EVENT_TIMEOUT_T3_RTX ,
TYPE_SCTP_EVENT_TIMEOUT_T4_RTO ,
TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD ,
TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT ,
TYPE_SCTP_EVENT_TIMEOUT_SACK ,
TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE ,
} ;
2007-02-09 17:25:18 +03:00
static const sctp_sm_table_entry_t * sctp_chunk_event_lookup ( sctp_cid_t cid ,
2005-04-17 02:20:36 +04:00
sctp_state_t state )
{
if ( state > SCTP_STATE_MAX )
return & bug ;
2007-06-01 08:33:35 +04:00
if ( cid < = SCTP_CID_BASE_MAX )
2005-04-17 02:20:36 +04:00
return & chunk_event_table [ cid ] [ state ] ;
if ( sctp_prsctp_enable ) {
if ( cid = = SCTP_CID_FWD_TSN )
return & prsctp_chunk_event_table [ 0 ] [ state ] ;
}
if ( sctp_addip_enable ) {
if ( cid = = SCTP_CID_ASCONF )
return & addip_chunk_event_table [ 0 ] [ state ] ;
if ( cid = = SCTP_CID_ASCONF_ACK )
return & addip_chunk_event_table [ 1 ] [ state ] ;
}
2007-10-04 04:51:34 +04:00
if ( sctp_auth_enable ) {
if ( cid = = SCTP_CID_AUTH )
return & auth_chunk_event_table [ 0 ] [ state ] ;
}
2005-04-17 02:20:36 +04:00
return & chunk_event_table_unknown [ state ] ;
}