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