Root/
1 | /* SCTP kernel implementation |
2 | * (C) Copyright IBM Corp. 2001, 2004 |
3 | * Copyright (c) 1999-2000 Cisco, Inc. |
4 | * Copyright (c) 1999-2001 Motorola, Inc. |
5 | * Copyright (c) 2001 Intel Corp. |
6 | * Copyright (c) 2001 Nokia, Inc. |
7 | * |
8 | * This file is part of the SCTP kernel implementation |
9 | * |
10 | * These are the state tables for the SCTP state machine. |
11 | * |
12 | * This SCTP implementation is free software; |
13 | * you can redistribute it and/or modify it under the terms of |
14 | * the GNU General Public License as published by |
15 | * the Free Software Foundation; either version 2, or (at your option) |
16 | * any later version. |
17 | * |
18 | * This SCTP implementation is distributed in the hope that it |
19 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied |
20 | * ************************ |
21 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
22 | * See the GNU General Public License for more details. |
23 | * |
24 | * You should have received a copy of the GNU General Public License |
25 | * along with GNU CC; see the file COPYING. If not, write to |
26 | * the Free Software Foundation, 59 Temple Place - Suite 330, |
27 | * Boston, MA 02111-1307, USA. |
28 | * |
29 | * Please send any bug reports or fixes you make to the |
30 | * email address(es): |
31 | * lksctp developers <lksctp-developers@lists.sourceforge.net> |
32 | * |
33 | * Or submit a bug report through the following website: |
34 | * http://www.sf.net/projects/lksctp |
35 | * |
36 | * Written or modified by: |
37 | * La Monte H.P. Yarroll <piggy@acm.org> |
38 | * Karl Knutson <karl@athena.chicago.il.us> |
39 | * Jon Grimm <jgrimm@us.ibm.com> |
40 | * Hui Huang <hui.huang@nokia.com> |
41 | * Daisy Chang <daisyc@us.ibm.com> |
42 | * Ardelle Fan <ardelle.fan@intel.com> |
43 | * Sridhar Samudrala <sri@us.ibm.com> |
44 | * |
45 | * Any bugs reported given to us we will try to fix... any fixes shared will |
46 | * be incorporated into the next SCTP release. |
47 | */ |
48 | |
49 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
50 | |
51 | #include <linux/skbuff.h> |
52 | #include <net/sctp/sctp.h> |
53 | #include <net/sctp/sm.h> |
54 | |
55 | static const sctp_sm_table_entry_t |
56 | primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES]; |
57 | static const sctp_sm_table_entry_t |
58 | other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES]; |
59 | static const sctp_sm_table_entry_t |
60 | timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES]; |
61 | |
62 | static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, |
63 | sctp_state_t state); |
64 | |
65 | |
66 | static const sctp_sm_table_entry_t bug = { |
67 | .fn = sctp_sf_bug, |
68 | .name = "sctp_sf_bug" |
69 | }; |
70 | |
71 | #define DO_LOOKUP(_max, _type, _table) \ |
72 | ({ \ |
73 | const sctp_sm_table_entry_t *rtn; \ |
74 | \ |
75 | if ((event_subtype._type > (_max))) { \ |
76 | pr_warn("table %p possible attack: event %d exceeds max %d\n", \ |
77 | _table, event_subtype._type, _max); \ |
78 | rtn = &bug; \ |
79 | } else \ |
80 | rtn = &_table[event_subtype._type][(int)state]; \ |
81 | \ |
82 | rtn; \ |
83 | }) |
84 | |
85 | const sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type, |
86 | sctp_state_t state, |
87 | sctp_subtype_t event_subtype) |
88 | { |
89 | switch (event_type) { |
90 | case SCTP_EVENT_T_CHUNK: |
91 | return sctp_chunk_event_lookup(event_subtype.chunk, state); |
92 | case SCTP_EVENT_T_TIMEOUT: |
93 | return DO_LOOKUP(SCTP_EVENT_TIMEOUT_MAX, timeout, |
94 | timeout_event_table); |
95 | case SCTP_EVENT_T_OTHER: |
96 | return DO_LOOKUP(SCTP_EVENT_OTHER_MAX, other, |
97 | other_event_table); |
98 | case SCTP_EVENT_T_PRIMITIVE: |
99 | return DO_LOOKUP(SCTP_EVENT_PRIMITIVE_MAX, primitive, |
100 | primitive_event_table); |
101 | default: |
102 | /* Yikes! We got an illegal event type. */ |
103 | return &bug; |
104 | } |
105 | } |
106 | |
107 | #define TYPE_SCTP_FUNC(func) {.fn = func, .name = #func} |
108 | |
109 | #define TYPE_SCTP_DATA { \ |
110 | /* SCTP_STATE_EMPTY */ \ |
111 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
112 | /* SCTP_STATE_CLOSED */ \ |
113 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
114 | /* SCTP_STATE_COOKIE_WAIT */ \ |
115 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
116 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
117 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
118 | /* SCTP_STATE_ESTABLISHED */ \ |
119 | TYPE_SCTP_FUNC(sctp_sf_eat_data_6_2), \ |
120 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
121 | TYPE_SCTP_FUNC(sctp_sf_eat_data_6_2), \ |
122 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
123 | TYPE_SCTP_FUNC(sctp_sf_eat_data_fast_4_4), \ |
124 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
125 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
126 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
127 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
128 | } /* TYPE_SCTP_DATA */ |
129 | |
130 | #define TYPE_SCTP_INIT { \ |
131 | /* SCTP_STATE_EMPTY */ \ |
132 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
133 | /* SCTP_STATE_CLOSED */ \ |
134 | TYPE_SCTP_FUNC(sctp_sf_do_5_1B_init), \ |
135 | /* SCTP_STATE_COOKIE_WAIT */ \ |
136 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_1_siminit), \ |
137 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
138 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_1_siminit), \ |
139 | /* SCTP_STATE_ESTABLISHED */ \ |
140 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \ |
141 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
142 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \ |
143 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
144 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \ |
145 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
146 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \ |
147 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
148 | TYPE_SCTP_FUNC(sctp_sf_do_9_2_reshutack), \ |
149 | } /* TYPE_SCTP_INIT */ |
150 | |
151 | #define TYPE_SCTP_INIT_ACK { \ |
152 | /* SCTP_STATE_EMPTY */ \ |
153 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
154 | /* SCTP_STATE_CLOSED */ \ |
155 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_3_initack), \ |
156 | /* SCTP_STATE_COOKIE_WAIT */ \ |
157 | TYPE_SCTP_FUNC(sctp_sf_do_5_1C_ack), \ |
158 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
159 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
160 | /* SCTP_STATE_ESTABLISHED */ \ |
161 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
162 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
163 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
164 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
165 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
166 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
167 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
168 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
169 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
170 | } /* TYPE_SCTP_INIT_ACK */ |
171 | |
172 | #define TYPE_SCTP_SACK { \ |
173 | /* SCTP_STATE_EMPTY */ \ |
174 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
175 | /* SCTP_STATE_CLOSED */ \ |
176 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
177 | /* SCTP_STATE_COOKIE_WAIT */ \ |
178 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
179 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
180 | TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \ |
181 | /* SCTP_STATE_ESTABLISHED */ \ |
182 | TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \ |
183 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
184 | TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \ |
185 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
186 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
187 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
188 | TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \ |
189 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
190 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
191 | } /* TYPE_SCTP_SACK */ |
192 | |
193 | #define TYPE_SCTP_HEARTBEAT { \ |
194 | /* SCTP_STATE_EMPTY */ \ |
195 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
196 | /* SCTP_STATE_CLOSED */ \ |
197 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
198 | /* SCTP_STATE_COOKIE_WAIT */ \ |
199 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
200 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
201 | TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ |
202 | /* SCTP_STATE_ESTABLISHED */ \ |
203 | TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ |
204 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
205 | TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ |
206 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
207 | TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ |
208 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
209 | TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ |
210 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
211 | /* This should not happen, but we are nice. */ \ |
212 | TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \ |
213 | } /* TYPE_SCTP_HEARTBEAT */ |
214 | |
215 | #define TYPE_SCTP_HEARTBEAT_ACK { \ |
216 | /* SCTP_STATE_EMPTY */ \ |
217 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
218 | /* SCTP_STATE_CLOSED */ \ |
219 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
220 | /* SCTP_STATE_COOKIE_WAIT */ \ |
221 | TYPE_SCTP_FUNC(sctp_sf_violation), \ |
222 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
223 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
224 | /* SCTP_STATE_ESTABLISHED */ \ |
225 | TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \ |
226 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
227 | TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \ |
228 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
229 | TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \ |
230 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
231 | TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \ |
232 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
233 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
234 | } /* TYPE_SCTP_HEARTBEAT_ACK */ |
235 | |
236 | #define TYPE_SCTP_ABORT { \ |
237 | /* SCTP_STATE_EMPTY */ \ |
238 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
239 | /* SCTP_STATE_CLOSED */ \ |
240 | TYPE_SCTP_FUNC(sctp_sf_pdiscard), \ |
241 | /* SCTP_STATE_COOKIE_WAIT */ \ |
242 | TYPE_SCTP_FUNC(sctp_sf_cookie_wait_abort), \ |
243 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
244 | TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_abort), \ |
245 | /* SCTP_STATE_ESTABLISHED */ \ |
246 | TYPE_SCTP_FUNC(sctp_sf_do_9_1_abort), \ |
247 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
248 | TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_abort), \ |
249 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
250 | TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_abort), \ |
251 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
252 | TYPE_SCTP_FUNC(sctp_sf_do_9_1_abort), \ |
253 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
254 | TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_abort), \ |
255 | } /* TYPE_SCTP_ABORT */ |
256 | |
257 | #define TYPE_SCTP_SHUTDOWN { \ |
258 | /* SCTP_STATE_EMPTY */ \ |
259 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
260 | /* SCTP_STATE_CLOSED */ \ |
261 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
262 | /* SCTP_STATE_COOKIE_WAIT */ \ |
263 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
264 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
265 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
266 | /* SCTP_STATE_ESTABLISHED */ \ |
267 | TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown), \ |
268 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
269 | TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown), \ |
270 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
271 | TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \ |
272 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
273 | TYPE_SCTP_FUNC(sctp_sf_do_9_2_shut_ctsn), \ |
274 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
275 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
276 | } /* TYPE_SCTP_SHUTDOWN */ |
277 | |
278 | #define TYPE_SCTP_SHUTDOWN_ACK { \ |
279 | /* SCTP_STATE_EMPTY */ \ |
280 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
281 | /* SCTP_STATE_CLOSED */ \ |
282 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
283 | /* SCTP_STATE_COOKIE_WAIT */ \ |
284 | TYPE_SCTP_FUNC(sctp_sf_do_8_5_1_E_sa), \ |
285 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
286 | TYPE_SCTP_FUNC(sctp_sf_do_8_5_1_E_sa), \ |
287 | /* SCTP_STATE_ESTABLISHED */ \ |
288 | TYPE_SCTP_FUNC(sctp_sf_violation), \ |
289 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
290 | TYPE_SCTP_FUNC(sctp_sf_violation), \ |
291 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
292 | TYPE_SCTP_FUNC(sctp_sf_do_9_2_final), \ |
293 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
294 | TYPE_SCTP_FUNC(sctp_sf_violation), \ |
295 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
296 | TYPE_SCTP_FUNC(sctp_sf_do_9_2_final), \ |
297 | } /* TYPE_SCTP_SHUTDOWN_ACK */ |
298 | |
299 | #define TYPE_SCTP_ERROR { \ |
300 | /* SCTP_STATE_EMPTY */ \ |
301 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
302 | /* SCTP_STATE_CLOSED */ \ |
303 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
304 | /* SCTP_STATE_COOKIE_WAIT */ \ |
305 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
306 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
307 | TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_err), \ |
308 | /* SCTP_STATE_ESTABLISHED */ \ |
309 | TYPE_SCTP_FUNC(sctp_sf_operr_notify), \ |
310 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
311 | TYPE_SCTP_FUNC(sctp_sf_operr_notify), \ |
312 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
313 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
314 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
315 | TYPE_SCTP_FUNC(sctp_sf_operr_notify), \ |
316 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
317 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
318 | } /* TYPE_SCTP_ERROR */ |
319 | |
320 | #define TYPE_SCTP_COOKIE_ECHO { \ |
321 | /* SCTP_STATE_EMPTY */ \ |
322 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
323 | /* SCTP_STATE_CLOSED */ \ |
324 | TYPE_SCTP_FUNC(sctp_sf_do_5_1D_ce), \ |
325 | /* SCTP_STATE_COOKIE_WAIT */ \ |
326 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ |
327 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
328 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ |
329 | /* SCTP_STATE_ESTABLISHED */ \ |
330 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ |
331 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
332 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ |
333 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
334 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ |
335 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
336 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ |
337 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
338 | TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \ |
339 | } /* TYPE_SCTP_COOKIE_ECHO */ |
340 | |
341 | #define TYPE_SCTP_COOKIE_ACK { \ |
342 | /* SCTP_STATE_EMPTY */ \ |
343 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
344 | /* SCTP_STATE_CLOSED */ \ |
345 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
346 | /* SCTP_STATE_COOKIE_WAIT */ \ |
347 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
348 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
349 | TYPE_SCTP_FUNC(sctp_sf_do_5_1E_ca), \ |
350 | /* SCTP_STATE_ESTABLISHED */ \ |
351 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
352 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
353 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
354 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
355 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
356 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
357 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
358 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
359 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
360 | } /* TYPE_SCTP_COOKIE_ACK */ |
361 | |
362 | #define TYPE_SCTP_ECN_ECNE { \ |
363 | /* SCTP_STATE_EMPTY */ \ |
364 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
365 | /* SCTP_STATE_CLOSED */ \ |
366 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
367 | /* SCTP_STATE_COOKIE_WAIT */ \ |
368 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
369 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
370 | TYPE_SCTP_FUNC(sctp_sf_do_ecne), \ |
371 | /* SCTP_STATE_ESTABLISHED */ \ |
372 | TYPE_SCTP_FUNC(sctp_sf_do_ecne), \ |
373 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
374 | TYPE_SCTP_FUNC(sctp_sf_do_ecne), \ |
375 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
376 | TYPE_SCTP_FUNC(sctp_sf_do_ecne), \ |
377 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
378 | TYPE_SCTP_FUNC(sctp_sf_do_ecne), \ |
379 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
380 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
381 | } /* TYPE_SCTP_ECN_ECNE */ |
382 | |
383 | #define TYPE_SCTP_ECN_CWR { \ |
384 | /* SCTP_STATE_EMPTY */ \ |
385 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
386 | /* SCTP_STATE_CLOSED */ \ |
387 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
388 | /* SCTP_STATE_COOKIE_WAIT */ \ |
389 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
390 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
391 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
392 | /* SCTP_STATE_ESTABLISHED */ \ |
393 | TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \ |
394 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
395 | TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \ |
396 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
397 | TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \ |
398 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
399 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
400 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
401 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
402 | } /* TYPE_SCTP_ECN_CWR */ |
403 | |
404 | #define TYPE_SCTP_SHUTDOWN_COMPLETE { \ |
405 | /* SCTP_STATE_EMPTY */ \ |
406 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
407 | /* SCTP_STATE_CLOSED */ \ |
408 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
409 | /* SCTP_STATE_COOKIE_WAIT */ \ |
410 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
411 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
412 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
413 | /* SCTP_STATE_ESTABLISHED */ \ |
414 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
415 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
416 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
417 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
418 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
419 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
420 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
421 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
422 | TYPE_SCTP_FUNC(sctp_sf_do_4_C), \ |
423 | } /* TYPE_SCTP_SHUTDOWN_COMPLETE */ |
424 | |
425 | /* The primary index for this table is the chunk type. |
426 | * The secondary index for this table is the state. |
427 | * |
428 | * For base protocol (RFC 2960). |
429 | */ |
430 | static const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { |
431 | TYPE_SCTP_DATA, |
432 | TYPE_SCTP_INIT, |
433 | TYPE_SCTP_INIT_ACK, |
434 | TYPE_SCTP_SACK, |
435 | TYPE_SCTP_HEARTBEAT, |
436 | TYPE_SCTP_HEARTBEAT_ACK, |
437 | TYPE_SCTP_ABORT, |
438 | TYPE_SCTP_SHUTDOWN, |
439 | TYPE_SCTP_SHUTDOWN_ACK, |
440 | TYPE_SCTP_ERROR, |
441 | TYPE_SCTP_COOKIE_ECHO, |
442 | TYPE_SCTP_COOKIE_ACK, |
443 | TYPE_SCTP_ECN_ECNE, |
444 | TYPE_SCTP_ECN_CWR, |
445 | TYPE_SCTP_SHUTDOWN_COMPLETE, |
446 | }; /* state_fn_t chunk_event_table[][] */ |
447 | |
448 | #define TYPE_SCTP_ASCONF { \ |
449 | /* SCTP_STATE_EMPTY */ \ |
450 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
451 | /* SCTP_STATE_CLOSED */ \ |
452 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
453 | /* SCTP_STATE_COOKIE_WAIT */ \ |
454 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
455 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
456 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
457 | /* SCTP_STATE_ESTABLISHED */ \ |
458 | TYPE_SCTP_FUNC(sctp_sf_do_asconf), \ |
459 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
460 | TYPE_SCTP_FUNC(sctp_sf_do_asconf), \ |
461 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
462 | TYPE_SCTP_FUNC(sctp_sf_do_asconf), \ |
463 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
464 | TYPE_SCTP_FUNC(sctp_sf_do_asconf), \ |
465 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
466 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
467 | } /* TYPE_SCTP_ASCONF */ |
468 | |
469 | #define TYPE_SCTP_ASCONF_ACK { \ |
470 | /* SCTP_STATE_EMPTY */ \ |
471 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
472 | /* SCTP_STATE_CLOSED */ \ |
473 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
474 | /* SCTP_STATE_COOKIE_WAIT */ \ |
475 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
476 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
477 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
478 | /* SCTP_STATE_ESTABLISHED */ \ |
479 | TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \ |
480 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
481 | TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \ |
482 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
483 | TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \ |
484 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
485 | TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \ |
486 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
487 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
488 | } /* TYPE_SCTP_ASCONF_ACK */ |
489 | |
490 | /* The primary index for this table is the chunk type. |
491 | * The secondary index for this table is the state. |
492 | */ |
493 | static const sctp_sm_table_entry_t addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { |
494 | TYPE_SCTP_ASCONF, |
495 | TYPE_SCTP_ASCONF_ACK, |
496 | }; /*state_fn_t addip_chunk_event_table[][] */ |
497 | |
498 | #define TYPE_SCTP_FWD_TSN { \ |
499 | /* SCTP_STATE_EMPTY */ \ |
500 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
501 | /* SCTP_STATE_CLOSED */ \ |
502 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
503 | /* SCTP_STATE_COOKIE_WAIT */ \ |
504 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
505 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
506 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
507 | /* SCTP_STATE_ESTABLISHED */ \ |
508 | TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \ |
509 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
510 | TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \ |
511 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
512 | TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn_fast), \ |
513 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
514 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
515 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
516 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
517 | } /* TYPE_SCTP_FWD_TSN */ |
518 | |
519 | /* The primary index for this table is the chunk type. |
520 | * The secondary index for this table is the state. |
521 | */ |
522 | static const sctp_sm_table_entry_t prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { |
523 | TYPE_SCTP_FWD_TSN, |
524 | }; /*state_fn_t prsctp_chunk_event_table[][] */ |
525 | |
526 | #define TYPE_SCTP_AUTH { \ |
527 | /* SCTP_STATE_EMPTY */ \ |
528 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
529 | /* SCTP_STATE_CLOSED */ \ |
530 | TYPE_SCTP_FUNC(sctp_sf_ootb), \ |
531 | /* SCTP_STATE_COOKIE_WAIT */ \ |
532 | TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \ |
533 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
534 | TYPE_SCTP_FUNC(sctp_sf_eat_auth), \ |
535 | /* SCTP_STATE_ESTABLISHED */ \ |
536 | TYPE_SCTP_FUNC(sctp_sf_eat_auth), \ |
537 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
538 | TYPE_SCTP_FUNC(sctp_sf_eat_auth), \ |
539 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
540 | TYPE_SCTP_FUNC(sctp_sf_eat_auth), \ |
541 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
542 | TYPE_SCTP_FUNC(sctp_sf_eat_auth), \ |
543 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
544 | TYPE_SCTP_FUNC(sctp_sf_eat_auth), \ |
545 | } /* TYPE_SCTP_AUTH */ |
546 | |
547 | /* The primary index for this table is the chunk type. |
548 | * The secondary index for this table is the state. |
549 | */ |
550 | static const sctp_sm_table_entry_t auth_chunk_event_table[SCTP_NUM_AUTH_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { |
551 | TYPE_SCTP_AUTH, |
552 | }; /*state_fn_t auth_chunk_event_table[][] */ |
553 | |
554 | static const sctp_sm_table_entry_t |
555 | chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = { |
556 | /* SCTP_STATE_EMPTY */ |
557 | TYPE_SCTP_FUNC(sctp_sf_ootb), |
558 | /* SCTP_STATE_CLOSED */ |
559 | TYPE_SCTP_FUNC(sctp_sf_ootb), |
560 | /* SCTP_STATE_COOKIE_WAIT */ |
561 | TYPE_SCTP_FUNC(sctp_sf_unk_chunk), |
562 | /* SCTP_STATE_COOKIE_ECHOED */ |
563 | TYPE_SCTP_FUNC(sctp_sf_unk_chunk), |
564 | /* SCTP_STATE_ESTABLISHED */ |
565 | TYPE_SCTP_FUNC(sctp_sf_unk_chunk), |
566 | /* SCTP_STATE_SHUTDOWN_PENDING */ |
567 | TYPE_SCTP_FUNC(sctp_sf_unk_chunk), |
568 | /* SCTP_STATE_SHUTDOWN_SENT */ |
569 | TYPE_SCTP_FUNC(sctp_sf_unk_chunk), |
570 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ |
571 | TYPE_SCTP_FUNC(sctp_sf_unk_chunk), |
572 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ |
573 | TYPE_SCTP_FUNC(sctp_sf_unk_chunk), |
574 | }; /* chunk unknown */ |
575 | |
576 | |
577 | #define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \ |
578 | /* SCTP_STATE_EMPTY */ \ |
579 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
580 | /* SCTP_STATE_CLOSED */ \ |
581 | TYPE_SCTP_FUNC(sctp_sf_do_prm_asoc), \ |
582 | /* SCTP_STATE_COOKIE_WAIT */ \ |
583 | TYPE_SCTP_FUNC(sctp_sf_not_impl), \ |
584 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
585 | TYPE_SCTP_FUNC(sctp_sf_not_impl), \ |
586 | /* SCTP_STATE_ESTABLISHED */ \ |
587 | TYPE_SCTP_FUNC(sctp_sf_not_impl), \ |
588 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
589 | TYPE_SCTP_FUNC(sctp_sf_not_impl), \ |
590 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
591 | TYPE_SCTP_FUNC(sctp_sf_not_impl), \ |
592 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
593 | TYPE_SCTP_FUNC(sctp_sf_not_impl), \ |
594 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
595 | TYPE_SCTP_FUNC(sctp_sf_not_impl), \ |
596 | } /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */ |
597 | |
598 | #define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \ |
599 | /* SCTP_STATE_EMPTY */ \ |
600 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
601 | /* SCTP_STATE_CLOSED */ \ |
602 | TYPE_SCTP_FUNC(sctp_sf_error_closed), \ |
603 | /* SCTP_STATE_COOKIE_WAIT */ \ |
604 | TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_shutdown), \ |
605 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
606 | TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_shutdown),\ |
607 | /* SCTP_STATE_ESTABLISHED */ \ |
608 | TYPE_SCTP_FUNC(sctp_sf_do_9_2_prm_shutdown), \ |
609 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
610 | TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \ |
611 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
612 | TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \ |
613 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
614 | TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \ |
615 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
616 | TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \ |
617 | } /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */ |
618 | |
619 | #define TYPE_SCTP_PRIMITIVE_ABORT { \ |
620 | /* SCTP_STATE_EMPTY */ \ |
621 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
622 | /* SCTP_STATE_CLOSED */ \ |
623 | TYPE_SCTP_FUNC(sctp_sf_error_closed), \ |
624 | /* SCTP_STATE_COOKIE_WAIT */ \ |
625 | TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_abort), \ |
626 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
627 | TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_abort), \ |
628 | /* SCTP_STATE_ESTABLISHED */ \ |
629 | TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \ |
630 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
631 | TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_prm_abort), \ |
632 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
633 | TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_prm_abort), \ |
634 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
635 | TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \ |
636 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
637 | TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_prm_abort), \ |
638 | } /* TYPE_SCTP_PRIMITIVE_ABORT */ |
639 | |
640 | #define TYPE_SCTP_PRIMITIVE_SEND { \ |
641 | /* SCTP_STATE_EMPTY */ \ |
642 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
643 | /* SCTP_STATE_CLOSED */ \ |
644 | TYPE_SCTP_FUNC(sctp_sf_error_closed), \ |
645 | /* SCTP_STATE_COOKIE_WAIT */ \ |
646 | TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \ |
647 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
648 | TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \ |
649 | /* SCTP_STATE_ESTABLISHED */ \ |
650 | TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \ |
651 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
652 | TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \ |
653 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
654 | TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \ |
655 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
656 | TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \ |
657 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
658 | TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \ |
659 | } /* TYPE_SCTP_PRIMITIVE_SEND */ |
660 | |
661 | #define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \ |
662 | /* SCTP_STATE_EMPTY */ \ |
663 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
664 | /* SCTP_STATE_CLOSED */ \ |
665 | TYPE_SCTP_FUNC(sctp_sf_error_closed), \ |
666 | /* SCTP_STATE_COOKIE_WAIT */ \ |
667 | TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ |
668 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
669 | TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ |
670 | /* SCTP_STATE_ESTABLISHED */ \ |
671 | TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ |
672 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
673 | TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ |
674 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
675 | TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ |
676 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
677 | TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ |
678 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
679 | TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat), \ |
680 | } /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */ |
681 | |
682 | #define TYPE_SCTP_PRIMITIVE_ASCONF { \ |
683 | /* SCTP_STATE_EMPTY */ \ |
684 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
685 | /* SCTP_STATE_CLOSED */ \ |
686 | TYPE_SCTP_FUNC(sctp_sf_error_closed), \ |
687 | /* SCTP_STATE_COOKIE_WAIT */ \ |
688 | TYPE_SCTP_FUNC(sctp_sf_error_closed), \ |
689 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
690 | TYPE_SCTP_FUNC(sctp_sf_error_closed), \ |
691 | /* SCTP_STATE_ESTABLISHED */ \ |
692 | TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \ |
693 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
694 | TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \ |
695 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
696 | TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \ |
697 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
698 | TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \ |
699 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
700 | TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \ |
701 | } /* TYPE_SCTP_PRIMITIVE_ASCONF */ |
702 | |
703 | /* The primary index for this table is the primitive type. |
704 | * The secondary index for this table is the state. |
705 | */ |
706 | static const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = { |
707 | TYPE_SCTP_PRIMITIVE_ASSOCIATE, |
708 | TYPE_SCTP_PRIMITIVE_SHUTDOWN, |
709 | TYPE_SCTP_PRIMITIVE_ABORT, |
710 | TYPE_SCTP_PRIMITIVE_SEND, |
711 | TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT, |
712 | TYPE_SCTP_PRIMITIVE_ASCONF, |
713 | }; |
714 | |
715 | #define TYPE_SCTP_OTHER_NO_PENDING_TSN { \ |
716 | /* SCTP_STATE_EMPTY */ \ |
717 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
718 | /* SCTP_STATE_CLOSED */ \ |
719 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
720 | /* SCTP_STATE_COOKIE_WAIT */ \ |
721 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
722 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
723 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
724 | /* SCTP_STATE_ESTABLISHED */ \ |
725 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
726 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
727 | TYPE_SCTP_FUNC(sctp_sf_do_9_2_start_shutdown), \ |
728 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
729 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
730 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
731 | TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \ |
732 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
733 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
734 | } |
735 | |
736 | #define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH { \ |
737 | /* SCTP_STATE_EMPTY */ \ |
738 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
739 | /* SCTP_STATE_CLOSED */ \ |
740 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
741 | /* SCTP_STATE_COOKIE_WAIT */ \ |
742 | TYPE_SCTP_FUNC(sctp_sf_cookie_wait_icmp_abort), \ |
743 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
744 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
745 | /* SCTP_STATE_ESTABLISHED */ \ |
746 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
747 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
748 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
749 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
750 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
751 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
752 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
753 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
754 | TYPE_SCTP_FUNC(sctp_sf_ignore_other), \ |
755 | } |
756 | |
757 | static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = { |
758 | TYPE_SCTP_OTHER_NO_PENDING_TSN, |
759 | TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH, |
760 | }; |
761 | |
762 | #define TYPE_SCTP_EVENT_TIMEOUT_NONE { \ |
763 | /* SCTP_STATE_EMPTY */ \ |
764 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
765 | /* SCTP_STATE_CLOSED */ \ |
766 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
767 | /* SCTP_STATE_COOKIE_WAIT */ \ |
768 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
769 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
770 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
771 | /* SCTP_STATE_ESTABLISHED */ \ |
772 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
773 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
774 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
775 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
776 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
777 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
778 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
779 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
780 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
781 | } |
782 | |
783 | #define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \ |
784 | /* SCTP_STATE_EMPTY */ \ |
785 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
786 | /* SCTP_STATE_CLOSED */ \ |
787 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
788 | /* SCTP_STATE_COOKIE_WAIT */ \ |
789 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
790 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
791 | TYPE_SCTP_FUNC(sctp_sf_t1_cookie_timer_expire), \ |
792 | /* SCTP_STATE_ESTABLISHED */ \ |
793 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
794 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
795 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
796 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
797 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
798 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
799 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
800 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
801 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
802 | } |
803 | |
804 | #define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \ |
805 | /* SCTP_STATE_EMPTY */ \ |
806 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
807 | /* SCTP_STATE_CLOSED */ \ |
808 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
809 | /* SCTP_STATE_COOKIE_WAIT */ \ |
810 | TYPE_SCTP_FUNC(sctp_sf_t1_init_timer_expire), \ |
811 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
812 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
813 | /* SCTP_STATE_ESTABLISHED */ \ |
814 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
815 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
816 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
817 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
818 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
819 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
820 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
821 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
822 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
823 | } |
824 | |
825 | #define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \ |
826 | /* SCTP_STATE_EMPTY */ \ |
827 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
828 | /* SCTP_STATE_CLOSED */ \ |
829 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
830 | /* SCTP_STATE_COOKIE_WAIT */ \ |
831 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
832 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
833 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
834 | /* SCTP_STATE_ESTABLISHED */ \ |
835 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
836 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
837 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
838 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
839 | TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \ |
840 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
841 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
842 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
843 | TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \ |
844 | } |
845 | |
846 | #define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \ |
847 | /* SCTP_STATE_EMPTY */ \ |
848 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
849 | /* SCTP_STATE_CLOSED */ \ |
850 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
851 | /* SCTP_STATE_COOKIE_WAIT */ \ |
852 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
853 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
854 | TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \ |
855 | /* SCTP_STATE_ESTABLISHED */ \ |
856 | TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \ |
857 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
858 | TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \ |
859 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
860 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
861 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
862 | TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \ |
863 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
864 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
865 | } |
866 | |
867 | #define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \ |
868 | /* SCTP_STATE_EMPTY */ \ |
869 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
870 | /* SCTP_STATE_CLOSED */ \ |
871 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
872 | /* SCTP_STATE_COOKIE_WAIT */ \ |
873 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
874 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
875 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
876 | /* SCTP_STATE_ESTABLISHED */ \ |
877 | TYPE_SCTP_FUNC(sctp_sf_t4_timer_expire), \ |
878 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
879 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
880 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
881 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
882 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
883 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
884 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
885 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
886 | } |
887 | |
888 | #define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \ |
889 | /* SCTP_STATE_EMPTY */ \ |
890 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
891 | /* SCTP_STATE_CLOSED */ \ |
892 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
893 | /* SCTP_STATE_COOKIE_WAIT */ \ |
894 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
895 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
896 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
897 | /* SCTP_STATE_ESTABLISHED */ \ |
898 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
899 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
900 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
901 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
902 | TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \ |
903 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
904 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
905 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
906 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
907 | } |
908 | |
909 | #define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \ |
910 | /* SCTP_STATE_EMPTY */ \ |
911 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
912 | /* SCTP_STATE_CLOSED */ \ |
913 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
914 | /* SCTP_STATE_COOKIE_WAIT */ \ |
915 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
916 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
917 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
918 | /* SCTP_STATE_ESTABLISHED */ \ |
919 | TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \ |
920 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
921 | TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \ |
922 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
923 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
924 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
925 | TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \ |
926 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
927 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
928 | } |
929 | |
930 | #define TYPE_SCTP_EVENT_TIMEOUT_SACK { \ |
931 | /* SCTP_STATE_EMPTY */ \ |
932 | TYPE_SCTP_FUNC(sctp_sf_bug), \ |
933 | /* SCTP_STATE_CLOSED */ \ |
934 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
935 | /* SCTP_STATE_COOKIE_WAIT */ \ |
936 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
937 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
938 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
939 | /* SCTP_STATE_ESTABLISHED */ \ |
940 | TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \ |
941 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
942 | TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \ |
943 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
944 | TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \ |
945 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
946 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
947 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
948 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
949 | } |
950 | |
951 | #define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \ |
952 | /* SCTP_STATE_EMPTY */ \ |
953 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
954 | /* SCTP_STATE_CLOSED */ \ |
955 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
956 | /* SCTP_STATE_COOKIE_WAIT */ \ |
957 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
958 | /* SCTP_STATE_COOKIE_ECHOED */ \ |
959 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
960 | /* SCTP_STATE_ESTABLISHED */ \ |
961 | TYPE_SCTP_FUNC(sctp_sf_autoclose_timer_expire), \ |
962 | /* SCTP_STATE_SHUTDOWN_PENDING */ \ |
963 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
964 | /* SCTP_STATE_SHUTDOWN_SENT */ \ |
965 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
966 | /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ |
967 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
968 | /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ |
969 | TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \ |
970 | } |
971 | |
972 | static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = { |
973 | TYPE_SCTP_EVENT_TIMEOUT_NONE, |
974 | TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE, |
975 | TYPE_SCTP_EVENT_TIMEOUT_T1_INIT, |
976 | TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN, |
977 | TYPE_SCTP_EVENT_TIMEOUT_T3_RTX, |
978 | TYPE_SCTP_EVENT_TIMEOUT_T4_RTO, |
979 | TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD, |
980 | TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT, |
981 | TYPE_SCTP_EVENT_TIMEOUT_SACK, |
982 | TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE, |
983 | }; |
984 | |
985 | static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, |
986 | sctp_state_t state) |
987 | { |
988 | if (state > SCTP_STATE_MAX) |
989 | return &bug; |
990 | |
991 | if (cid <= SCTP_CID_BASE_MAX) |
992 | return &chunk_event_table[cid][state]; |
993 | |
994 | if (sctp_prsctp_enable) { |
995 | if (cid == SCTP_CID_FWD_TSN) |
996 | return &prsctp_chunk_event_table[0][state]; |
997 | } |
998 | |
999 | if (sctp_addip_enable) { |
1000 | if (cid == SCTP_CID_ASCONF) |
1001 | return &addip_chunk_event_table[0][state]; |
1002 | |
1003 | if (cid == SCTP_CID_ASCONF_ACK) |
1004 | return &addip_chunk_event_table[1][state]; |
1005 | } |
1006 | |
1007 | if (sctp_auth_enable) { |
1008 | if (cid == SCTP_CID_AUTH) |
1009 | return &auth_chunk_event_table[0][state]; |
1010 | } |
1011 | |
1012 | return &chunk_event_table_unknown[state]; |
1013 | } |
1014 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9