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