drivers: power: report battery voltage in AOSP compatible format
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / net / sctp / sm_statetable.c
CommitLineData
60c778b2 1/* SCTP kernel implementation
1da177e4
LT
2 * (C) Copyright IBM Corp. 2001, 2004
3 * Copyright (c) 1999-2000 Cisco, Inc.
4 * Copyright (c) 1999-2001 Motorola, Inc.
5 * Copyright (c) 2001 Intel Corp.
6 * Copyright (c) 2001 Nokia, Inc.
7 *
60c778b2 8 * This file is part of the SCTP kernel implementation
1da177e4
LT
9 *
10 * These are the state tables for the SCTP state machine.
11 *
60c778b2 12 * This SCTP implementation is free software;
1da177e4
LT
13 * you can redistribute it and/or modify it under the terms of
14 * the GNU General Public License as published by
15 * the Free Software Foundation; either version 2, or (at your option)
16 * any later version.
17 *
60c778b2 18 * This SCTP implementation is distributed in the hope that it
1da177e4
LT
19 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
20 * ************************
21 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22 * See the GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with GNU CC; see the file COPYING. If not, write to
26 * the Free Software Foundation, 59 Temple Place - Suite 330,
27 * Boston, MA 02111-1307, USA.
28 *
29 * Please send any bug reports or fixes you make to the
30 * email address(es):
31 * lksctp developers <lksctp-developers@lists.sourceforge.net>
32 *
33 * Or submit a bug report through the following website:
34 * http://www.sf.net/projects/lksctp
35 *
36 * Written or modified by:
37 * La Monte H.P. Yarroll <piggy@acm.org>
38 * Karl Knutson <karl@athena.chicago.il.us>
39 * Jon Grimm <jgrimm@us.ibm.com>
40 * Hui Huang <hui.huang@nokia.com>
41 * Daisy Chang <daisyc@us.ibm.com>
42 * Ardelle Fan <ardelle.fan@intel.com>
43 * Sridhar Samudrala <sri@us.ibm.com>
44 *
45 * Any bugs reported given to us we will try to fix... any fixes shared will
46 * be incorporated into the next SCTP release.
47 */
48
145ce502
JP
49#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
50
1da177e4
LT
51#include <linux/skbuff.h>
52#include <net/sctp/sctp.h>
53#include <net/sctp/sm.h>
54
55static const sctp_sm_table_entry_t
56primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES];
57static const sctp_sm_table_entry_t
58other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES];
59static const sctp_sm_table_entry_t
60timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES];
61
55e26eb9
EB
62static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(struct net *net,
63 sctp_cid_t cid,
1da177e4
LT
64 sctp_state_t state);
65
66
67static const sctp_sm_table_entry_t bug = {
68 .fn = sctp_sf_bug,
69 .name = "sctp_sf_bug"
70};
71
145ce502
JP
72#define DO_LOOKUP(_max, _type, _table) \
73({ \
74 const sctp_sm_table_entry_t *rtn; \
75 \
76 if ((event_subtype._type > (_max))) { \
77 pr_warn("table %p possible attack: event %d exceeds max %d\n", \
78 _table, event_subtype._type, _max); \
79 rtn = &bug; \
80 } else \
81 rtn = &_table[event_subtype._type][(int)state]; \
82 \
83 rtn; \
84})
1da177e4 85
55e26eb9
EB
86const sctp_sm_table_entry_t *sctp_sm_lookup_event(struct net *net,
87 sctp_event_t event_type,
1da177e4
LT
88 sctp_state_t state,
89 sctp_subtype_t event_subtype)
90{
91 switch (event_type) {
92 case SCTP_EVENT_T_CHUNK:
55e26eb9 93 return sctp_chunk_event_lookup(net, event_subtype.chunk, state);
1da177e4 94 case SCTP_EVENT_T_TIMEOUT:
145ce502
JP
95 return DO_LOOKUP(SCTP_EVENT_TIMEOUT_MAX, timeout,
96 timeout_event_table);
1da177e4 97 case SCTP_EVENT_T_OTHER:
145ce502
JP
98 return DO_LOOKUP(SCTP_EVENT_OTHER_MAX, other,
99 other_event_table);
1da177e4 100 case SCTP_EVENT_T_PRIMITIVE:
145ce502
JP
101 return DO_LOOKUP(SCTP_EVENT_PRIMITIVE_MAX, primitive,
102 primitive_event_table);
1da177e4
LT
103 default:
104 /* Yikes! We got an illegal event type. */
105 return &bug;
3ff50b79 106 }
1da177e4
LT
107}
108
1ed176a8
PZ
109#define TYPE_SCTP_FUNC(func) {.fn = func, .name = #func}
110
1da177e4 111#define TYPE_SCTP_DATA { \
1da177e4 112 /* SCTP_STATE_CLOSED */ \
ece25dfa 113 TYPE_SCTP_FUNC(sctp_sf_ootb), \
1da177e4 114 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 115 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 116 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 117 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 118 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 119 TYPE_SCTP_FUNC(sctp_sf_eat_data_6_2), \
1da177e4 120 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 121 TYPE_SCTP_FUNC(sctp_sf_eat_data_6_2), \
1da177e4 122 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 123 TYPE_SCTP_FUNC(sctp_sf_eat_data_fast_4_4), \
1da177e4 124 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 125 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 126 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 127 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
128} /* TYPE_SCTP_DATA */
129
130#define TYPE_SCTP_INIT { \
1da177e4 131 /* SCTP_STATE_CLOSED */ \
1ed176a8 132 TYPE_SCTP_FUNC(sctp_sf_do_5_1B_init), \
1da177e4 133 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 134 TYPE_SCTP_FUNC(sctp_sf_do_5_2_1_siminit), \
1da177e4 135 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 136 TYPE_SCTP_FUNC(sctp_sf_do_5_2_1_siminit), \
1da177e4 137 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 138 TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
1da177e4 139 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 140 TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
1da177e4 141 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 142 TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
1da177e4 143 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 144 TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
1da177e4 145 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 146 TYPE_SCTP_FUNC(sctp_sf_do_9_2_reshutack), \
1da177e4
LT
147} /* TYPE_SCTP_INIT */
148
149#define TYPE_SCTP_INIT_ACK { \
1da177e4 150 /* SCTP_STATE_CLOSED */ \
610ab73a 151 TYPE_SCTP_FUNC(sctp_sf_do_5_2_3_initack), \
1da177e4 152 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 153 TYPE_SCTP_FUNC(sctp_sf_do_5_1C_ack), \
1da177e4 154 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 155 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 156 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 157 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 158 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 159 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 160 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 161 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 162 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 163 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 164 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 165 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
166} /* TYPE_SCTP_INIT_ACK */
167
168#define TYPE_SCTP_SACK { \
1da177e4 169 /* SCTP_STATE_CLOSED */ \
ece25dfa 170 TYPE_SCTP_FUNC(sctp_sf_ootb), \
1da177e4 171 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 172 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 173 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 174 TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
1da177e4 175 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 176 TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
1da177e4 177 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 178 TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
1da177e4 179 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 180 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 181 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 182 TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
1da177e4 183 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 184 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
185} /* TYPE_SCTP_SACK */
186
187#define TYPE_SCTP_HEARTBEAT { \
1da177e4 188 /* SCTP_STATE_CLOSED */ \
ece25dfa 189 TYPE_SCTP_FUNC(sctp_sf_ootb), \
1da177e4 190 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 191 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 192 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 193 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
1da177e4 194 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 195 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
1da177e4 196 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 197 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
1da177e4 198 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 199 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
1da177e4 200 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 201 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
1da177e4
LT
202 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
203 /* This should not happen, but we are nice. */ \
1ed176a8 204 TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
1da177e4
LT
205} /* TYPE_SCTP_HEARTBEAT */
206
207#define TYPE_SCTP_HEARTBEAT_ACK { \
1da177e4 208 /* SCTP_STATE_CLOSED */ \
ece25dfa 209 TYPE_SCTP_FUNC(sctp_sf_ootb), \
1da177e4 210 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 211 TYPE_SCTP_FUNC(sctp_sf_violation), \
1da177e4 212 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 213 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 214 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 215 TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
1da177e4 216 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 217 TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
1da177e4 218 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 219 TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
1da177e4 220 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 221 TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
1da177e4 222 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 223 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
224} /* TYPE_SCTP_HEARTBEAT_ACK */
225
226#define TYPE_SCTP_ABORT { \
1da177e4 227 /* SCTP_STATE_CLOSED */ \
1ed176a8 228 TYPE_SCTP_FUNC(sctp_sf_pdiscard), \
1da177e4 229 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 230 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_abort), \
1da177e4 231 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 232 TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_abort), \
1da177e4 233 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 234 TYPE_SCTP_FUNC(sctp_sf_do_9_1_abort), \
1da177e4 235 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 236 TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_abort), \
1da177e4 237 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 238 TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_abort), \
1da177e4 239 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 240 TYPE_SCTP_FUNC(sctp_sf_do_9_1_abort), \
1da177e4 241 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 242 TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_abort), \
1da177e4
LT
243} /* TYPE_SCTP_ABORT */
244
245#define TYPE_SCTP_SHUTDOWN { \
1da177e4 246 /* SCTP_STATE_CLOSED */ \
ece25dfa 247 TYPE_SCTP_FUNC(sctp_sf_ootb), \
1da177e4 248 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 249 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 250 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 251 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 252 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 253 TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown), \
1da177e4 254 /* SCTP_STATE_SHUTDOWN_PENDING */ \
cf896d51 255 TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown), \
1da177e4 256 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 257 TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \
1da177e4 258 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
2e3f92da 259 TYPE_SCTP_FUNC(sctp_sf_do_9_2_shut_ctsn), \
1da177e4 260 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 261 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
262} /* TYPE_SCTP_SHUTDOWN */
263
264#define TYPE_SCTP_SHUTDOWN_ACK { \
1da177e4 265 /* SCTP_STATE_CLOSED */ \
1ed176a8 266 TYPE_SCTP_FUNC(sctp_sf_ootb), \
1da177e4 267 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 268 TYPE_SCTP_FUNC(sctp_sf_do_8_5_1_E_sa), \
1da177e4 269 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 270 TYPE_SCTP_FUNC(sctp_sf_do_8_5_1_E_sa), \
1da177e4 271 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 272 TYPE_SCTP_FUNC(sctp_sf_violation), \
1da177e4 273 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 274 TYPE_SCTP_FUNC(sctp_sf_violation), \
1da177e4 275 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 276 TYPE_SCTP_FUNC(sctp_sf_do_9_2_final), \
1da177e4 277 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 278 TYPE_SCTP_FUNC(sctp_sf_violation), \
1da177e4 279 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 280 TYPE_SCTP_FUNC(sctp_sf_do_9_2_final), \
1da177e4
LT
281} /* TYPE_SCTP_SHUTDOWN_ACK */
282
283#define TYPE_SCTP_ERROR { \
1da177e4 284 /* SCTP_STATE_CLOSED */ \
ece25dfa 285 TYPE_SCTP_FUNC(sctp_sf_ootb), \
1da177e4 286 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 287 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 288 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 289 TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_err), \
1da177e4 290 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 291 TYPE_SCTP_FUNC(sctp_sf_operr_notify), \
1da177e4 292 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 293 TYPE_SCTP_FUNC(sctp_sf_operr_notify), \
1da177e4 294 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 295 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 296 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 297 TYPE_SCTP_FUNC(sctp_sf_operr_notify), \
1da177e4 298 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 299 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
300} /* TYPE_SCTP_ERROR */
301
302#define TYPE_SCTP_COOKIE_ECHO { \
1da177e4 303 /* SCTP_STATE_CLOSED */ \
1ed176a8 304 TYPE_SCTP_FUNC(sctp_sf_do_5_1D_ce), \
1da177e4 305 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 306 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
1da177e4 307 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 308 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
1da177e4 309 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 310 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
1da177e4 311 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 312 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
1da177e4 313 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 314 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
1da177e4 315 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 316 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
1da177e4 317 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 318 TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
1da177e4
LT
319} /* TYPE_SCTP_COOKIE_ECHO */
320
321#define TYPE_SCTP_COOKIE_ACK { \
1da177e4 322 /* SCTP_STATE_CLOSED */ \
1ed176a8 323 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 324 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 325 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 326 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 327 TYPE_SCTP_FUNC(sctp_sf_do_5_1E_ca), \
1da177e4 328 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 329 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 330 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 331 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 332 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 333 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 334 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 335 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 336 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 337 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
338} /* TYPE_SCTP_COOKIE_ACK */
339
340#define TYPE_SCTP_ECN_ECNE { \
1da177e4 341 /* SCTP_STATE_CLOSED */ \
1ed176a8 342 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 343 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 344 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 345 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 346 TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
1da177e4 347 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 348 TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
1da177e4 349 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 350 TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
1da177e4 351 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 352 TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
1da177e4 353 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 354 TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
1da177e4 355 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 356 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
357} /* TYPE_SCTP_ECN_ECNE */
358
359#define TYPE_SCTP_ECN_CWR { \
1da177e4 360 /* SCTP_STATE_CLOSED */ \
1ed176a8 361 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 362 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 363 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 364 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 365 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 366 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 367 TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \
1da177e4 368 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 369 TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \
1da177e4 370 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 371 TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \
1da177e4 372 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 373 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 374 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 375 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
376} /* TYPE_SCTP_ECN_CWR */
377
378#define TYPE_SCTP_SHUTDOWN_COMPLETE { \
1da177e4 379 /* SCTP_STATE_CLOSED */ \
1ed176a8 380 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 381 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 382 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 383 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 384 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 385 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 386 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 387 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 388 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 389 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 390 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 391 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 392 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 393 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 394 TYPE_SCTP_FUNC(sctp_sf_do_4_C), \
1da177e4
LT
395} /* TYPE_SCTP_SHUTDOWN_COMPLETE */
396
397/* The primary index for this table is the chunk type.
398 * The secondary index for this table is the state.
399 *
400 * For base protocol (RFC 2960).
401 */
402static const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
403 TYPE_SCTP_DATA,
404 TYPE_SCTP_INIT,
405 TYPE_SCTP_INIT_ACK,
406 TYPE_SCTP_SACK,
407 TYPE_SCTP_HEARTBEAT,
408 TYPE_SCTP_HEARTBEAT_ACK,
409 TYPE_SCTP_ABORT,
410 TYPE_SCTP_SHUTDOWN,
411 TYPE_SCTP_SHUTDOWN_ACK,
412 TYPE_SCTP_ERROR,
413 TYPE_SCTP_COOKIE_ECHO,
414 TYPE_SCTP_COOKIE_ACK,
415 TYPE_SCTP_ECN_ECNE,
416 TYPE_SCTP_ECN_CWR,
417 TYPE_SCTP_SHUTDOWN_COMPLETE,
418}; /* state_fn_t chunk_event_table[][] */
419
420#define TYPE_SCTP_ASCONF { \
1da177e4 421 /* SCTP_STATE_CLOSED */ \
1ed176a8 422 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 423 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 424 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 425 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 426 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 427 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 428 TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
1da177e4 429 /* SCTP_STATE_SHUTDOWN_PENDING */ \
ba8a06da 430 TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
1da177e4 431 /* SCTP_STATE_SHUTDOWN_SENT */ \
ba8a06da 432 TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
1da177e4 433 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
ba8a06da 434 TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
1da177e4 435 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 436 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
437} /* TYPE_SCTP_ASCONF */
438
439#define TYPE_SCTP_ASCONF_ACK { \
1da177e4 440 /* SCTP_STATE_CLOSED */ \
1ed176a8 441 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 442 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 443 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 444 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 445 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 446 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 447 TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
1da177e4 448 /* SCTP_STATE_SHUTDOWN_PENDING */ \
ba8a06da 449 TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
1da177e4 450 /* SCTP_STATE_SHUTDOWN_SENT */ \
ba8a06da 451 TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
1da177e4 452 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
ba8a06da 453 TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
1da177e4 454 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 455 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
456} /* TYPE_SCTP_ASCONF_ACK */
457
458/* The primary index for this table is the chunk type.
459 * The secondary index for this table is the state.
460 */
461static const sctp_sm_table_entry_t addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
462 TYPE_SCTP_ASCONF,
463 TYPE_SCTP_ASCONF_ACK,
464}; /*state_fn_t addip_chunk_event_table[][] */
465
466#define TYPE_SCTP_FWD_TSN { \
1da177e4 467 /* SCTP_STATE_CLOSED */ \
ece25dfa 468 TYPE_SCTP_FUNC(sctp_sf_ootb), \
1da177e4 469 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 470 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 471 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 472 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 473 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 474 TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \
1da177e4 475 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 476 TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \
1da177e4 477 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 478 TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn_fast), \
1da177e4 479 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 480 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4 481 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 482 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
1da177e4
LT
483} /* TYPE_SCTP_FWD_TSN */
484
485/* The primary index for this table is the chunk type.
486 * The secondary index for this table is the state.
487 */
488static const sctp_sm_table_entry_t prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
489 TYPE_SCTP_FWD_TSN,
490}; /*state_fn_t prsctp_chunk_event_table[][] */
491
bbd0d598 492#define TYPE_SCTP_AUTH { \
bbd0d598
VY
493 /* SCTP_STATE_CLOSED */ \
494 TYPE_SCTP_FUNC(sctp_sf_ootb), \
495 /* SCTP_STATE_COOKIE_WAIT */ \
496 TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
497 /* SCTP_STATE_COOKIE_ECHOED */ \
498 TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
499 /* SCTP_STATE_ESTABLISHED */ \
500 TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
501 /* SCTP_STATE_SHUTDOWN_PENDING */ \
502 TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
503 /* SCTP_STATE_SHUTDOWN_SENT */ \
504 TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
505 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
506 TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
507 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
508 TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
509} /* TYPE_SCTP_AUTH */
510
511/* The primary index for this table is the chunk type.
512 * The secondary index for this table is the state.
513 */
514static const sctp_sm_table_entry_t auth_chunk_event_table[SCTP_NUM_AUTH_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
515 TYPE_SCTP_AUTH,
516}; /*state_fn_t auth_chunk_event_table[][] */
517
1da177e4
LT
518static const sctp_sm_table_entry_t
519chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
1da177e4 520 /* SCTP_STATE_CLOSED */
ece25dfa 521 TYPE_SCTP_FUNC(sctp_sf_ootb),
1da177e4 522 /* SCTP_STATE_COOKIE_WAIT */
1ed176a8 523 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 524 /* SCTP_STATE_COOKIE_ECHOED */
1ed176a8 525 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 526 /* SCTP_STATE_ESTABLISHED */
1ed176a8 527 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 528 /* SCTP_STATE_SHUTDOWN_PENDING */
1ed176a8 529 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 530 /* SCTP_STATE_SHUTDOWN_SENT */
1ed176a8 531 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 532 /* SCTP_STATE_SHUTDOWN_RECEIVED */
1ed176a8 533 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4 534 /* SCTP_STATE_SHUTDOWN_ACK_SENT */
1ed176a8 535 TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
1da177e4
LT
536}; /* chunk unknown */
537
538
539#define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \
1da177e4 540 /* SCTP_STATE_CLOSED */ \
1ed176a8 541 TYPE_SCTP_FUNC(sctp_sf_do_prm_asoc), \
1da177e4 542 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 543 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 544 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 545 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 546 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 547 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 548 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 549 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 550 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 551 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 552 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 553 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4 554 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 555 TYPE_SCTP_FUNC(sctp_sf_not_impl), \
1da177e4
LT
556} /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
557
558#define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \
1da177e4 559 /* SCTP_STATE_CLOSED */ \
1ed176a8 560 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 561 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 562 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_shutdown), \
1da177e4 563 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 564 TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_shutdown),\
1da177e4 565 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 566 TYPE_SCTP_FUNC(sctp_sf_do_9_2_prm_shutdown), \
1da177e4 567 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 568 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
1da177e4 569 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 570 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
1da177e4 571 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 572 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
1da177e4 573 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 574 TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
1da177e4
LT
575} /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
576
577#define TYPE_SCTP_PRIMITIVE_ABORT { \
1da177e4 578 /* SCTP_STATE_CLOSED */ \
1ed176a8 579 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 580 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 581 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_abort), \
1da177e4 582 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 583 TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_abort), \
1da177e4 584 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 585 TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
1da177e4 586 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 587 TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_prm_abort), \
1da177e4 588 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 589 TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_prm_abort), \
1da177e4 590 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 591 TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
1da177e4 592 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 593 TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_prm_abort), \
1da177e4
LT
594} /* TYPE_SCTP_PRIMITIVE_ABORT */
595
596#define TYPE_SCTP_PRIMITIVE_SEND { \
1da177e4 597 /* SCTP_STATE_CLOSED */ \
1ed176a8 598 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 599 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 600 TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
1da177e4 601 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 602 TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
1da177e4 603 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 604 TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
1da177e4 605 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 606 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
1da177e4 607 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 608 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
1da177e4 609 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 610 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
1da177e4 611 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 612 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
1da177e4
LT
613} /* TYPE_SCTP_PRIMITIVE_SEND */
614
615#define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \
1da177e4 616 /* SCTP_STATE_CLOSED */ \
1ed176a8 617 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 618 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 619 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 620 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 621 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 622 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 623 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 624 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 625 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 626 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 627 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 628 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 629 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4 630 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 631 TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \
1da177e4
LT
632} /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
633
634#define TYPE_SCTP_PRIMITIVE_ASCONF { \
1da177e4 635 /* SCTP_STATE_CLOSED */ \
1ed176a8 636 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 637 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 638 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 639 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 640 TYPE_SCTP_FUNC(sctp_sf_error_closed), \
1da177e4 641 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 642 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
1da177e4 643 /* SCTP_STATE_SHUTDOWN_PENDING */ \
ba8a06da 644 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
1da177e4 645 /* SCTP_STATE_SHUTDOWN_SENT */ \
ba8a06da 646 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
1da177e4 647 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
ba8a06da 648 TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
1da177e4 649 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 650 TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
4553e88d 651} /* TYPE_SCTP_PRIMITIVE_ASCONF */
1da177e4
LT
652
653/* The primary index for this table is the primitive type.
654 * The secondary index for this table is the state.
655 */
656static const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = {
657 TYPE_SCTP_PRIMITIVE_ASSOCIATE,
658 TYPE_SCTP_PRIMITIVE_SHUTDOWN,
659 TYPE_SCTP_PRIMITIVE_ABORT,
660 TYPE_SCTP_PRIMITIVE_SEND,
661 TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
662 TYPE_SCTP_PRIMITIVE_ASCONF,
663};
664
665#define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
1da177e4 666 /* SCTP_STATE_CLOSED */ \
1ed176a8 667 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 668 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 669 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 670 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 671 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 672 /* SCTP_STATE_ESTABLISHED */ \
e1cdd553 673 TYPE_SCTP_FUNC(sctp_sf_do_no_pending_tsn), \
1da177e4 674 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 675 TYPE_SCTP_FUNC(sctp_sf_do_9_2_start_shutdown), \
1da177e4 676 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 677 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 678 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 679 TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \
1da177e4 680 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 681 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4
LT
682}
683
684#define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH { \
1da177e4 685 /* SCTP_STATE_CLOSED */ \
1ed176a8 686 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 687 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 688 TYPE_SCTP_FUNC(sctp_sf_cookie_wait_icmp_abort), \
1da177e4 689 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 690 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 691 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 692 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 693 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 694 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 695 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 696 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 697 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 698 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4 699 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 700 TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
1da177e4
LT
701}
702
703static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = {
704 TYPE_SCTP_OTHER_NO_PENDING_TSN,
705 TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH,
706};
707
708#define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
1da177e4 709 /* SCTP_STATE_CLOSED */ \
1ed176a8 710 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 711 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 712 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 713 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 714 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 715 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 716 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 717 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 718 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 719 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 720 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 721 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 722 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 723 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 724 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4
LT
725}
726
727#define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
1da177e4 728 /* SCTP_STATE_CLOSED */ \
1ed176a8 729 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 730 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 731 TYPE_SCTP_FUNC(sctp_sf_bug), \
1da177e4 732 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 733 TYPE_SCTP_FUNC(sctp_sf_t1_cookie_timer_expire), \
1da177e4 734 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 735 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 736 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 737 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 738 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 739 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 740 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 741 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 742 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 743 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
744}
745
746#define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
1da177e4 747 /* SCTP_STATE_CLOSED */ \
1ed176a8 748 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 749 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 750 TYPE_SCTP_FUNC(sctp_sf_t1_init_timer_expire), \
1da177e4 751 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 752 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 753 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 754 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 755 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 756 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 757 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 758 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 759 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 760 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 761 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 762 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
763}
764
765#define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
1da177e4 766 /* SCTP_STATE_CLOSED */ \
1ed176a8 767 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 768 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 769 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 770 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 771 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 772 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 773 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 774 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 775 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 776 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 777 TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
1da177e4 778 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 779 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 780 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 781 TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
1da177e4
LT
782}
783
784#define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
1da177e4 785 /* SCTP_STATE_CLOSED */ \
1ed176a8 786 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 787 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 788 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 789 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 790 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
1da177e4 791 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 792 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
1da177e4 793 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 794 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
1da177e4 795 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 796 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 797 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 798 TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
1da177e4 799 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 800 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
801}
802
803#define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
1da177e4 804 /* SCTP_STATE_CLOSED */ \
1ed176a8 805 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 806 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 807 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 808 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 809 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 810 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 811 TYPE_SCTP_FUNC(sctp_sf_t4_timer_expire), \
1da177e4 812 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 813 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 814 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 815 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 816 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 817 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 818 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 819 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
820}
821
822#define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
1da177e4 823 /* SCTP_STATE_CLOSED */ \
1ed176a8 824 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 825 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 826 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 827 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 828 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 829 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 830 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 831 /* SCTP_STATE_SHUTDOWN_PENDING */ \
f8d96052 832 TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
1da177e4 833 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 834 TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
1da177e4 835 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 836 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 837 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 838 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
839}
840
841#define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
1da177e4 842 /* SCTP_STATE_CLOSED */ \
1ed176a8 843 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 844 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 845 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 846 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 847 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 848 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 849 TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
1da177e4 850 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 851 TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
1da177e4 852 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 853 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 854 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 855 TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
1da177e4 856 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 857 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
858}
859
860#define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
1da177e4 861 /* SCTP_STATE_CLOSED */ \
1ed176a8 862 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 863 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 864 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 865 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 866 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 867 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 868 TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
1da177e4 869 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 870 TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
1da177e4 871 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 872 TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
1da177e4 873 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 874 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 875 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 876 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
877}
878
879#define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
1da177e4 880 /* SCTP_STATE_CLOSED */ \
1ed176a8 881 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 882 /* SCTP_STATE_COOKIE_WAIT */ \
1ed176a8 883 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 884 /* SCTP_STATE_COOKIE_ECHOED */ \
1ed176a8 885 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 886 /* SCTP_STATE_ESTABLISHED */ \
1ed176a8 887 TYPE_SCTP_FUNC(sctp_sf_autoclose_timer_expire), \
1da177e4 888 /* SCTP_STATE_SHUTDOWN_PENDING */ \
1ed176a8 889 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 890 /* SCTP_STATE_SHUTDOWN_SENT */ \
1ed176a8 891 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 892 /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
1ed176a8 893 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4 894 /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
1ed176a8 895 TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
1da177e4
LT
896}
897
898static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
899 TYPE_SCTP_EVENT_TIMEOUT_NONE,
900 TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
901 TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
902 TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
903 TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
904 TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
905 TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
906 TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
907 TYPE_SCTP_EVENT_TIMEOUT_SACK,
908 TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
909};
910
55e26eb9
EB
911static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(struct net *net,
912 sctp_cid_t cid,
1da177e4
LT
913 sctp_state_t state)
914{
915 if (state > SCTP_STATE_MAX)
916 return &bug;
917
75202e76 918 if (cid <= SCTP_CID_BASE_MAX)
1da177e4
LT
919 return &chunk_event_table[cid][state];
920
e1fc3b14 921 if (net->sctp.prsctp_enable) {
1da177e4
LT
922 if (cid == SCTP_CID_FWD_TSN)
923 return &prsctp_chunk_event_table[0][state];
924 }
925
e1fc3b14 926 if (net->sctp.addip_enable) {
1da177e4
LT
927 if (cid == SCTP_CID_ASCONF)
928 return &addip_chunk_event_table[0][state];
929
930 if (cid == SCTP_CID_ASCONF_ACK)
931 return &addip_chunk_event_table[1][state];
932 }
933
e1fc3b14 934 if (net->sctp.auth_enable) {
bbd0d598
VY
935 if (cid == SCTP_CID_AUTH)
936 return &auth_chunk_event_table[0][state];
937 }
938
1da177e4
LT
939 return &chunk_event_table_unknown[state];
940}