2008-01-11 09:57:09 -05:00
/* SCTP kernel Implementation
2005-04-16 15:20:36 -07:00
* ( C ) Copyright IBM Corp . 2001 , 2004
* Copyright ( C ) 1999 - 2001 Cisco , Motorola
*
2008-01-11 09:57:09 -05:00
* This file is part of the SCTP kernel implementation
2005-04-16 15:20:36 -07:00
*
* These are the definitions needed for the command object .
*
2008-01-11 09:57:09 -05:00
* This SCTP implementation is free software ;
2005-04-16 15:20:36 -07: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 09:57:09 -05:00
* This SCTP implementation is distributed in the hope that it
2005-04-16 15:20:36 -07: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
2013-12-06 09:13:40 -08:00
* along with GNU CC ; see the file COPYING . If not , see
* < http : //www.gnu.org/licenses/>.
2005-04-16 15:20:36 -07:00
*
2013-08-06 21:18:13 +02:00
* Please send any bug reports or fixes you make to the
* email address ( es ) :
* lksctp developers < linux - sctp @ vger . kernel . org >
*
* Written or modified by :
* La Monte H . P . Yarroll < piggy @ acm . org >
* Karl Knutson < karl @ athena . chicago . il . us >
* Ardelle Fan < ardelle . fan @ intel . com >
* Sridhar Samudrala < sri @ us . ibm . com >
2005-04-16 15:20:36 -07:00
*/
# ifndef __net_sctp_command_h__
# define __net_sctp_command_h__
# include <net/sctp/constants.h>
# include <net/sctp/structs.h>
2017-08-11 10:23:54 +08:00
enum sctp_verb {
2005-04-16 15:20:36 -07:00
SCTP_CMD_NOP = 0 , /* Do nothing. */
SCTP_CMD_NEW_ASOC , /* Register a new association. */
SCTP_CMD_DELETE_TCB , /* Delete the current association. */
SCTP_CMD_NEW_STATE , /* Enter a new state. */
SCTP_CMD_REPORT_TSN , /* Record the arrival of a TSN. */
SCTP_CMD_GEN_SACK , /* Send a Selective ACK (maybe). */
SCTP_CMD_PROCESS_SACK , /* Process an inbound SACK. */
SCTP_CMD_GEN_INIT_ACK , /* Generate an INIT ACK chunk. */
SCTP_CMD_PEER_INIT , /* Process a INIT from the peer. */
SCTP_CMD_GEN_COOKIE_ECHO , /* Generate a COOKIE ECHO chunk. */
SCTP_CMD_CHUNK_ULP , /* Send a chunk to the sockets layer. */
SCTP_CMD_EVENT_ULP , /* Send a notification to the sockets layer. */
SCTP_CMD_REPLY , /* Send a chunk to our peer. */
SCTP_CMD_SEND_PKT , /* Send a full packet to our peer. */
SCTP_CMD_RETRAN , /* Mark a transport for retransmission. */
SCTP_CMD_ECN_CE , /* Do delayed CE processing. */
SCTP_CMD_ECN_ECNE , /* Do delayed ECNE processing. */
SCTP_CMD_ECN_CWR , /* Do delayed CWR processing. */
SCTP_CMD_TIMER_START , /* Start a timer. */
2011-07-07 00:28:35 +00:00
SCTP_CMD_TIMER_START_ONCE , /* Start a timer once */
2005-04-16 15:20:36 -07:00
SCTP_CMD_TIMER_RESTART , /* Restart a timer. */
SCTP_CMD_TIMER_STOP , /* Stop a timer. */
2005-06-20 13:14:57 -07:00
SCTP_CMD_INIT_CHOOSE_TRANSPORT , /* Choose transport for an INIT. */
SCTP_CMD_INIT_COUNTER_RESET , /* Reset init counter. */
SCTP_CMD_INIT_COUNTER_INC , /* Increment init counter. */
2005-04-16 15:20:36 -07:00
SCTP_CMD_INIT_RESTART , /* High level, do init timer work. */
2005-06-20 13:14:57 -07:00
SCTP_CMD_COOKIEECHO_RESTART , /* High level, do cookie-echo timer work. */
2005-04-16 15:20:36 -07:00
SCTP_CMD_INIT_FAILED , /* High level, do init failure work. */
SCTP_CMD_REPORT_DUP , /* Report a duplicate TSN. */
SCTP_CMD_STRIKE , /* Mark a strike against a transport. */
SCTP_CMD_HB_TIMERS_START , /* Start the heartbeat timers. */
SCTP_CMD_HB_TIMER_UPDATE , /* Update a heartbeat timers. */
SCTP_CMD_HB_TIMERS_STOP , /* Stop the heartbeat timers. */
2009-03-02 09:46:14 +00:00
SCTP_CMD_TRANSPORT_HB_SENT , /* Reset the status of a transport. */
SCTP_CMD_TRANSPORT_IDLE , /* Do manipulations on idle transport */
2005-04-16 15:20:36 -07:00
SCTP_CMD_TRANSPORT_ON , /* Mark the transport as active. */
SCTP_CMD_REPORT_ERROR , /* Pass this error back out of the sm. */
SCTP_CMD_REPORT_BAD_TAG , /* Verification tags didn't match. */
SCTP_CMD_PROCESS_CTSN , /* Sideeffect from shutdown. */
SCTP_CMD_ASSOC_FAILED , /* Handle association failure. */
SCTP_CMD_DISCARD_PACKET , /* Discard the whole packet. */
SCTP_CMD_GEN_SHUTDOWN , /* Generate a SHUTDOWN chunk. */
SCTP_CMD_UPDATE_ASSOC , /* Update association information. */
SCTP_CMD_PURGE_OUTQUEUE , /* Purge all data waiting to be sent. */
SCTP_CMD_SETUP_T2 , /* Hi-level, setup T2-shutdown parms. */
SCTP_CMD_RTO_PENDING , /* Set transport's rto_pending. */
SCTP_CMD_PART_DELIVER , /* Partial data delivery considerations. */
SCTP_CMD_RENEGE , /* Renege data on an association. */
SCTP_CMD_SETUP_T4 , /* ADDIP, setup T4 RTO timer parms. */
SCTP_CMD_PROCESS_OPERR , /* Process an ERROR chunk. */
SCTP_CMD_REPORT_FWDTSN , /* Report new cumulative TSN Ack. */
SCTP_CMD_PROCESS_FWDTSN , /* Skips were reported, so process further. */
SCTP_CMD_CLEAR_INIT_TAG , /* Clears association peer's inittag. */
SCTP_CMD_DEL_NON_PRIMARY , /* Removes non-primary peer transports. */
SCTP_CMD_T3_RTX_TIMERS_STOP , /* Stops T3-rtx pending timers */
SCTP_CMD_FORCE_PRIM_RETRAN , /* Forces retrans. over primary path. */
2006-05-19 10:58:12 -07:00
SCTP_CMD_SET_SK_ERR , /* Set sk_err */
2007-05-04 13:55:27 -07:00
SCTP_CMD_ASSOC_CHANGE , /* generate and send assoc_change event */
SCTP_CMD_ADAPTATION_IND , /* generate and send adaptation event */
2018-03-14 19:05:34 +08:00
SCTP_CMD_PEER_NO_AUTH , /* generate and send authentication event */
2007-09-16 19:32:11 -07:00
SCTP_CMD_ASSOC_SHKEY , /* generate the association shared keys */
2007-10-24 15:59:16 -04:00
SCTP_CMD_T1_RETRAN , /* Mark for retransmission after T1 timeout */
2008-04-12 18:39:34 -07:00
SCTP_CMD_UPDATE_INITTAG , /* Update peer inittag */
2009-08-10 13:51:03 -04:00
SCTP_CMD_SEND_MSG , /* Send the whole use message */
2010-04-28 08:47:22 +00:00
SCTP_CMD_SEND_NEXT_ASCONF , /* Send the next ASCONF after ACK */
2011-05-29 23:23:36 +00:00
SCTP_CMD_PURGE_ASCONF_QUEUE , /* Purge all asconf queues.*/
2011-08-29 21:02:24 +00:00
SCTP_CMD_SET_ASOC , /* Restore association context */
2005-04-16 15:20:36 -07:00
SCTP_CMD_LAST
2017-08-11 10:23:54 +08:00
} ;
2005-04-16 15:20:36 -07:00
2017-08-11 10:23:52 +08:00
/* How many commands can you put in an struct sctp_cmd_seq?
2005-04-16 15:20:36 -07:00
* This is a rather arbitrary number , ideally derived from a careful
* analysis of the state functions , but in reality just taken from
* thin air in the hopes othat we don ' t trigger a kernel panic .
*/
2014-10-03 18:16:20 -04:00
# define SCTP_MAX_NUM_COMMANDS 20
2005-04-16 15:20:36 -07:00
2017-08-11 10:23:53 +08:00
union sctp_arg {
2014-07-04 14:35:51 +00:00
void * zero_all ; /* Set to NULL to clear the entire union */
2005-04-16 15:20:36 -07:00
__s32 i32 ;
__u32 u32 ;
2006-11-20 17:26:53 -08:00
__be32 be32 ;
2005-04-16 15:20:36 -07:00
__u16 u16 ;
__u8 u8 ;
int error ;
2006-11-20 17:00:44 -08:00
__be16 err ;
2017-08-05 19:59:59 +08:00
enum sctp_state state ;
2017-08-05 20:00:02 +08:00
enum sctp_event_timeout to ;
2005-04-16 15:20:36 -07:00
struct sctp_chunk * chunk ;
struct sctp_association * asoc ;
struct sctp_transport * transport ;
struct sctp_bind_addr * bp ;
2017-06-30 11:52:22 +08:00
struct sctp_init_chunk * init ;
2005-04-16 15:20:36 -07:00
struct sctp_ulpevent * ulpevent ;
struct sctp_packet * packet ;
2017-07-23 09:34:32 +08:00
struct sctp_sackhdr * sackh ;
2009-08-10 13:51:03 -04:00
struct sctp_datamsg * msg ;
2017-08-11 10:23:53 +08:00
} ;
2005-04-16 15:20:36 -07:00
/* We are simulating ML type constructors here.
*
* SCTP_ARG_CONSTRUCTOR ( NAME , TYPE , ELT ) builds a function called
* SCTP_NAME ( ) which takes an argument of type TYPE and returns an
2017-08-11 10:23:53 +08:00
* union sctp_arg . It does this by inserting the sole argument into
* the ELT union element of a local union sctp_arg .
2005-04-16 15:20:36 -07:00
*
* E . g . , SCTP_ARG_CONSTRUCTOR ( I32 , __s32 , i32 ) builds SCTP_I32 ( arg ) ,
2017-08-11 10:23:53 +08:00
* which takes an __s32 and returns a union sctp_arg containing the
2005-04-16 15:20:36 -07:00
* __s32 . So , after foo = SCTP_I32 ( arg ) , foo . i32 = = arg .
*/
# define SCTP_ARG_CONSTRUCTOR(name, type, elt) \
2017-08-11 10:23:53 +08:00
static inline union sctp_arg \
2005-04-16 15:20:36 -07:00
SCTP_ # # name ( type arg ) \
2017-08-11 10:23:53 +08:00
{ union sctp_arg retval ; \
2014-07-04 14:35:51 +00:00
retval . zero_all = NULL ; \
2012-10-29 08:32:13 +00:00
retval . elt = arg ; \
return retval ; \
}
2005-04-16 15:20:36 -07:00
SCTP_ARG_CONSTRUCTOR ( I32 , __s32 , i32 )
SCTP_ARG_CONSTRUCTOR ( U32 , __u32 , u32 )
2006-11-20 17:26:53 -08:00
SCTP_ARG_CONSTRUCTOR ( BE32 , __be32 , be32 )
2005-04-16 15:20:36 -07:00
SCTP_ARG_CONSTRUCTOR ( U16 , __u16 , u16 )
SCTP_ARG_CONSTRUCTOR ( U8 , __u8 , u8 )
SCTP_ARG_CONSTRUCTOR ( ERROR , int , error )
2006-11-20 17:00:44 -08:00
SCTP_ARG_CONSTRUCTOR ( PERR , __be16 , err ) /* protocol error */
2017-08-05 19:59:59 +08:00
SCTP_ARG_CONSTRUCTOR ( STATE , enum sctp_state , state )
2017-08-05 20:00:02 +08:00
SCTP_ARG_CONSTRUCTOR ( TO , enum sctp_event_timeout , to )
2005-04-16 15:20:36 -07:00
SCTP_ARG_CONSTRUCTOR ( CHUNK , struct sctp_chunk * , chunk )
SCTP_ARG_CONSTRUCTOR ( ASOC , struct sctp_association * , asoc )
SCTP_ARG_CONSTRUCTOR ( TRANSPORT , struct sctp_transport * , transport )
SCTP_ARG_CONSTRUCTOR ( BA , struct sctp_bind_addr * , bp )
2017-06-30 11:52:22 +08:00
SCTP_ARG_CONSTRUCTOR ( PEER_INIT , struct sctp_init_chunk * , init )
2005-04-16 15:20:36 -07:00
SCTP_ARG_CONSTRUCTOR ( ULPEVENT , struct sctp_ulpevent * , ulpevent )
SCTP_ARG_CONSTRUCTOR ( PACKET , struct sctp_packet * , packet )
2017-07-23 09:34:32 +08:00
SCTP_ARG_CONSTRUCTOR ( SACKH , struct sctp_sackhdr * , sackh )
2009-08-10 13:51:03 -04:00
SCTP_ARG_CONSTRUCTOR ( DATAMSG , struct sctp_datamsg * , msg )
2005-04-16 15:20:36 -07:00
2017-08-11 10:23:53 +08:00
static inline union sctp_arg SCTP_FORCE ( void )
2012-10-29 08:32:13 +00:00
{
return SCTP_I32 ( 1 ) ;
}
2017-08-11 10:23:53 +08:00
static inline union sctp_arg SCTP_NOFORCE ( void )
2012-10-29 08:32:13 +00:00
{
return SCTP_I32 ( 0 ) ;
}
2017-08-11 10:23:53 +08:00
static inline union sctp_arg SCTP_NULL ( void )
2012-10-29 08:32:13 +00:00
{
2017-08-11 10:23:53 +08:00
union sctp_arg retval ;
2014-07-04 14:35:51 +00:00
retval . zero_all = NULL ;
2012-10-29 08:32:13 +00:00
return retval ;
}
2017-08-11 10:23:51 +08:00
struct sctp_cmd {
2017-08-11 10:23:53 +08:00
union sctp_arg obj ;
2017-08-11 10:23:54 +08:00
enum sctp_verb verb ;
2017-08-11 10:23:51 +08:00
} ;
2005-04-16 15:20:36 -07:00
2017-08-11 10:23:52 +08:00
struct sctp_cmd_seq {
2017-08-11 10:23:51 +08:00
struct sctp_cmd cmds [ SCTP_MAX_NUM_COMMANDS ] ;
struct sctp_cmd * last_used_slot ;
struct sctp_cmd * next_cmd ;
2017-08-11 10:23:52 +08:00
} ;
2005-04-16 15:20:36 -07:00
/* Initialize a block of memory as a command sequence.
* Return 0 if the initialization fails .
*/
2017-08-11 10:23:52 +08:00
static inline int sctp_init_cmd_seq ( struct sctp_cmd_seq * seq )
2014-07-04 14:35:51 +00:00
{
2014-07-04 14:35:57 +00:00
/* cmds[] is filled backwards to simplify the overflow BUG() check */
seq - > last_used_slot = seq - > cmds + SCTP_MAX_NUM_COMMANDS ;
seq - > next_cmd = seq - > last_used_slot ;
2014-07-04 14:35:51 +00:00
return 1 ; /* We always succeed. */
}
2005-04-16 15:20:36 -07:00
2017-08-11 10:23:52 +08:00
/* Add a command to an struct sctp_cmd_seq.
2005-04-16 15:20:36 -07:00
*
* Use the SCTP_ * constructors defined by SCTP_ARG_CONSTRUCTOR ( ) above
* to wrap data which goes in the obj argument .
*/
2017-08-11 10:23:54 +08:00
static inline void sctp_add_cmd_sf ( struct sctp_cmd_seq * seq ,
enum sctp_verb verb , union sctp_arg obj )
2014-07-04 14:35:51 +00:00
{
2017-08-11 10:23:51 +08:00
struct sctp_cmd * cmd = seq - > last_used_slot - 1 ;
2014-07-04 14:35:51 +00:00
2014-07-04 14:35:57 +00:00
BUG_ON ( cmd < seq - > cmds ) ;
cmd - > verb = verb ;
cmd - > obj = obj ;
seq - > last_used_slot = cmd ;
2014-07-04 14:35:51 +00:00
}
2005-04-16 15:20:36 -07:00
/* Return the next command structure in an sctp_cmd_seq.
* Return NULL at the end of the sequence .
*/
2017-08-11 10:23:52 +08:00
static inline struct sctp_cmd * sctp_next_cmd ( struct sctp_cmd_seq * seq )
2014-07-04 14:35:51 +00:00
{
2014-07-04 14:35:57 +00:00
if ( seq - > next_cmd < = seq - > last_used_slot )
return NULL ;
2014-07-04 14:35:51 +00:00
2014-07-04 14:35:57 +00:00
return - - seq - > next_cmd ;
2014-07-04 14:35:51 +00:00
}
2005-04-16 15:20:36 -07:00
2014-07-04 14:35:51 +00:00
# endif /* __net_sctp_command_h__ */