• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/net/sctp/
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 <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_ootb), \
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_ootb), \
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_ootb), \
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_ootb), \
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_ootb), \
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_do_9_2_shutdown), \
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_do_9_2_shut_ctsn), \
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_ootb), \
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_do_asconf), \
461	/* SCTP_STATE_SHUTDOWN_SENT */ \
462	TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
463	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
464	TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
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_do_asconf_ack), \
482	/* SCTP_STATE_SHUTDOWN_SENT */ \
483	TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
484	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
485	TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
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_ootb), \
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
526#define TYPE_SCTP_AUTH { \
527	/* SCTP_STATE_EMPTY */ \
528	TYPE_SCTP_FUNC(sctp_sf_ootb), \
529	/* SCTP_STATE_CLOSED */ \
530	TYPE_SCTP_FUNC(sctp_sf_ootb), \
531	/* SCTP_STATE_COOKIE_WAIT */ \
532	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
533	/* SCTP_STATE_COOKIE_ECHOED */ \
534	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
535	/* SCTP_STATE_ESTABLISHED */ \
536	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
537	/* SCTP_STATE_SHUTDOWN_PENDING */ \
538	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
539	/* SCTP_STATE_SHUTDOWN_SENT */ \
540	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
541	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
542	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
543	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
544	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
545} /* TYPE_SCTP_AUTH */
546
547/* The primary index for this table is the chunk type.
548 * The secondary index for this table is the state.
549 */
550static const sctp_sm_table_entry_t auth_chunk_event_table[SCTP_NUM_AUTH_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
551	TYPE_SCTP_AUTH,
552}; /*state_fn_t auth_chunk_event_table[][] */
553
554static const sctp_sm_table_entry_t
555chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
556	/* SCTP_STATE_EMPTY */
557	TYPE_SCTP_FUNC(sctp_sf_ootb),
558	/* SCTP_STATE_CLOSED */
559	TYPE_SCTP_FUNC(sctp_sf_ootb),
560	/* SCTP_STATE_COOKIE_WAIT */
561	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
562	/* SCTP_STATE_COOKIE_ECHOED */
563	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
564	/* SCTP_STATE_ESTABLISHED */
565	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
566	/* SCTP_STATE_SHUTDOWN_PENDING */
567	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
568	/* SCTP_STATE_SHUTDOWN_SENT */
569	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
570	/* SCTP_STATE_SHUTDOWN_RECEIVED */
571	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
572	/* SCTP_STATE_SHUTDOWN_ACK_SENT */
573	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
574};	/* chunk unknown */
575
576
577#define TYPE_SCTP_PRIMITIVE_ASSOCIATE  { \
578	/* SCTP_STATE_EMPTY */ \
579	TYPE_SCTP_FUNC(sctp_sf_bug), \
580	/* SCTP_STATE_CLOSED */ \
581	TYPE_SCTP_FUNC(sctp_sf_do_prm_asoc), \
582	/* SCTP_STATE_COOKIE_WAIT */ \
583	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
584	/* SCTP_STATE_COOKIE_ECHOED */ \
585	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
586	/* SCTP_STATE_ESTABLISHED */ \
587	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
588	/* SCTP_STATE_SHUTDOWN_PENDING */ \
589	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
590	/* SCTP_STATE_SHUTDOWN_SENT */ \
591	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
592	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
593	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
594	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
595	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
596} /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */
597
598#define TYPE_SCTP_PRIMITIVE_SHUTDOWN  { \
599	/* SCTP_STATE_EMPTY */ \
600	TYPE_SCTP_FUNC(sctp_sf_bug), \
601	/* SCTP_STATE_CLOSED */ \
602	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
603	/* SCTP_STATE_COOKIE_WAIT */ \
604	TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_shutdown), \
605	/* SCTP_STATE_COOKIE_ECHOED */ \
606	TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_shutdown),\
607	/* SCTP_STATE_ESTABLISHED */ \
608	TYPE_SCTP_FUNC(sctp_sf_do_9_2_prm_shutdown), \
609	/* SCTP_STATE_SHUTDOWN_PENDING */ \
610	TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
611	/* SCTP_STATE_SHUTDOWN_SENT */ \
612	TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
613	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
614	TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
615	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
616	TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
617} /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */
618
619#define TYPE_SCTP_PRIMITIVE_ABORT  { \
620	/* SCTP_STATE_EMPTY */ \
621	TYPE_SCTP_FUNC(sctp_sf_bug), \
622	/* SCTP_STATE_CLOSED */ \
623	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
624	/* SCTP_STATE_COOKIE_WAIT */ \
625	TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_abort), \
626	/* SCTP_STATE_COOKIE_ECHOED */ \
627	TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_abort), \
628	/* SCTP_STATE_ESTABLISHED */ \
629	TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
630	/* SCTP_STATE_SHUTDOWN_PENDING */ \
631	TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_prm_abort), \
632	/* SCTP_STATE_SHUTDOWN_SENT */ \
633	TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_prm_abort), \
634	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
635	TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
636	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
637	TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_prm_abort), \
638} /* TYPE_SCTP_PRIMITIVE_ABORT */
639
640#define TYPE_SCTP_PRIMITIVE_SEND  { \
641	/* SCTP_STATE_EMPTY */ \
642	TYPE_SCTP_FUNC(sctp_sf_bug), \
643	/* SCTP_STATE_CLOSED */ \
644	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
645	/* SCTP_STATE_COOKIE_WAIT */ \
646	TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
647	/* SCTP_STATE_COOKIE_ECHOED */ \
648	TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
649	/* SCTP_STATE_ESTABLISHED */ \
650	TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
651	/* SCTP_STATE_SHUTDOWN_PENDING */ \
652	TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
653	/* SCTP_STATE_SHUTDOWN_SENT */ \
654	TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
655	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
656	TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
657	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
658	TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
659} /* TYPE_SCTP_PRIMITIVE_SEND */
660
661#define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT  { \
662	/* SCTP_STATE_EMPTY */ \
663	TYPE_SCTP_FUNC(sctp_sf_bug), \
664	/* SCTP_STATE_CLOSED */ \
665	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
666	/* SCTP_STATE_COOKIE_WAIT */ \
667	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
668	/* SCTP_STATE_COOKIE_ECHOED */ \
669	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
670	/* SCTP_STATE_ESTABLISHED */ \
671	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
672	/* SCTP_STATE_SHUTDOWN_PENDING */ \
673	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
674	/* SCTP_STATE_SHUTDOWN_SENT */ \
675	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
676	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
677	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
678	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
679	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
680} /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */
681
682#define TYPE_SCTP_PRIMITIVE_ASCONF { \
683	/* SCTP_STATE_EMPTY */ \
684	TYPE_SCTP_FUNC(sctp_sf_bug), \
685	/* SCTP_STATE_CLOSED */ \
686	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
687	/* SCTP_STATE_COOKIE_WAIT */ \
688	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
689	/* SCTP_STATE_COOKIE_ECHOED */ \
690	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
691	/* SCTP_STATE_ESTABLISHED */ \
692	TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
693	/* SCTP_STATE_SHUTDOWN_PENDING */ \
694	TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
695	/* SCTP_STATE_SHUTDOWN_SENT */ \
696	TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
697	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
698	TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
699	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
700	TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
701} /* TYPE_SCTP_PRIMITIVE_ASCONF */
702
703/* The primary index for this table is the primitive type.
704 * The secondary index for this table is the state.
705 */
706static const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = {
707	TYPE_SCTP_PRIMITIVE_ASSOCIATE,
708	TYPE_SCTP_PRIMITIVE_SHUTDOWN,
709	TYPE_SCTP_PRIMITIVE_ABORT,
710	TYPE_SCTP_PRIMITIVE_SEND,
711	TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
712	TYPE_SCTP_PRIMITIVE_ASCONF,
713};
714
715#define TYPE_SCTP_OTHER_NO_PENDING_TSN  { \
716	/* SCTP_STATE_EMPTY */ \
717	TYPE_SCTP_FUNC(sctp_sf_bug), \
718	/* SCTP_STATE_CLOSED */ \
719	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
720	/* SCTP_STATE_COOKIE_WAIT */ \
721	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
722	/* SCTP_STATE_COOKIE_ECHOED */ \
723	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
724	/* SCTP_STATE_ESTABLISHED */ \
725	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
726	/* SCTP_STATE_SHUTDOWN_PENDING */ \
727	TYPE_SCTP_FUNC(sctp_sf_do_9_2_start_shutdown), \
728	/* SCTP_STATE_SHUTDOWN_SENT */ \
729	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
730	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
731	TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \
732	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
733	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
734}
735
736#define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH  { \
737	/* SCTP_STATE_EMPTY */ \
738	TYPE_SCTP_FUNC(sctp_sf_bug), \
739	/* SCTP_STATE_CLOSED */ \
740	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
741	/* SCTP_STATE_COOKIE_WAIT */ \
742	TYPE_SCTP_FUNC(sctp_sf_cookie_wait_icmp_abort), \
743	/* SCTP_STATE_COOKIE_ECHOED */ \
744	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
745	/* SCTP_STATE_ESTABLISHED */ \
746	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
747	/* SCTP_STATE_SHUTDOWN_PENDING */ \
748	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
749	/* SCTP_STATE_SHUTDOWN_SENT */ \
750	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
751	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
752	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
753	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
754	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
755}
756
757static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = {
758	TYPE_SCTP_OTHER_NO_PENDING_TSN,
759	TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH,
760};
761
762#define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
763	/* SCTP_STATE_EMPTY */ \
764	TYPE_SCTP_FUNC(sctp_sf_bug), \
765	/* SCTP_STATE_CLOSED */ \
766	TYPE_SCTP_FUNC(sctp_sf_bug), \
767	/* SCTP_STATE_COOKIE_WAIT */ \
768	TYPE_SCTP_FUNC(sctp_sf_bug), \
769	/* SCTP_STATE_COOKIE_ECHOED */ \
770	TYPE_SCTP_FUNC(sctp_sf_bug), \
771	/* SCTP_STATE_ESTABLISHED */ \
772	TYPE_SCTP_FUNC(sctp_sf_bug), \
773	/* SCTP_STATE_SHUTDOWN_PENDING */ \
774	TYPE_SCTP_FUNC(sctp_sf_bug), \
775	/* SCTP_STATE_SHUTDOWN_SENT */ \
776	TYPE_SCTP_FUNC(sctp_sf_bug), \
777	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
778	TYPE_SCTP_FUNC(sctp_sf_bug), \
779	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
780	TYPE_SCTP_FUNC(sctp_sf_bug), \
781}
782
783#define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
784	/* SCTP_STATE_EMPTY */ \
785	TYPE_SCTP_FUNC(sctp_sf_bug), \
786	/* SCTP_STATE_CLOSED */ \
787	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
788	/* SCTP_STATE_COOKIE_WAIT */ \
789	TYPE_SCTP_FUNC(sctp_sf_bug), \
790	/* SCTP_STATE_COOKIE_ECHOED */ \
791	TYPE_SCTP_FUNC(sctp_sf_t1_cookie_timer_expire), \
792	/* SCTP_STATE_ESTABLISHED */ \
793	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
794	/* SCTP_STATE_SHUTDOWN_PENDING */ \
795	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
796	/* SCTP_STATE_SHUTDOWN_SENT */ \
797	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
798	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
799	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
800	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
801	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
802}
803
804#define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
805	/* SCTP_STATE_EMPTY */ \
806	TYPE_SCTP_FUNC(sctp_sf_bug), \
807	/* SCTP_STATE_CLOSED */ \
808	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
809	/* SCTP_STATE_COOKIE_WAIT */ \
810	TYPE_SCTP_FUNC(sctp_sf_t1_init_timer_expire), \
811	/* SCTP_STATE_COOKIE_ECHOED */ \
812	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
813	/* SCTP_STATE_ESTABLISHED */ \
814	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
815	/* SCTP_STATE_SHUTDOWN_PENDING */ \
816	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
817	/* SCTP_STATE_SHUTDOWN_SENT */ \
818	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
819	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
820	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
821	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
822	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
823}
824
825#define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
826	/* SCTP_STATE_EMPTY */ \
827	TYPE_SCTP_FUNC(sctp_sf_bug), \
828	/* SCTP_STATE_CLOSED */ \
829	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
830	/* SCTP_STATE_COOKIE_WAIT */ \
831	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
832	/* SCTP_STATE_COOKIE_ECHOED */ \
833	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
834	/* SCTP_STATE_ESTABLISHED */ \
835	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
836	/* SCTP_STATE_SHUTDOWN_PENDING */ \
837	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
838	/* SCTP_STATE_SHUTDOWN_SENT */ \
839	TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
840	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
841	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
842	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
843	TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
844}
845
846#define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
847	/* SCTP_STATE_EMPTY */ \
848	TYPE_SCTP_FUNC(sctp_sf_bug), \
849	/* SCTP_STATE_CLOSED */ \
850	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
851	/* SCTP_STATE_COOKIE_WAIT */ \
852	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
853	/* SCTP_STATE_COOKIE_ECHOED */ \
854	TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
855	/* SCTP_STATE_ESTABLISHED */ \
856	TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
857	/* SCTP_STATE_SHUTDOWN_PENDING */ \
858	TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
859	/* SCTP_STATE_SHUTDOWN_SENT */ \
860	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
861	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
862	TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
863	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
864	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
865}
866
867#define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
868	/* SCTP_STATE_EMPTY */ \
869	TYPE_SCTP_FUNC(sctp_sf_bug), \
870	/* SCTP_STATE_CLOSED */ \
871	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
872	/* SCTP_STATE_COOKIE_WAIT */ \
873	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
874	/* SCTP_STATE_COOKIE_ECHOED */ \
875	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
876	/* SCTP_STATE_ESTABLISHED */ \
877	TYPE_SCTP_FUNC(sctp_sf_t4_timer_expire), \
878	/* SCTP_STATE_SHUTDOWN_PENDING */ \
879	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
880	/* SCTP_STATE_SHUTDOWN_SENT */ \
881	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
882	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
883	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
884	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
885	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
886}
887
888#define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
889	/* SCTP_STATE_EMPTY */ \
890	TYPE_SCTP_FUNC(sctp_sf_bug), \
891	/* SCTP_STATE_CLOSED */ \
892	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
893	/* SCTP_STATE_COOKIE_WAIT */ \
894	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
895	/* SCTP_STATE_COOKIE_ECHOED */ \
896	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
897	/* SCTP_STATE_ESTABLISHED */ \
898	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
899	/* SCTP_STATE_SHUTDOWN_PENDING */ \
900	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
901	/* SCTP_STATE_SHUTDOWN_SENT */ \
902	TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
903	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
904	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
905	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
906	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
907}
908
909#define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
910	/* SCTP_STATE_EMPTY */ \
911	TYPE_SCTP_FUNC(sctp_sf_bug), \
912	/* SCTP_STATE_CLOSED */ \
913	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
914	/* SCTP_STATE_COOKIE_WAIT */ \
915	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
916	/* SCTP_STATE_COOKIE_ECHOED */ \
917	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
918	/* SCTP_STATE_ESTABLISHED */ \
919	TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
920	/* SCTP_STATE_SHUTDOWN_PENDING */ \
921	TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
922	/* SCTP_STATE_SHUTDOWN_SENT */ \
923	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
924	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
925	TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
926	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
927	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
928}
929
930#define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
931	/* SCTP_STATE_EMPTY */ \
932	TYPE_SCTP_FUNC(sctp_sf_bug), \
933	/* SCTP_STATE_CLOSED */ \
934	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
935	/* SCTP_STATE_COOKIE_WAIT */ \
936	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
937	/* SCTP_STATE_COOKIE_ECHOED */ \
938	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
939	/* SCTP_STATE_ESTABLISHED */ \
940	TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
941	/* SCTP_STATE_SHUTDOWN_PENDING */ \
942	TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
943	/* SCTP_STATE_SHUTDOWN_SENT */ \
944	TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
945	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
946	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
947	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
948	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
949}
950
951#define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
952	/* SCTP_STATE_EMPTY */ \
953	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
954	/* SCTP_STATE_CLOSED */ \
955	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
956	/* SCTP_STATE_COOKIE_WAIT */ \
957	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
958	/* SCTP_STATE_COOKIE_ECHOED */ \
959	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
960	/* SCTP_STATE_ESTABLISHED */ \
961	TYPE_SCTP_FUNC(sctp_sf_autoclose_timer_expire), \
962	/* SCTP_STATE_SHUTDOWN_PENDING */ \
963	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
964	/* SCTP_STATE_SHUTDOWN_SENT */ \
965	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
966	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
967	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
968	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
969	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
970}
971
972static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
973	TYPE_SCTP_EVENT_TIMEOUT_NONE,
974	TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
975	TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
976	TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
977	TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
978	TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
979	TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
980	TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
981	TYPE_SCTP_EVENT_TIMEOUT_SACK,
982	TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
983};
984
985static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid,
986							    sctp_state_t state)
987{
988	if (state > SCTP_STATE_MAX)
989		return &bug;
990
991	if (cid <= SCTP_CID_BASE_MAX)
992		return &chunk_event_table[cid][state];
993
994	if (sctp_prsctp_enable) {
995		if (cid == SCTP_CID_FWD_TSN)
996			return &prsctp_chunk_event_table[0][state];
997	}
998
999	if (sctp_addip_enable) {
1000		if (cid == SCTP_CID_ASCONF)
1001			return &addip_chunk_event_table[0][state];
1002
1003		if (cid == SCTP_CID_ASCONF_ACK)
1004			return &addip_chunk_event_table[1][state];
1005	}
1006
1007	if (sctp_auth_enable) {
1008		if (cid == SCTP_CID_AUTH)
1009			return &auth_chunk_event_table[0][state];
1010	}
1011
1012	return &chunk_event_table_unknown[state];
1013}
1014