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