~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/sctp/sm_statetable.c

Version: ~ [ linux-5.8-rc3 ] ~ [ linux-5.7.5 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.48 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.129 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.185 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.228 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.228 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \
787         /* SCTP_STATE_ESTABLISHED */ \
788         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
789         /* SCTP_STATE_SHUTDOWN_PENDING */ \
790         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
791         /* SCTP_STATE_SHUTDOWN_SENT */ \
792         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
793         /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
794         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
795         /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
796         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
797 }
798 
799 #define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
800         /* SCTP_STATE_EMPTY */ \
801         {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
802         /* SCTP_STATE_CLOSED */ \
803         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
804         /* SCTP_STATE_COOKIE_WAIT */ \
805         {.fn = sctp_sf_t1_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \
806         /* SCTP_STATE_COOKIE_ECHOED */ \
807         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
808         /* SCTP_STATE_ESTABLISHED */ \
809         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
810         /* SCTP_STATE_SHUTDOWN_PENDING */ \
811         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
812         /* SCTP_STATE_SHUTDOWN_SENT */ \
813         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
814         /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
815         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
816         /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
817         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
818 }
819 
820 #define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
821         /* SCTP_STATE_EMPTY */ \
822         {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
823         /* SCTP_STATE_CLOSED */ \
824         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
825         /* SCTP_STATE_COOKIE_WAIT */ \
826         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
827         /* SCTP_STATE_COOKIE_ECHOED */ \
828         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
829         /* SCTP_STATE_ESTABLISHED */ \
830         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
831         /* SCTP_STATE_SHUTDOWN_PENDING */ \
832         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
833         /* SCTP_STATE_SHUTDOWN_SENT */ \
834         {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \
835         /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
836         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
837         /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
838         {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \
839 }
840 
841 #define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
842         /* SCTP_STATE_EMPTY */ \
843         {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
844         /* SCTP_STATE_CLOSED */ \
845         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
846         /* SCTP_STATE_COOKIE_WAIT */ \
847         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
848         /* SCTP_STATE_COOKIE_ECHOED */ \
849         {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
850         /* SCTP_STATE_ESTABLISHED */ \
851         {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
852         /* SCTP_STATE_SHUTDOWN_PENDING */ \
853         {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
854         /* SCTP_STATE_SHUTDOWN_SENT */ \
855         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
856         /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
857         {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \
858         /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
859         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
860 }
861 
862 #define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
863         /* SCTP_STATE_EMPTY */ \
864         {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
865         /* SCTP_STATE_CLOSED */ \
866         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
867         /* SCTP_STATE_COOKIE_WAIT */ \
868         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
869         /* SCTP_STATE_COOKIE_ECHOED */ \
870         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
871         /* SCTP_STATE_ESTABLISHED */ \
872         {.fn = sctp_sf_t4_timer_expire, .name = "sctp_sf_t4_timer_expire"}, \
873         /* SCTP_STATE_SHUTDOWN_PENDING */ \
874         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
875         /* SCTP_STATE_SHUTDOWN_SENT */ \
876         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
877         /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
878         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
879         /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
880         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
881 }
882 
883 #define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
884         /* SCTP_STATE_EMPTY */ \
885         {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
886         /* SCTP_STATE_CLOSED */ \
887         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
888         /* SCTP_STATE_COOKIE_WAIT */ \
889         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
890         /* SCTP_STATE_COOKIE_ECHOED */ \
891         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
892         /* SCTP_STATE_ESTABLISHED */ \
893         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
894         /* SCTP_STATE_SHUTDOWN_PENDING */ \
895         {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \
896         /* SCTP_STATE_SHUTDOWN_SENT */ \
897         {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \
898         /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
899         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
900         /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
901         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
902 }
903 
904 #define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
905         /* SCTP_STATE_EMPTY */ \
906         {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
907         /* SCTP_STATE_CLOSED */ \
908         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
909         /* SCTP_STATE_COOKIE_WAIT */ \
910         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
911         /* SCTP_STATE_COOKIE_ECHOED */ \
912         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
913         /* SCTP_STATE_ESTABLISHED */ \
914         {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
915         /* SCTP_STATE_SHUTDOWN_PENDING */ \
916         {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
917         /* SCTP_STATE_SHUTDOWN_SENT */ \
918         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
919         /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
920         {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \
921         /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
922         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
923 }
924 
925 #define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
926         /* SCTP_STATE_EMPTY */ \
927         {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
928         /* SCTP_STATE_CLOSED */ \
929         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
930         /* SCTP_STATE_COOKIE_WAIT */ \
931         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
932         /* SCTP_STATE_COOKIE_ECHOED */ \
933         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
934         /* SCTP_STATE_ESTABLISHED */ \
935         {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
936         /* SCTP_STATE_SHUTDOWN_PENDING */ \
937         {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
938         /* SCTP_STATE_SHUTDOWN_SENT */ \
939         {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \
940         /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
941         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
942         /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
943         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
944 }
945 
946 #define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
947         /* SCTP_STATE_EMPTY */ \
948         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
949         /* SCTP_STATE_CLOSED */ \
950         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
951         /* SCTP_STATE_COOKIE_WAIT */ \
952         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
953         /* SCTP_STATE_COOKIE_ECHOED */ \
954         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
955         /* SCTP_STATE_ESTABLISHED */ \
956         {.fn = sctp_sf_autoclose_timer_expire, \
957          .name = "sctp_sf_autoclose_timer_expire"}, \
958         /* SCTP_STATE_SHUTDOWN_PENDING */ \
959         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
960         /* SCTP_STATE_SHUTDOWN_SENT */ \
961         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
962         /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
963         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
964         /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
965         {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \
966 }
967 
968 static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
969         TYPE_SCTP_EVENT_TIMEOUT_NONE,
970         TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
971         TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
972         TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
973         TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
974         TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
975         TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
976         TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
977         TYPE_SCTP_EVENT_TIMEOUT_SACK,
978         TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
979 };
980 
981 static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, 
982                                                             sctp_state_t state)
983 {
984         if (state > SCTP_STATE_MAX)
985                 return &bug;
986 
987         if (cid >= 0 && cid <= SCTP_CID_BASE_MAX)
988                 return &chunk_event_table[cid][state];
989 
990         if (sctp_prsctp_enable) {
991                 if (cid == SCTP_CID_FWD_TSN)
992                         return &prsctp_chunk_event_table[0][state];
993         }
994 
995         if (sctp_addip_enable) {
996                 if (cid == SCTP_CID_ASCONF)
997                         return &addip_chunk_event_table[0][state];
998 
999                 if (cid == SCTP_CID_ASCONF_ACK)
1000                         return &addip_chunk_event_table[1][state];
1001         }
1002 
1003         return &chunk_event_table_unknown[state];
1004 }
1005 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp