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