0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #ifndef __net_sctp_command_h__
0022 #define __net_sctp_command_h__
0023
0024 #include <net/sctp/constants.h>
0025 #include <net/sctp/structs.h>
0026
0027
0028 enum sctp_verb {
0029 SCTP_CMD_NOP = 0,
0030 SCTP_CMD_NEW_ASOC,
0031 SCTP_CMD_DELETE_TCB,
0032 SCTP_CMD_NEW_STATE,
0033 SCTP_CMD_REPORT_TSN,
0034 SCTP_CMD_GEN_SACK,
0035 SCTP_CMD_PROCESS_SACK,
0036 SCTP_CMD_GEN_INIT_ACK,
0037 SCTP_CMD_PEER_INIT,
0038 SCTP_CMD_GEN_COOKIE_ECHO,
0039 SCTP_CMD_CHUNK_ULP,
0040 SCTP_CMD_EVENT_ULP,
0041 SCTP_CMD_REPLY,
0042 SCTP_CMD_SEND_PKT,
0043 SCTP_CMD_RETRAN,
0044 SCTP_CMD_ECN_CE,
0045 SCTP_CMD_ECN_ECNE,
0046 SCTP_CMD_ECN_CWR,
0047 SCTP_CMD_TIMER_START,
0048 SCTP_CMD_TIMER_START_ONCE,
0049 SCTP_CMD_TIMER_RESTART,
0050 SCTP_CMD_TIMER_STOP,
0051 SCTP_CMD_INIT_CHOOSE_TRANSPORT,
0052 SCTP_CMD_INIT_COUNTER_RESET,
0053 SCTP_CMD_INIT_COUNTER_INC,
0054 SCTP_CMD_INIT_RESTART,
0055 SCTP_CMD_COOKIEECHO_RESTART,
0056 SCTP_CMD_INIT_FAILED,
0057 SCTP_CMD_REPORT_DUP,
0058 SCTP_CMD_STRIKE,
0059 SCTP_CMD_HB_TIMERS_START,
0060 SCTP_CMD_HB_TIMER_UPDATE,
0061 SCTP_CMD_HB_TIMERS_STOP,
0062 SCTP_CMD_PROBE_TIMER_UPDATE,
0063 SCTP_CMD_TRANSPORT_HB_SENT,
0064 SCTP_CMD_TRANSPORT_IDLE,
0065 SCTP_CMD_TRANSPORT_ON,
0066 SCTP_CMD_REPORT_ERROR,
0067 SCTP_CMD_REPORT_BAD_TAG,
0068 SCTP_CMD_PROCESS_CTSN,
0069 SCTP_CMD_ASSOC_FAILED,
0070 SCTP_CMD_DISCARD_PACKET,
0071 SCTP_CMD_GEN_SHUTDOWN,
0072 SCTP_CMD_PURGE_OUTQUEUE,
0073 SCTP_CMD_SETUP_T2,
0074 SCTP_CMD_RTO_PENDING,
0075 SCTP_CMD_PART_DELIVER,
0076 SCTP_CMD_RENEGE,
0077 SCTP_CMD_SETUP_T4,
0078 SCTP_CMD_PROCESS_OPERR,
0079 SCTP_CMD_REPORT_FWDTSN,
0080 SCTP_CMD_PROCESS_FWDTSN,
0081 SCTP_CMD_CLEAR_INIT_TAG,
0082 SCTP_CMD_DEL_NON_PRIMARY,
0083 SCTP_CMD_T3_RTX_TIMERS_STOP,
0084 SCTP_CMD_FORCE_PRIM_RETRAN,
0085 SCTP_CMD_SET_SK_ERR,
0086 SCTP_CMD_ASSOC_CHANGE,
0087 SCTP_CMD_ADAPTATION_IND,
0088 SCTP_CMD_PEER_NO_AUTH,
0089 SCTP_CMD_ASSOC_SHKEY,
0090 SCTP_CMD_T1_RETRAN,
0091 SCTP_CMD_UPDATE_INITTAG,
0092 SCTP_CMD_SEND_MSG,
0093 SCTP_CMD_PURGE_ASCONF_QUEUE,
0094 SCTP_CMD_SET_ASOC,
0095 SCTP_CMD_LAST
0096 };
0097
0098
0099
0100
0101
0102
0103 #define SCTP_MAX_NUM_COMMANDS 20
0104
0105 union sctp_arg {
0106 void *zero_all;
0107 __s32 i32;
0108 __u32 u32;
0109 __be32 be32;
0110 __u16 u16;
0111 __u8 u8;
0112 int error;
0113 __be16 err;
0114 enum sctp_state state;
0115 enum sctp_event_timeout to;
0116 struct sctp_chunk *chunk;
0117 struct sctp_association *asoc;
0118 struct sctp_transport *transport;
0119 struct sctp_bind_addr *bp;
0120 struct sctp_init_chunk *init;
0121 struct sctp_ulpevent *ulpevent;
0122 struct sctp_packet *packet;
0123 struct sctp_sackhdr *sackh;
0124 struct sctp_datamsg *msg;
0125 };
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139 #define SCTP_ARG_CONSTRUCTOR(name, type, elt) \
0140 static inline union sctp_arg \
0141 SCTP_## name (type arg) \
0142 { union sctp_arg retval;\
0143 retval.zero_all = NULL;\
0144 retval.elt = arg;\
0145 return retval;\
0146 }
0147
0148 SCTP_ARG_CONSTRUCTOR(I32, __s32, i32)
0149 SCTP_ARG_CONSTRUCTOR(U32, __u32, u32)
0150 SCTP_ARG_CONSTRUCTOR(BE32, __be32, be32)
0151 SCTP_ARG_CONSTRUCTOR(U16, __u16, u16)
0152 SCTP_ARG_CONSTRUCTOR(U8, __u8, u8)
0153 SCTP_ARG_CONSTRUCTOR(ERROR, int, error)
0154 SCTP_ARG_CONSTRUCTOR(PERR, __be16, err)
0155 SCTP_ARG_CONSTRUCTOR(STATE, enum sctp_state, state)
0156 SCTP_ARG_CONSTRUCTOR(TO, enum sctp_event_timeout, to)
0157 SCTP_ARG_CONSTRUCTOR(CHUNK, struct sctp_chunk *, chunk)
0158 SCTP_ARG_CONSTRUCTOR(ASOC, struct sctp_association *, asoc)
0159 SCTP_ARG_CONSTRUCTOR(TRANSPORT, struct sctp_transport *, transport)
0160 SCTP_ARG_CONSTRUCTOR(BA, struct sctp_bind_addr *, bp)
0161 SCTP_ARG_CONSTRUCTOR(PEER_INIT, struct sctp_init_chunk *, init)
0162 SCTP_ARG_CONSTRUCTOR(ULPEVENT, struct sctp_ulpevent *, ulpevent)
0163 SCTP_ARG_CONSTRUCTOR(PACKET, struct sctp_packet *, packet)
0164 SCTP_ARG_CONSTRUCTOR(SACKH, struct sctp_sackhdr *, sackh)
0165 SCTP_ARG_CONSTRUCTOR(DATAMSG, struct sctp_datamsg *, msg)
0166
0167 static inline union sctp_arg SCTP_FORCE(void)
0168 {
0169 return SCTP_I32(1);
0170 }
0171
0172 static inline union sctp_arg SCTP_NOFORCE(void)
0173 {
0174 return SCTP_I32(0);
0175 }
0176
0177 static inline union sctp_arg SCTP_NULL(void)
0178 {
0179 union sctp_arg retval;
0180 retval.zero_all = NULL;
0181 return retval;
0182 }
0183
0184 struct sctp_cmd {
0185 union sctp_arg obj;
0186 enum sctp_verb verb;
0187 };
0188
0189 struct sctp_cmd_seq {
0190 struct sctp_cmd cmds[SCTP_MAX_NUM_COMMANDS];
0191 struct sctp_cmd *last_used_slot;
0192 struct sctp_cmd *next_cmd;
0193 };
0194
0195
0196
0197
0198
0199 static inline int sctp_init_cmd_seq(struct sctp_cmd_seq *seq)
0200 {
0201
0202 seq->last_used_slot = seq->cmds + SCTP_MAX_NUM_COMMANDS;
0203 seq->next_cmd = seq->last_used_slot;
0204 return 1;
0205 }
0206
0207
0208
0209
0210
0211
0212
0213 static inline void sctp_add_cmd_sf(struct sctp_cmd_seq *seq,
0214 enum sctp_verb verb, union sctp_arg obj)
0215 {
0216 struct sctp_cmd *cmd = seq->last_used_slot - 1;
0217
0218 BUG_ON(cmd < seq->cmds);
0219
0220 cmd->verb = verb;
0221 cmd->obj = obj;
0222 seq->last_used_slot = cmd;
0223 }
0224
0225
0226
0227
0228 static inline struct sctp_cmd *sctp_next_cmd(struct sctp_cmd_seq *seq)
0229 {
0230 if (seq->next_cmd <= seq->last_used_slot)
0231 return NULL;
0232
0233 return --seq->next_cmd;
0234 }
0235
0236 #endif