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