2005-04-16 15:20:36 -07:00
/* SCTP kernel reference Implementation
* ( 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 .
*
* This file is part of the SCTP kernel reference Implementation
*
* These are the state tables for the SCTP state machine .
*
* The SCTP reference implementation is free software ;
* 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 .
*
* The SCTP reference implementation is distributed in the hope that it
* 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 .
*/
# 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 "
} ;
# define DO_LOOKUP(_max, _type, _table) \
if ( ( event_subtype . _type > ( _max ) ) ) { \
printk ( KERN_WARNING \
" sctp table %p possible attack: " \
" event %d exceeds max %d \n " , \
_table , event_subtype . _type , _max ) ; \
return & bug ; \
} \
return & _table [ event_subtype . _type ] [ ( int ) state ] ;
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 ) ;
break ;
case SCTP_EVENT_T_TIMEOUT :
DO_LOOKUP ( SCTP_EVENT_TIMEOUT_MAX , timeout ,
timeout_event_table ) ;
break ;
case SCTP_EVENT_T_OTHER :
DO_LOOKUP ( SCTP_EVENT_OTHER_MAX , other , other_event_table ) ;
break ;
case SCTP_EVENT_T_PRIMITIVE :
DO_LOOKUP ( SCTP_EVENT_PRIMITIVE_MAX , primitive ,
primitive_event_table ) ;
break ;
default :
/* Yikes! We got an illegal event type. */
return & bug ;
} ;
}
# define TYPE_SCTP_DATA { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_tabort_8_4_8 , . name = " sctp_sf_tabort_8_4_8 " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_eat_data_6_2 , . name = " sctp_sf_eat_data_6_2 " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_eat_data_6_2 , . name = " sctp_sf_eat_data_6_2 " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_eat_data_fast_4_4 , . name = " sctp_sf_eat_data_fast_4_4 " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
} /* TYPE_SCTP_DATA */
# define TYPE_SCTP_INIT { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_do_5_1B_init , . name = " sctp_sf_do_5_1B_init " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_do_5_2_1_siminit , . name = " sctp_sf_do_5_2_1_siminit " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_do_5_2_1_siminit , . name = " sctp_sf_do_5_2_1_siminit " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_5_2_2_dupinit , . name = " sctp_sf_do_5_2_2_dupinit " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_do_5_2_2_dupinit , . name = " sctp_sf_do_5_2_2_dupinit " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_do_5_2_2_dupinit , . name = " sctp_sf_do_5_2_2_dupinit " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_do_5_2_2_dupinit , . name = " sctp_sf_do_5_2_2_dupinit " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_do_9_2_reshutack , . name = " sctp_sf_do_9_2_reshutack " } , \
} /* TYPE_SCTP_INIT */
# define TYPE_SCTP_INIT_ACK { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_do_5_1C_ack , . name = " sctp_sf_do_5_1C_ack " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
} /* TYPE_SCTP_INIT_ACK */
# define TYPE_SCTP_SACK { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_tabort_8_4_8 , . name = " sctp_sf_tabort_8_4_8 " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_eat_sack_6_2 , . name = " sctp_sf_eat_sack_6_2 " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_eat_sack_6_2 , . name = " sctp_sf_eat_sack_6_2 " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_eat_sack_6_2 , . name = " sctp_sf_eat_sack_6_2 " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_eat_sack_6_2 , . name = " sctp_sf_eat_sack_6_2 " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
} /* TYPE_SCTP_SACK */
# define TYPE_SCTP_HEARTBEAT { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_tabort_8_4_8 , . name = " sctp_sf_tabort_8_4_8 " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_beat_8_3 , . name = " sctp_sf_beat_8_3 " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_beat_8_3 , . name = " sctp_sf_beat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_beat_8_3 , . name = " sctp_sf_beat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_beat_8_3 , . name = " sctp_sf_beat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_beat_8_3 , . name = " sctp_sf_beat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
/* This should not happen, but we are nice. */ \
{ . fn = sctp_sf_beat_8_3 , . name = " sctp_sf_beat_8_3 " } , \
} /* TYPE_SCTP_HEARTBEAT */
# define TYPE_SCTP_HEARTBEAT_ACK { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_tabort_8_4_8 , . name = " sctp_sf_tabort_8_4_8 " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_violation , . name = " sctp_sf_violation " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_backbeat_8_3 , . name = " sctp_sf_backbeat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_backbeat_8_3 , . name = " sctp_sf_backbeat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_backbeat_8_3 , . name = " sctp_sf_backbeat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_backbeat_8_3 , . name = " sctp_sf_backbeat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
} /* TYPE_SCTP_HEARTBEAT_ACK */
# define TYPE_SCTP_ABORT { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_pdiscard , . name = " sctp_sf_pdiscard " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_cookie_wait_abort , . name = " sctp_sf_cookie_wait_abort " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_cookie_echoed_abort , \
. name = " sctp_sf_cookie_echoed_abort " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_9_1_abort , . name = " sctp_sf_do_9_1_abort " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_shutdown_pending_abort , \
. name = " sctp_sf_shutdown_pending_abort " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_shutdown_sent_abort , \
. name = " sctp_sf_shutdown_sent_abort " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_do_9_1_abort , . name = " sctp_sf_do_9_1_abort " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_shutdown_ack_sent_abort , \
. name = " sctp_sf_shutdown_ack_sent_abort " } , \
} /* TYPE_SCTP_ABORT */
# define TYPE_SCTP_SHUTDOWN { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_tabort_8_4_8 , . name = " sctp_sf_tabort_8_4_8 " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_9_2_shutdown , . name = " sctp_sf_do_9_2_shutdown " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_do_9_2_shutdown_ack , \
. name = " sctp_sf_do_9_2_shutdown_ack " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
} /* TYPE_SCTP_SHUTDOWN */
# define TYPE_SCTP_SHUTDOWN_ACK { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_do_8_5_1_E_sa , . name = " sctp_sf_do_8_5_1_E_sa " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_do_8_5_1_E_sa , . name = " sctp_sf_do_8_5_1_E_sa " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_violation , . name = " sctp_sf_violation " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_violation , . name = " sctp_sf_violation " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_do_9_2_final , . name = " sctp_sf_do_9_2_final " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_violation , . name = " sctp_sf_violation " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_do_9_2_final , . name = " sctp_sf_do_9_2_final " } , \
} /* TYPE_SCTP_SHUTDOWN_ACK */
# define TYPE_SCTP_ERROR { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_tabort_8_4_8 , . name = " sctp_sf_tabort_8_4_8 " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_cookie_echoed_err , . name = " sctp_sf_cookie_echoed_err " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_operr_notify , . name = " sctp_sf_operr_notify " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_operr_notify , . name = " sctp_sf_operr_notify " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_operr_notify , . name = " sctp_sf_operr_notify " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
} /* TYPE_SCTP_ERROR */
# define TYPE_SCTP_COOKIE_ECHO { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_do_5_1D_ce , . name = " sctp_sf_do_5_1D_ce " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_do_5_2_4_dupcook , . name = " sctp_sf_do_5_2_4_dupcook " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_do_5_2_4_dupcook , . name = " sctp_sf_do_5_2_4_dupcook " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_5_2_4_dupcook , . name = " sctp_sf_do_5_2_4_dupcook " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_do_5_2_4_dupcook , . name = " sctp_sf_do_5_2_4_dupcook " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_do_5_2_4_dupcook , . name = " sctp_sf_do_5_2_4_dupcook " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_do_5_2_4_dupcook , . name = " sctp_sf_do_5_2_4_dupcook " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_do_5_2_4_dupcook , . name = " sctp_sf_do_5_2_4_dupcook " } , \
} /* TYPE_SCTP_COOKIE_ECHO */
# define TYPE_SCTP_COOKIE_ACK { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_do_5_1E_ca , . name = " sctp_sf_do_5_1E_ca " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
} /* TYPE_SCTP_COOKIE_ACK */
# define TYPE_SCTP_ECN_ECNE { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
2006-05-05 17:05:23 -07:00
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
2005-04-16 15:20:36 -07:00
/* SCTP_STATE_COOKIE_WAIT */ \
2006-05-05 17:05:23 -07:00
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
2005-04-16 15:20:36 -07:00
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_do_ecne , . name = " sctp_sf_do_ecne " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_ecne , . name = " sctp_sf_do_ecne " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_do_ecne , . name = " sctp_sf_do_ecne " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_do_ecne , . name = " sctp_sf_do_ecne " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_do_ecne , . name = " sctp_sf_do_ecne " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-05-05 17:05:23 -07:00
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
2005-04-16 15:20:36 -07:00
} /* TYPE_SCTP_ECN_ECNE */
# define TYPE_SCTP_ECN_CWR { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_ecn_cwr , . name = " sctp_sf_do_ecn_cwr " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_do_ecn_cwr , . name = " sctp_sf_do_ecn_cwr " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_do_ecn_cwr , . name = " sctp_sf_do_ecn_cwr " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
2006-05-05 17:05:23 -07:00
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
2005-04-16 15:20:36 -07:00
} /* TYPE_SCTP_ECN_CWR */
# define TYPE_SCTP_SHUTDOWN_COMPLETE { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_do_4_C , . name = " sctp_sf_do_4_C " } , \
} /* 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_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_asconf , . name = " sctp_sf_do_asconf " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
} /* TYPE_SCTP_ASCONF */
# define TYPE_SCTP_ASCONF_ACK { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_asconf_ack , . name = " sctp_sf_do_asconf_ack " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
} /* 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_EMPTY */ \
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_tabort_8_4_8 , . name = " sctp_sf_tabort_8_4_8 " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_eat_fwd_tsn , . name = " sctp_sf_eat_fwd_tsn " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_eat_fwd_tsn , . name = " sctp_sf_eat_fwd_tsn " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_eat_fwd_tsn_fast , . name = " sctp_sf_eat_fwd_tsn_fast " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_discard_chunk , . name = " sctp_sf_discard_chunk " } , \
} /* 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[][] */
static const sctp_sm_table_entry_t
chunk_event_table_unknown [ SCTP_STATE_NUM_STATES ] = {
/* SCTP_STATE_EMPTY */
{ . fn = sctp_sf_ootb , . name = " sctp_sf_ootb " } ,
/* SCTP_STATE_CLOSED */
{ . fn = sctp_sf_tabort_8_4_8 , . name = " sctp_sf_tabort_8_4_8 " } ,
/* SCTP_STATE_COOKIE_WAIT */
{ . fn = sctp_sf_unk_chunk , . name = " sctp_sf_unk_chunk " } ,
/* SCTP_STATE_COOKIE_ECHOED */
{ . fn = sctp_sf_unk_chunk , . name = " sctp_sf_unk_chunk " } ,
/* SCTP_STATE_ESTABLISHED */
{ . fn = sctp_sf_unk_chunk , . name = " sctp_sf_unk_chunk " } ,
/* SCTP_STATE_SHUTDOWN_PENDING */
{ . fn = sctp_sf_unk_chunk , . name = " sctp_sf_unk_chunk " } ,
/* SCTP_STATE_SHUTDOWN_SENT */
{ . fn = sctp_sf_unk_chunk , . name = " sctp_sf_unk_chunk " } ,
/* SCTP_STATE_SHUTDOWN_RECEIVED */
{ . fn = sctp_sf_unk_chunk , . name = " sctp_sf_unk_chunk " } ,
/* SCTP_STATE_SHUTDOWN_ACK_SENT */
{ . fn = sctp_sf_unk_chunk , . name = " sctp_sf_unk_chunk " } ,
} ; /* chunk unknown */
# define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_do_prm_asoc , . name = " sctp_sf_do_prm_asoc " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_not_impl , . name = " sctp_sf_not_impl " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_not_impl , . name = " sctp_sf_not_impl " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_not_impl , . name = " sctp_sf_not_impl " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_not_impl , . name = " sctp_sf_not_impl " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_not_impl , . name = " sctp_sf_not_impl " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_not_impl , . name = " sctp_sf_not_impl " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_not_impl , . name = " sctp_sf_not_impl " } , \
} /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
# define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_error_closed , . name = " sctp_sf_error_closed " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_cookie_wait_prm_shutdown , \
. name = " sctp_sf_cookie_wait_prm_shutdown " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_cookie_echoed_prm_shutdown , \
. name = " sctp_sf_cookie_echoed_prm_shutdown " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_9_2_prm_shutdown , \
. name = " sctp_sf_do_9_2_prm_shutdown " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_ignore_primitive , . name = " sctp_sf_ignore_primitive " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_ignore_primitive , . name = " sctp_sf_ignore_primitive " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_ignore_primitive , . name = " sctp_sf_ignore_primitive " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_ignore_primitive , . name = " sctp_sf_ignore_primitive " } , \
} /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
# define TYPE_SCTP_PRIMITIVE_ABORT { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_error_closed , . name = " sctp_sf_error_closed " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_cookie_wait_prm_abort , \
. name = " sctp_sf_cookie_wait_prm_abort " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_cookie_echoed_prm_abort , \
. name = " sctp_sf_cookie_echoed_prm_abort " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_9_1_prm_abort , \
. name = " sctp_sf_do_9_1_prm_abort " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_shutdown_pending_prm_abort , \
. name = " sctp_sf_shutdown_pending_prm_abort " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_shutdown_sent_prm_abort , \
. name = " sctp_sf_shutdown_sent_prm_abort " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_do_9_1_prm_abort , \
. name = " sctp_sf_do_9_1_prm_abort " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_shutdown_ack_sent_prm_abort , \
. name = " sctp_sf_shutdown_ack_sent_prm_abort " } , \
} /* TYPE_SCTP_PRIMITIVE_ABORT */
# define TYPE_SCTP_PRIMITIVE_SEND { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_error_closed , . name = " sctp_sf_error_closed " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_do_prm_send , . name = " sctp_sf_do_prm_send " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_do_prm_send , . name = " sctp_sf_do_prm_send " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_prm_send , . name = " sctp_sf_do_prm_send " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_error_shutdown , . name = " sctp_sf_error_shutdown " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_error_shutdown , . name = " sctp_sf_error_shutdown " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_error_shutdown , . name = " sctp_sf_error_shutdown " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_error_shutdown , . name = " sctp_sf_error_shutdown " } , \
} /* TYPE_SCTP_PRIMITIVE_SEND */
# define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
2006-05-05 17:05:23 -07:00
{ . fn = sctp_sf_error_closed , . name = " sctp_sf_error_closed " } , \
2005-04-16 15:20:36 -07:00
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_do_prm_requestheartbeat , \
. name = " sctp_sf_do_prm_requestheartbeat " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_do_prm_requestheartbeat , \
. name = " sctp_sf_do_prm_requestheartbeat " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_prm_requestheartbeat , \
. name = " sctp_sf_do_prm_requestheartbeat " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_do_prm_requestheartbeat , \
. name = " sctp_sf_do_prm_requestheartbeat " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_do_prm_requestheartbeat , \
. name = " sctp_sf_do_prm_requestheartbeat " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_do_prm_requestheartbeat , \
. name = " sctp_sf_do_prm_requestheartbeat " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_do_prm_requestheartbeat , \
. name = " sctp_sf_do_prm_requestheartbeat " } , \
} /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
# define TYPE_SCTP_PRIMITIVE_ASCONF { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_error_closed , . name = " sctp_sf_error_closed " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_error_closed , . name = " sctp_sf_error_closed " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_error_closed , . name = " sctp_sf_error_closed " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_prm_asconf , . name = " sctp_sf_do_prm_asconf " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_error_shutdown , . name = " sctp_sf_error_shutdown " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_error_shutdown , . name = " sctp_sf_error_shutdown " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_error_shutdown , . name = " sctp_sf_error_shutdown " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_error_shutdown , . name = " sctp_sf_error_shutdown " } , \
} /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
/* 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_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_do_9_2_start_shutdown , \
. name = " sctp_do_9_2_start_shutdown " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_do_9_2_shutdown_ack , \
. name = " sctp_sf_do_9_2_shutdown_ack " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
}
# define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_cookie_wait_icmp_abort , \
. name = " sctp_sf_cookie_wait_icmp_abort " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_ignore_other , . name = " sctp_sf_ignore_other " } , \
}
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_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
}
# define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
2005-06-20 13:14:57 -07:00
{ . fn = sctp_sf_t1_cookie_timer_expire , \
. name = " sctp_sf_t1_cookie_timer_expire " } , \
2005-04-16 15:20:36 -07:00
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
}
# define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
2005-06-20 13:14:57 -07:00
{ . fn = sctp_sf_t1_init_timer_expire , \
. name = " sctp_sf_t1_init_timer_expire " } , \
2005-04-16 15:20:36 -07:00
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
}
# define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_t2_timer_expire , . name = " sctp_sf_t2_timer_expire " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_t2_timer_expire , . name = " sctp_sf_t2_timer_expire " } , \
}
# define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_do_6_3_3_rtx , . name = " sctp_sf_do_6_3_3_rtx " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_6_3_3_rtx , . name = " sctp_sf_do_6_3_3_rtx " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_do_6_3_3_rtx , . name = " sctp_sf_do_6_3_3_rtx " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_do_6_3_3_rtx , . name = " sctp_sf_do_6_3_3_rtx " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
}
# define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_t4_timer_expire , . name = " sctp_sf_t4_timer_expire " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
}
# define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_t5_timer_expire , . name = " sctp_sf_t5_timer_expire " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_t5_timer_expire , . name = " sctp_sf_t5_timer_expire " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
}
# define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_sendbeat_8_3 , . name = " sctp_sf_sendbeat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_sendbeat_8_3 , . name = " sctp_sf_sendbeat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_sendbeat_8_3 , . name = " sctp_sf_sendbeat_8_3 " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
}
# define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_bug , . name = " sctp_sf_bug " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_do_6_2_sack , . name = " sctp_sf_do_6_2_sack " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_do_6_2_sack , . name = " sctp_sf_do_6_2_sack " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_do_6_2_sack , . name = " sctp_sf_do_6_2_sack " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
}
# define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
/* SCTP_STATE_EMPTY */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_CLOSED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_WAIT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_COOKIE_ECHOED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_ESTABLISHED */ \
{ . fn = sctp_sf_autoclose_timer_expire , \
. name = " sctp_sf_autoclose_timer_expire " } , \
/* SCTP_STATE_SHUTDOWN_PENDING */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
{ . fn = sctp_sf_timer_ignore , . name = " sctp_sf_timer_ignore " } , \
}
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 ,
} ;
static const sctp_sm_table_entry_t * sctp_chunk_event_lookup ( sctp_cid_t cid ,
sctp_state_t state )
{
if ( state > SCTP_STATE_MAX )
return & bug ;
if ( cid > = 0 & & cid < = SCTP_CID_BASE_MAX )
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 ] ;
}
return & chunk_event_table_unknown [ state ] ;
}