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