sm_statetable.c 31.2 KB
Newer Older
1
/* SCTP kernel implementation
L
Linus Torvalds 已提交
2 3 4 5 6 7
 * (C) Copyright IBM Corp. 2001, 2004
 * Copyright (c) 1999-2000 Cisco, Inc.
 * Copyright (c) 1999-2001 Motorola, Inc.
 * Copyright (c) 2001 Intel Corp.
 * Copyright (c) 2001 Nokia, Inc.
 *
8
 * This file is part of the SCTP kernel implementation
L
Linus Torvalds 已提交
9 10 11
 *
 * These are the state tables for the SCTP state machine.
 *
12
 * This SCTP implementation is free software;
L
Linus Torvalds 已提交
13 14 15 16 17
 * you can redistribute it and/or modify it under the terms of
 * the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
18
 * This SCTP implementation is distributed in the hope that it
L
Linus Torvalds 已提交
19 20 21 22 23 24
 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
 *                 ************************
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
25 26
 * along with GNU CC; see the file COPYING.  If not, see
 * <http://www.gnu.org/licenses/>.
L
Linus Torvalds 已提交
27 28 29
 *
 * Please send any bug reports or fixes you make to the
 * email address(es):
30
 *    lksctp developers <linux-sctp@vger.kernel.org>
L
Linus Torvalds 已提交
31 32 33 34 35 36 37 38 39 40 41
 *
 * Written or modified by:
 *    La Monte H.P. Yarroll <piggy@acm.org>
 *    Karl Knutson          <karl@athena.chicago.il.us>
 *    Jon Grimm             <jgrimm@us.ibm.com>
 *    Hui Huang		    <hui.huang@nokia.com>
 *    Daisy Chang	    <daisyc@us.ibm.com>
 *    Ardelle Fan	    <ardelle.fan@intel.com>
 *    Sridhar Samudrala	    <sri@us.ibm.com>
 */

42 43
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

L
Linus Torvalds 已提交
44 45 46 47 48 49 50 51 52 53 54
#include <linux/skbuff.h>
#include <net/sctp/sctp.h>
#include <net/sctp/sm.h>

static const sctp_sm_table_entry_t
primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES];
static const sctp_sm_table_entry_t
other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES];
static const sctp_sm_table_entry_t
timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES];

55 56
static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(struct net *net,
							    sctp_cid_t cid,
L
Linus Torvalds 已提交
57 58 59 60 61 62 63 64
							    sctp_state_t state);


static const sctp_sm_table_entry_t bug = {
	.fn = sctp_sf_bug,
	.name = "sctp_sf_bug"
};

65 66 67 68 69 70 71
#define DO_LOOKUP(_max, _type, _table)					\
({									\
	const sctp_sm_table_entry_t *rtn;				\
									\
	if ((event_subtype._type > (_max))) {				\
		pr_warn("table %p possible attack: event %d exceeds max %d\n", \
			_table, event_subtype._type, _max);		\
72
		rtn = &bug;						\
73 74 75 76 77
	} else								\
		rtn = &_table[event_subtype._type][(int)state];		\
									\
	rtn;								\
})
L
Linus Torvalds 已提交
78

79 80
const sctp_sm_table_entry_t *sctp_sm_lookup_event(struct net *net,
						  sctp_event_t event_type,
L
Linus Torvalds 已提交
81 82 83 84 85
						  sctp_state_t state,
						  sctp_subtype_t event_subtype)
{
	switch (event_type) {
	case SCTP_EVENT_T_CHUNK:
86
		return sctp_chunk_event_lookup(net, event_subtype.chunk, state);
L
Linus Torvalds 已提交
87
	case SCTP_EVENT_T_TIMEOUT:
88 89
		return DO_LOOKUP(SCTP_EVENT_TIMEOUT_MAX, timeout,
				 timeout_event_table);
L
Linus Torvalds 已提交
90
	case SCTP_EVENT_T_OTHER:
91 92
		return DO_LOOKUP(SCTP_EVENT_OTHER_MAX, other,
				 other_event_table);
L
Linus Torvalds 已提交
93
	case SCTP_EVENT_T_PRIMITIVE:
94 95
		return DO_LOOKUP(SCTP_EVENT_PRIMITIVE_MAX, primitive,
				 primitive_event_table);
L
Linus Torvalds 已提交
96 97 98
	default:
		/* Yikes!  We got an illegal event type.  */
		return &bug;
99
	}
L
Linus Torvalds 已提交
100 101
}

102 103
#define TYPE_SCTP_FUNC(func) {.fn = func, .name = #func}

L
Linus Torvalds 已提交
104 105
#define TYPE_SCTP_DATA { \
	/* SCTP_STATE_CLOSED */ \
106
	TYPE_SCTP_FUNC(sctp_sf_ootb), \
L
Linus Torvalds 已提交
107
	/* SCTP_STATE_COOKIE_WAIT */ \
108
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
109
	/* SCTP_STATE_COOKIE_ECHOED */ \
110
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
111
	/* SCTP_STATE_ESTABLISHED */ \
112
	TYPE_SCTP_FUNC(sctp_sf_eat_data_6_2), \
L
Linus Torvalds 已提交
113
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
114
	TYPE_SCTP_FUNC(sctp_sf_eat_data_6_2), \
L
Linus Torvalds 已提交
115
	/* SCTP_STATE_SHUTDOWN_SENT */ \
116
	TYPE_SCTP_FUNC(sctp_sf_eat_data_fast_4_4), \
L
Linus Torvalds 已提交
117
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
118
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
119
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
120
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
121 122 123 124
} /* TYPE_SCTP_DATA */

#define TYPE_SCTP_INIT { \
	/* SCTP_STATE_CLOSED */ \
125
	TYPE_SCTP_FUNC(sctp_sf_do_5_1B_init), \
L
Linus Torvalds 已提交
126
	/* SCTP_STATE_COOKIE_WAIT */ \
127
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_1_siminit), \
L
Linus Torvalds 已提交
128
	/* SCTP_STATE_COOKIE_ECHOED */ \
129
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_1_siminit), \
L
Linus Torvalds 已提交
130
	/* SCTP_STATE_ESTABLISHED */ \
131
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
L
Linus Torvalds 已提交
132
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
133
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
L
Linus Torvalds 已提交
134
	/* SCTP_STATE_SHUTDOWN_SENT */ \
135
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
L
Linus Torvalds 已提交
136
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
137
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_2_dupinit), \
L
Linus Torvalds 已提交
138
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
139
	TYPE_SCTP_FUNC(sctp_sf_do_9_2_reshutack), \
L
Linus Torvalds 已提交
140 141 142 143
} /* TYPE_SCTP_INIT */

#define TYPE_SCTP_INIT_ACK { \
	/* SCTP_STATE_CLOSED */ \
144
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_3_initack), \
L
Linus Torvalds 已提交
145
	/* SCTP_STATE_COOKIE_WAIT */ \
146
	TYPE_SCTP_FUNC(sctp_sf_do_5_1C_ack), \
L
Linus Torvalds 已提交
147
	/* SCTP_STATE_COOKIE_ECHOED */ \
148
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
149
	/* SCTP_STATE_ESTABLISHED */ \
150
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
151
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
152
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
153
	/* SCTP_STATE_SHUTDOWN_SENT */ \
154
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
155
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
156
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
157
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
158
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
159 160 161 162
} /* TYPE_SCTP_INIT_ACK */

#define TYPE_SCTP_SACK { \
	/* SCTP_STATE_CLOSED */ \
163
	TYPE_SCTP_FUNC(sctp_sf_ootb), \
L
Linus Torvalds 已提交
164
	/* SCTP_STATE_COOKIE_WAIT */ \
165
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
166
	/* SCTP_STATE_COOKIE_ECHOED */ \
167
	TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
L
Linus Torvalds 已提交
168
	/* SCTP_STATE_ESTABLISHED */ \
169
	TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
L
Linus Torvalds 已提交
170
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
171
	TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
L
Linus Torvalds 已提交
172
	/* SCTP_STATE_SHUTDOWN_SENT */ \
173
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
174
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
175
	TYPE_SCTP_FUNC(sctp_sf_eat_sack_6_2), \
L
Linus Torvalds 已提交
176
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
177
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
178 179 180 181
} /* TYPE_SCTP_SACK */

#define TYPE_SCTP_HEARTBEAT { \
	/* SCTP_STATE_CLOSED */ \
182
	TYPE_SCTP_FUNC(sctp_sf_ootb), \
L
Linus Torvalds 已提交
183
	/* SCTP_STATE_COOKIE_WAIT */ \
184
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
185
	/* SCTP_STATE_COOKIE_ECHOED */ \
186
	TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
L
Linus Torvalds 已提交
187
	/* SCTP_STATE_ESTABLISHED */ \
188
	TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
L
Linus Torvalds 已提交
189
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
190
	TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
L
Linus Torvalds 已提交
191
	/* SCTP_STATE_SHUTDOWN_SENT */ \
192
	TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
L
Linus Torvalds 已提交
193
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
194
	TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
L
Linus Torvalds 已提交
195 196
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
	/* This should not happen, but we are nice.  */ \
197
	TYPE_SCTP_FUNC(sctp_sf_beat_8_3), \
L
Linus Torvalds 已提交
198 199 200 201
} /* TYPE_SCTP_HEARTBEAT */

#define TYPE_SCTP_HEARTBEAT_ACK { \
	/* SCTP_STATE_CLOSED */ \
202
	TYPE_SCTP_FUNC(sctp_sf_ootb), \
L
Linus Torvalds 已提交
203
	/* SCTP_STATE_COOKIE_WAIT */ \
204
	TYPE_SCTP_FUNC(sctp_sf_violation), \
L
Linus Torvalds 已提交
205
	/* SCTP_STATE_COOKIE_ECHOED */ \
206
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
207
	/* SCTP_STATE_ESTABLISHED */ \
208
	TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
L
Linus Torvalds 已提交
209
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
210
	TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
L
Linus Torvalds 已提交
211
	/* SCTP_STATE_SHUTDOWN_SENT */ \
212
	TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
L
Linus Torvalds 已提交
213
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
214
	TYPE_SCTP_FUNC(sctp_sf_backbeat_8_3), \
L
Linus Torvalds 已提交
215
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
216
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
217 218 219 220
} /* TYPE_SCTP_HEARTBEAT_ACK */

#define TYPE_SCTP_ABORT { \
	/* SCTP_STATE_CLOSED */ \
221
	TYPE_SCTP_FUNC(sctp_sf_pdiscard), \
L
Linus Torvalds 已提交
222
	/* SCTP_STATE_COOKIE_WAIT */ \
223
	TYPE_SCTP_FUNC(sctp_sf_cookie_wait_abort), \
L
Linus Torvalds 已提交
224
	/* SCTP_STATE_COOKIE_ECHOED */ \
225
	TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_abort), \
L
Linus Torvalds 已提交
226
	/* SCTP_STATE_ESTABLISHED */ \
227
	TYPE_SCTP_FUNC(sctp_sf_do_9_1_abort), \
L
Linus Torvalds 已提交
228
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
229
	TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_abort), \
L
Linus Torvalds 已提交
230
	/* SCTP_STATE_SHUTDOWN_SENT */ \
231
	TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_abort), \
L
Linus Torvalds 已提交
232
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
233
	TYPE_SCTP_FUNC(sctp_sf_do_9_1_abort), \
L
Linus Torvalds 已提交
234
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
235
	TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_abort), \
L
Linus Torvalds 已提交
236 237 238 239
} /* TYPE_SCTP_ABORT */

#define TYPE_SCTP_SHUTDOWN { \
	/* SCTP_STATE_CLOSED */ \
240
	TYPE_SCTP_FUNC(sctp_sf_ootb), \
L
Linus Torvalds 已提交
241
	/* SCTP_STATE_COOKIE_WAIT */ \
242
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
243
	/* SCTP_STATE_COOKIE_ECHOED */ \
244
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
245
	/* SCTP_STATE_ESTABLISHED */ \
246
	TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown), \
L
Linus Torvalds 已提交
247
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
248
	TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown), \
L
Linus Torvalds 已提交
249
	/* SCTP_STATE_SHUTDOWN_SENT */ \
250
	TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \
L
Linus Torvalds 已提交
251
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
252
	TYPE_SCTP_FUNC(sctp_sf_do_9_2_shut_ctsn), \
L
Linus Torvalds 已提交
253
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
254
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
255 256 257 258
} /* TYPE_SCTP_SHUTDOWN */

#define TYPE_SCTP_SHUTDOWN_ACK { \
	/* SCTP_STATE_CLOSED */ \
259
	TYPE_SCTP_FUNC(sctp_sf_ootb), \
L
Linus Torvalds 已提交
260
	/* SCTP_STATE_COOKIE_WAIT */ \
261
	TYPE_SCTP_FUNC(sctp_sf_do_8_5_1_E_sa), \
L
Linus Torvalds 已提交
262
	/* SCTP_STATE_COOKIE_ECHOED */ \
263
	TYPE_SCTP_FUNC(sctp_sf_do_8_5_1_E_sa), \
L
Linus Torvalds 已提交
264
	/* SCTP_STATE_ESTABLISHED */ \
265
	TYPE_SCTP_FUNC(sctp_sf_violation), \
L
Linus Torvalds 已提交
266
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
267
	TYPE_SCTP_FUNC(sctp_sf_violation), \
L
Linus Torvalds 已提交
268
	/* SCTP_STATE_SHUTDOWN_SENT */ \
269
	TYPE_SCTP_FUNC(sctp_sf_do_9_2_final), \
L
Linus Torvalds 已提交
270
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
271
	TYPE_SCTP_FUNC(sctp_sf_violation), \
L
Linus Torvalds 已提交
272
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
273
	TYPE_SCTP_FUNC(sctp_sf_do_9_2_final), \
L
Linus Torvalds 已提交
274 275 276 277
} /* TYPE_SCTP_SHUTDOWN_ACK */

#define TYPE_SCTP_ERROR { \
	/* SCTP_STATE_CLOSED */ \
278
	TYPE_SCTP_FUNC(sctp_sf_ootb), \
L
Linus Torvalds 已提交
279
	/* SCTP_STATE_COOKIE_WAIT */ \
280
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
281
	/* SCTP_STATE_COOKIE_ECHOED */ \
282
	TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_err), \
L
Linus Torvalds 已提交
283
	/* SCTP_STATE_ESTABLISHED */ \
284
	TYPE_SCTP_FUNC(sctp_sf_operr_notify), \
L
Linus Torvalds 已提交
285
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
286
	TYPE_SCTP_FUNC(sctp_sf_operr_notify), \
L
Linus Torvalds 已提交
287
	/* SCTP_STATE_SHUTDOWN_SENT */ \
288
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
289
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
290
	TYPE_SCTP_FUNC(sctp_sf_operr_notify), \
L
Linus Torvalds 已提交
291
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
292
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
293 294 295 296
} /* TYPE_SCTP_ERROR */

#define TYPE_SCTP_COOKIE_ECHO { \
	/* SCTP_STATE_CLOSED */ \
297
	TYPE_SCTP_FUNC(sctp_sf_do_5_1D_ce), \
L
Linus Torvalds 已提交
298
	/* SCTP_STATE_COOKIE_WAIT */ \
299
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
L
Linus Torvalds 已提交
300
	/* SCTP_STATE_COOKIE_ECHOED */ \
301
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
L
Linus Torvalds 已提交
302
	/* SCTP_STATE_ESTABLISHED */ \
303
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
L
Linus Torvalds 已提交
304
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
305
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
L
Linus Torvalds 已提交
306
	/* SCTP_STATE_SHUTDOWN_SENT */ \
307
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
L
Linus Torvalds 已提交
308
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
309
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
L
Linus Torvalds 已提交
310
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
311
	TYPE_SCTP_FUNC(sctp_sf_do_5_2_4_dupcook), \
L
Linus Torvalds 已提交
312 313 314 315
} /* TYPE_SCTP_COOKIE_ECHO */

#define TYPE_SCTP_COOKIE_ACK { \
	/* SCTP_STATE_CLOSED */ \
316
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
317
	/* SCTP_STATE_COOKIE_WAIT */ \
318
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
319
	/* SCTP_STATE_COOKIE_ECHOED */ \
320
	TYPE_SCTP_FUNC(sctp_sf_do_5_1E_ca), \
L
Linus Torvalds 已提交
321
	/* SCTP_STATE_ESTABLISHED */ \
322
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
323
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
324
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
325
	/* SCTP_STATE_SHUTDOWN_SENT */ \
326
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
327
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
328
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
329
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
330
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
331 332 333 334
} /* TYPE_SCTP_COOKIE_ACK */

#define TYPE_SCTP_ECN_ECNE { \
	/* SCTP_STATE_CLOSED */ \
335
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
336
	/* SCTP_STATE_COOKIE_WAIT */ \
337
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
338
	/* SCTP_STATE_COOKIE_ECHOED */ \
339
	TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
L
Linus Torvalds 已提交
340
	/* SCTP_STATE_ESTABLISHED */ \
341
	TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
L
Linus Torvalds 已提交
342
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
343
	TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
L
Linus Torvalds 已提交
344
	/* SCTP_STATE_SHUTDOWN_SENT */ \
345
	TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
L
Linus Torvalds 已提交
346
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
347
	TYPE_SCTP_FUNC(sctp_sf_do_ecne), \
L
Linus Torvalds 已提交
348
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
349
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
350 351 352 353
} /* TYPE_SCTP_ECN_ECNE */

#define TYPE_SCTP_ECN_CWR { \
	/* SCTP_STATE_CLOSED */ \
354
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
355
	/* SCTP_STATE_COOKIE_WAIT */ \
356
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
357
	/* SCTP_STATE_COOKIE_ECHOED */ \
358
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
359
	/* SCTP_STATE_ESTABLISHED */ \
360
	TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \
L
Linus Torvalds 已提交
361
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
362
	TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \
L
Linus Torvalds 已提交
363
	/* SCTP_STATE_SHUTDOWN_SENT */ \
364
	TYPE_SCTP_FUNC(sctp_sf_do_ecn_cwr), \
L
Linus Torvalds 已提交
365
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
366
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
367
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
368
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
369 370 371 372
} /* TYPE_SCTP_ECN_CWR */

#define TYPE_SCTP_SHUTDOWN_COMPLETE { \
	/* SCTP_STATE_CLOSED */ \
373
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
374
	/* SCTP_STATE_COOKIE_WAIT */ \
375
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
376
	/* SCTP_STATE_COOKIE_ECHOED */ \
377
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
378
	/* SCTP_STATE_ESTABLISHED */ \
379
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
380
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
381
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
382
	/* SCTP_STATE_SHUTDOWN_SENT */ \
383
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
384
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
385
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
386
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
387
	TYPE_SCTP_FUNC(sctp_sf_do_4_C), \
L
Linus Torvalds 已提交
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414
} /* TYPE_SCTP_SHUTDOWN_COMPLETE */

/* The primary index for this table is the chunk type.
 * The secondary index for this table is the state.
 *
 * For base protocol (RFC 2960).
 */
static const sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
	TYPE_SCTP_DATA,
	TYPE_SCTP_INIT,
	TYPE_SCTP_INIT_ACK,
	TYPE_SCTP_SACK,
	TYPE_SCTP_HEARTBEAT,
	TYPE_SCTP_HEARTBEAT_ACK,
	TYPE_SCTP_ABORT,
	TYPE_SCTP_SHUTDOWN,
	TYPE_SCTP_SHUTDOWN_ACK,
	TYPE_SCTP_ERROR,
	TYPE_SCTP_COOKIE_ECHO,
	TYPE_SCTP_COOKIE_ACK,
	TYPE_SCTP_ECN_ECNE,
	TYPE_SCTP_ECN_CWR,
	TYPE_SCTP_SHUTDOWN_COMPLETE,
}; /* state_fn_t chunk_event_table[][] */

#define TYPE_SCTP_ASCONF { \
	/* SCTP_STATE_CLOSED */ \
415
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
416
	/* SCTP_STATE_COOKIE_WAIT */ \
417
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
418
	/* SCTP_STATE_COOKIE_ECHOED */ \
419
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
420
	/* SCTP_STATE_ESTABLISHED */ \
421
	TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
L
Linus Torvalds 已提交
422
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
423
	TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
L
Linus Torvalds 已提交
424
	/* SCTP_STATE_SHUTDOWN_SENT */ \
425
	TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
L
Linus Torvalds 已提交
426
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
427
	TYPE_SCTP_FUNC(sctp_sf_do_asconf), \
L
Linus Torvalds 已提交
428
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
429
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
430 431 432 433
} /* TYPE_SCTP_ASCONF */

#define TYPE_SCTP_ASCONF_ACK { \
	/* SCTP_STATE_CLOSED */ \
434
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
435
	/* SCTP_STATE_COOKIE_WAIT */ \
436
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
437
	/* SCTP_STATE_COOKIE_ECHOED */ \
438
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
439
	/* SCTP_STATE_ESTABLISHED */ \
440
	TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
L
Linus Torvalds 已提交
441
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
442
	TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
L
Linus Torvalds 已提交
443
	/* SCTP_STATE_SHUTDOWN_SENT */ \
444
	TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
L
Linus Torvalds 已提交
445
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
446
	TYPE_SCTP_FUNC(sctp_sf_do_asconf_ack), \
L
Linus Torvalds 已提交
447
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
448
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
449 450 451 452 453 454 455 456 457 458 459 460
} /* TYPE_SCTP_ASCONF_ACK */

/* The primary index for this table is the chunk type.
 * The secondary index for this table is the state.
 */
static const sctp_sm_table_entry_t addip_chunk_event_table[SCTP_NUM_ADDIP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
	TYPE_SCTP_ASCONF,
	TYPE_SCTP_ASCONF_ACK,
}; /*state_fn_t addip_chunk_event_table[][] */

#define TYPE_SCTP_FWD_TSN { \
	/* SCTP_STATE_CLOSED */ \
461
	TYPE_SCTP_FUNC(sctp_sf_ootb), \
L
Linus Torvalds 已提交
462
	/* SCTP_STATE_COOKIE_WAIT */ \
463
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
464
	/* SCTP_STATE_COOKIE_ECHOED */ \
465
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
466
	/* SCTP_STATE_ESTABLISHED */ \
467
	TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \
L
Linus Torvalds 已提交
468
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
469
	TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn), \
L
Linus Torvalds 已提交
470
	/* SCTP_STATE_SHUTDOWN_SENT */ \
471
	TYPE_SCTP_FUNC(sctp_sf_eat_fwd_tsn_fast), \
L
Linus Torvalds 已提交
472
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
473
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
474
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
475
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
L
Linus Torvalds 已提交
476 477 478 479 480 481 482 483 484
} /* TYPE_SCTP_FWD_TSN */

/* The primary index for this table is the chunk type.
 * The secondary index for this table is the state.
 */
static const sctp_sm_table_entry_t prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
	TYPE_SCTP_FWD_TSN,
}; /*state_fn_t prsctp_chunk_event_table[][] */

485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
#define TYPE_SCTP_AUTH { \
	/* SCTP_STATE_CLOSED */ \
	TYPE_SCTP_FUNC(sctp_sf_ootb), \
	/* SCTP_STATE_COOKIE_WAIT */ \
	TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
	/* SCTP_STATE_COOKIE_ECHOED */ \
	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
	/* SCTP_STATE_ESTABLISHED */ \
	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
	/* SCTP_STATE_SHUTDOWN_SENT */ \
	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
	TYPE_SCTP_FUNC(sctp_sf_eat_auth), \
} /* TYPE_SCTP_AUTH */

/* The primary index for this table is the chunk type.
 * The secondary index for this table is the state.
 */
static const sctp_sm_table_entry_t auth_chunk_event_table[SCTP_NUM_AUTH_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
	TYPE_SCTP_AUTH,
}; /*state_fn_t auth_chunk_event_table[][] */

L
Linus Torvalds 已提交
511 512 513
static const sctp_sm_table_entry_t
chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
	/* SCTP_STATE_CLOSED */
514
	TYPE_SCTP_FUNC(sctp_sf_ootb),
L
Linus Torvalds 已提交
515
	/* SCTP_STATE_COOKIE_WAIT */
516
	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
L
Linus Torvalds 已提交
517
	/* SCTP_STATE_COOKIE_ECHOED */
518
	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
L
Linus Torvalds 已提交
519
	/* SCTP_STATE_ESTABLISHED */
520
	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
L
Linus Torvalds 已提交
521
	/* SCTP_STATE_SHUTDOWN_PENDING */
522
	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
L
Linus Torvalds 已提交
523
	/* SCTP_STATE_SHUTDOWN_SENT */
524
	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
L
Linus Torvalds 已提交
525
	/* SCTP_STATE_SHUTDOWN_RECEIVED */
526
	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
L
Linus Torvalds 已提交
527
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */
528
	TYPE_SCTP_FUNC(sctp_sf_unk_chunk),
L
Linus Torvalds 已提交
529 530 531 532 533
};	/* chunk unknown */


#define TYPE_SCTP_PRIMITIVE_ASSOCIATE  { \
	/* SCTP_STATE_CLOSED */ \
534
	TYPE_SCTP_FUNC(sctp_sf_do_prm_asoc), \
L
Linus Torvalds 已提交
535
	/* SCTP_STATE_COOKIE_WAIT */ \
536
	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
L
Linus Torvalds 已提交
537
	/* SCTP_STATE_COOKIE_ECHOED */ \
538
	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
L
Linus Torvalds 已提交
539
	/* SCTP_STATE_ESTABLISHED */ \
540
	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
L
Linus Torvalds 已提交
541
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
542
	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
L
Linus Torvalds 已提交
543
	/* SCTP_STATE_SHUTDOWN_SENT */ \
544
	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
L
Linus Torvalds 已提交
545
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
546
	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
L
Linus Torvalds 已提交
547
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
548
	TYPE_SCTP_FUNC(sctp_sf_not_impl), \
L
Linus Torvalds 已提交
549 550 551 552
} /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */

#define TYPE_SCTP_PRIMITIVE_SHUTDOWN  { \
	/* SCTP_STATE_CLOSED */ \
553
	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
L
Linus Torvalds 已提交
554
	/* SCTP_STATE_COOKIE_WAIT */ \
555
	TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_shutdown), \
L
Linus Torvalds 已提交
556
	/* SCTP_STATE_COOKIE_ECHOED */ \
557
	TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_shutdown),\
L
Linus Torvalds 已提交
558
	/* SCTP_STATE_ESTABLISHED */ \
559
	TYPE_SCTP_FUNC(sctp_sf_do_9_2_prm_shutdown), \
L
Linus Torvalds 已提交
560
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
561
	TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
L
Linus Torvalds 已提交
562
	/* SCTP_STATE_SHUTDOWN_SENT */ \
563
	TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
L
Linus Torvalds 已提交
564
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
565
	TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
L
Linus Torvalds 已提交
566
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
567
	TYPE_SCTP_FUNC(sctp_sf_ignore_primitive), \
L
Linus Torvalds 已提交
568 569 570 571
} /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */

#define TYPE_SCTP_PRIMITIVE_ABORT  { \
	/* SCTP_STATE_CLOSED */ \
572
	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
L
Linus Torvalds 已提交
573
	/* SCTP_STATE_COOKIE_WAIT */ \
574
	TYPE_SCTP_FUNC(sctp_sf_cookie_wait_prm_abort), \
L
Linus Torvalds 已提交
575
	/* SCTP_STATE_COOKIE_ECHOED */ \
576
	TYPE_SCTP_FUNC(sctp_sf_cookie_echoed_prm_abort), \
L
Linus Torvalds 已提交
577
	/* SCTP_STATE_ESTABLISHED */ \
578
	TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
L
Linus Torvalds 已提交
579
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
580
	TYPE_SCTP_FUNC(sctp_sf_shutdown_pending_prm_abort), \
L
Linus Torvalds 已提交
581
	/* SCTP_STATE_SHUTDOWN_SENT */ \
582
	TYPE_SCTP_FUNC(sctp_sf_shutdown_sent_prm_abort), \
L
Linus Torvalds 已提交
583
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
584
	TYPE_SCTP_FUNC(sctp_sf_do_9_1_prm_abort), \
L
Linus Torvalds 已提交
585
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
586
	TYPE_SCTP_FUNC(sctp_sf_shutdown_ack_sent_prm_abort), \
L
Linus Torvalds 已提交
587 588 589 590
} /* TYPE_SCTP_PRIMITIVE_ABORT */

#define TYPE_SCTP_PRIMITIVE_SEND  { \
	/* SCTP_STATE_CLOSED */ \
591
	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
L
Linus Torvalds 已提交
592
	/* SCTP_STATE_COOKIE_WAIT */ \
593
	TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
L
Linus Torvalds 已提交
594
	/* SCTP_STATE_COOKIE_ECHOED */ \
595
	TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
L
Linus Torvalds 已提交
596
	/* SCTP_STATE_ESTABLISHED */ \
597
	TYPE_SCTP_FUNC(sctp_sf_do_prm_send), \
L
Linus Torvalds 已提交
598
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
599
	TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
L
Linus Torvalds 已提交
600
	/* SCTP_STATE_SHUTDOWN_SENT */ \
601
	TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
L
Linus Torvalds 已提交
602
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
603
	TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
L
Linus Torvalds 已提交
604
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
605
	TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
L
Linus Torvalds 已提交
606 607 608 609
} /* TYPE_SCTP_PRIMITIVE_SEND */

#define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT  { \
	/* SCTP_STATE_CLOSED */ \
610
	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
L
Linus Torvalds 已提交
611
	/* SCTP_STATE_COOKIE_WAIT */ \
612
	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
L
Linus Torvalds 已提交
613
	/* SCTP_STATE_COOKIE_ECHOED */ \
614
	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
L
Linus Torvalds 已提交
615
	/* SCTP_STATE_ESTABLISHED */ \
616
	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
L
Linus Torvalds 已提交
617
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
618
	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
L
Linus Torvalds 已提交
619
	/* SCTP_STATE_SHUTDOWN_SENT */ \
620
	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
L
Linus Torvalds 已提交
621
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
622
	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
L
Linus Torvalds 已提交
623
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
624
	TYPE_SCTP_FUNC(sctp_sf_do_prm_requestheartbeat),          \
L
Linus Torvalds 已提交
625 626 627 628
} /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */

#define TYPE_SCTP_PRIMITIVE_ASCONF { \
	/* SCTP_STATE_CLOSED */ \
629
	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
L
Linus Torvalds 已提交
630
	/* SCTP_STATE_COOKIE_WAIT */ \
631
	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
L
Linus Torvalds 已提交
632
	/* SCTP_STATE_COOKIE_ECHOED */ \
633
	TYPE_SCTP_FUNC(sctp_sf_error_closed), \
L
Linus Torvalds 已提交
634
	/* SCTP_STATE_ESTABLISHED */ \
635
	TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
L
Linus Torvalds 已提交
636
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
637
	TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
L
Linus Torvalds 已提交
638
	/* SCTP_STATE_SHUTDOWN_SENT */ \
639
	TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
L
Linus Torvalds 已提交
640
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
641
	TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
L
Linus Torvalds 已提交
642
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
643
	TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
644
} /* TYPE_SCTP_PRIMITIVE_ASCONF */
L
Linus Torvalds 已提交
645 646 647 648 649 650 651 652 653 654 655 656 657 658 659

/* The primary index for this table is the primitive type.
 * The secondary index for this table is the state.
 */
static const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = {
	TYPE_SCTP_PRIMITIVE_ASSOCIATE,
	TYPE_SCTP_PRIMITIVE_SHUTDOWN,
	TYPE_SCTP_PRIMITIVE_ABORT,
	TYPE_SCTP_PRIMITIVE_SEND,
	TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
	TYPE_SCTP_PRIMITIVE_ASCONF,
};

#define TYPE_SCTP_OTHER_NO_PENDING_TSN  { \
	/* SCTP_STATE_CLOSED */ \
660
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
661
	/* SCTP_STATE_COOKIE_WAIT */ \
662
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
663
	/* SCTP_STATE_COOKIE_ECHOED */ \
664
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
665
	/* SCTP_STATE_ESTABLISHED */ \
666
	TYPE_SCTP_FUNC(sctp_sf_do_no_pending_tsn), \
L
Linus Torvalds 已提交
667
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
668
	TYPE_SCTP_FUNC(sctp_sf_do_9_2_start_shutdown), \
L
Linus Torvalds 已提交
669
	/* SCTP_STATE_SHUTDOWN_SENT */ \
670
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
671
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
672
	TYPE_SCTP_FUNC(sctp_sf_do_9_2_shutdown_ack), \
L
Linus Torvalds 已提交
673
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
674
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
675 676 677 678
}

#define TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH  { \
	/* SCTP_STATE_CLOSED */ \
679
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
680
	/* SCTP_STATE_COOKIE_WAIT */ \
681
	TYPE_SCTP_FUNC(sctp_sf_cookie_wait_icmp_abort), \
L
Linus Torvalds 已提交
682
	/* SCTP_STATE_COOKIE_ECHOED */ \
683
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
684
	/* SCTP_STATE_ESTABLISHED */ \
685
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
686
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
687
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
688
	/* SCTP_STATE_SHUTDOWN_SENT */ \
689
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
690
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
691
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
692
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
693
	TYPE_SCTP_FUNC(sctp_sf_ignore_other), \
L
Linus Torvalds 已提交
694 695 696 697 698 699 700 701 702
}

static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = {
	TYPE_SCTP_OTHER_NO_PENDING_TSN,
	TYPE_SCTP_OTHER_ICMP_PROTO_UNREACH,
};

#define TYPE_SCTP_EVENT_TIMEOUT_NONE { \
	/* SCTP_STATE_CLOSED */ \
703
	TYPE_SCTP_FUNC(sctp_sf_bug), \
L
Linus Torvalds 已提交
704
	/* SCTP_STATE_COOKIE_WAIT */ \
705
	TYPE_SCTP_FUNC(sctp_sf_bug), \
L
Linus Torvalds 已提交
706
	/* SCTP_STATE_COOKIE_ECHOED */ \
707
	TYPE_SCTP_FUNC(sctp_sf_bug), \
L
Linus Torvalds 已提交
708
	/* SCTP_STATE_ESTABLISHED */ \
709
	TYPE_SCTP_FUNC(sctp_sf_bug), \
L
Linus Torvalds 已提交
710
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
711
	TYPE_SCTP_FUNC(sctp_sf_bug), \
L
Linus Torvalds 已提交
712
	/* SCTP_STATE_SHUTDOWN_SENT */ \
713
	TYPE_SCTP_FUNC(sctp_sf_bug), \
L
Linus Torvalds 已提交
714
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
715
	TYPE_SCTP_FUNC(sctp_sf_bug), \
L
Linus Torvalds 已提交
716
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
717
	TYPE_SCTP_FUNC(sctp_sf_bug), \
L
Linus Torvalds 已提交
718 719 720 721
}

#define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \
	/* SCTP_STATE_CLOSED */ \
722
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
723
	/* SCTP_STATE_COOKIE_WAIT */ \
724
	TYPE_SCTP_FUNC(sctp_sf_bug), \
L
Linus Torvalds 已提交
725
	/* SCTP_STATE_COOKIE_ECHOED */ \
726
	TYPE_SCTP_FUNC(sctp_sf_t1_cookie_timer_expire), \
L
Linus Torvalds 已提交
727
	/* SCTP_STATE_ESTABLISHED */ \
728
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
729
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
730
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
731
	/* SCTP_STATE_SHUTDOWN_SENT */ \
732
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
733
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
734
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
735
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
736
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
737 738 739 740
}

#define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \
	/* SCTP_STATE_CLOSED */ \
741
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
742
	/* SCTP_STATE_COOKIE_WAIT */ \
743
	TYPE_SCTP_FUNC(sctp_sf_t1_init_timer_expire), \
L
Linus Torvalds 已提交
744
	/* SCTP_STATE_COOKIE_ECHOED */ \
745
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
746
	/* SCTP_STATE_ESTABLISHED */ \
747
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
748
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
749
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
750
	/* SCTP_STATE_SHUTDOWN_SENT */ \
751
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
752
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
753
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
754
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
755
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
756 757 758 759
}

#define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \
	/* SCTP_STATE_CLOSED */ \
760
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
761
	/* SCTP_STATE_COOKIE_WAIT */ \
762
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
763
	/* SCTP_STATE_COOKIE_ECHOED */ \
764
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
765
	/* SCTP_STATE_ESTABLISHED */ \
766
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
767
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
768
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
769
	/* SCTP_STATE_SHUTDOWN_SENT */ \
770
	TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
L
Linus Torvalds 已提交
771
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
772
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
773
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
774
	TYPE_SCTP_FUNC(sctp_sf_t2_timer_expire), \
L
Linus Torvalds 已提交
775 776 777 778
}

#define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \
	/* SCTP_STATE_CLOSED */ \
779
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
780
	/* SCTP_STATE_COOKIE_WAIT */ \
781
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
782
	/* SCTP_STATE_COOKIE_ECHOED */ \
783
	TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
L
Linus Torvalds 已提交
784
	/* SCTP_STATE_ESTABLISHED */ \
785
	TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
L
Linus Torvalds 已提交
786
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
787
	TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
L
Linus Torvalds 已提交
788
	/* SCTP_STATE_SHUTDOWN_SENT */ \
789
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
790
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
791
	TYPE_SCTP_FUNC(sctp_sf_do_6_3_3_rtx), \
L
Linus Torvalds 已提交
792
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
793
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
794 795 796 797
}

#define TYPE_SCTP_EVENT_TIMEOUT_T4_RTO { \
	/* SCTP_STATE_CLOSED */ \
798
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
799
	/* SCTP_STATE_COOKIE_WAIT */ \
800
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
801
	/* SCTP_STATE_COOKIE_ECHOED */ \
802
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
803
	/* SCTP_STATE_ESTABLISHED */ \
804
	TYPE_SCTP_FUNC(sctp_sf_t4_timer_expire), \
L
Linus Torvalds 已提交
805
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
806
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
807
	/* SCTP_STATE_SHUTDOWN_SENT */ \
808
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
809
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
810
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
811
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
812
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
813 814 815 816
}

#define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \
	/* SCTP_STATE_CLOSED */ \
817
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
818
	/* SCTP_STATE_COOKIE_WAIT */ \
819
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
820
	/* SCTP_STATE_COOKIE_ECHOED */ \
821
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
822
	/* SCTP_STATE_ESTABLISHED */ \
823
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
824
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
825
	TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
L
Linus Torvalds 已提交
826
	/* SCTP_STATE_SHUTDOWN_SENT */ \
827
	TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
L
Linus Torvalds 已提交
828
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
829
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
830
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
831
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
832 833 834 835
}

#define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \
	/* SCTP_STATE_CLOSED */ \
836
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
837
	/* SCTP_STATE_COOKIE_WAIT */ \
838
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
839
	/* SCTP_STATE_COOKIE_ECHOED */ \
840
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
841
	/* SCTP_STATE_ESTABLISHED */ \
842
	TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
L
Linus Torvalds 已提交
843
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
844
	TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
L
Linus Torvalds 已提交
845
	/* SCTP_STATE_SHUTDOWN_SENT */ \
846
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
847
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
848
	TYPE_SCTP_FUNC(sctp_sf_sendbeat_8_3), \
L
Linus Torvalds 已提交
849
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
850
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
851 852 853 854
}

#define TYPE_SCTP_EVENT_TIMEOUT_SACK { \
	/* SCTP_STATE_CLOSED */ \
855
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
856
	/* SCTP_STATE_COOKIE_WAIT */ \
857
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
858
	/* SCTP_STATE_COOKIE_ECHOED */ \
859
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
860
	/* SCTP_STATE_ESTABLISHED */ \
861
	TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
L
Linus Torvalds 已提交
862
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
863
	TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
L
Linus Torvalds 已提交
864
	/* SCTP_STATE_SHUTDOWN_SENT */ \
865
	TYPE_SCTP_FUNC(sctp_sf_do_6_2_sack), \
L
Linus Torvalds 已提交
866
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
867
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
868
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
869
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
870 871 872 873
}

#define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \
	/* SCTP_STATE_CLOSED */ \
874
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
875
	/* SCTP_STATE_COOKIE_WAIT */ \
876
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
877
	/* SCTP_STATE_COOKIE_ECHOED */ \
878
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
879
	/* SCTP_STATE_ESTABLISHED */ \
880
	TYPE_SCTP_FUNC(sctp_sf_autoclose_timer_expire), \
L
Linus Torvalds 已提交
881
	/* SCTP_STATE_SHUTDOWN_PENDING */ \
882
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
883
	/* SCTP_STATE_SHUTDOWN_SENT */ \
884
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
885
	/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
886
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
887
	/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
888
	TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
L
Linus Torvalds 已提交
889 890 891 892 893 894 895 896 897 898 899 900 901 902 903
}

static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = {
	TYPE_SCTP_EVENT_TIMEOUT_NONE,
	TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE,
	TYPE_SCTP_EVENT_TIMEOUT_T1_INIT,
	TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN,
	TYPE_SCTP_EVENT_TIMEOUT_T3_RTX,
	TYPE_SCTP_EVENT_TIMEOUT_T4_RTO,
	TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD,
	TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT,
	TYPE_SCTP_EVENT_TIMEOUT_SACK,
	TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
};

904 905
static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(struct net *net,
							    sctp_cid_t cid,
L
Linus Torvalds 已提交
906 907 908 909 910
							    sctp_state_t state)
{
	if (state > SCTP_STATE_MAX)
		return &bug;

911
	if (cid <= SCTP_CID_BASE_MAX)
L
Linus Torvalds 已提交
912 913
		return &chunk_event_table[cid][state];

914
	if (net->sctp.prsctp_enable) {
L
Linus Torvalds 已提交
915 916 917 918
		if (cid == SCTP_CID_FWD_TSN)
			return &prsctp_chunk_event_table[0][state];
	}

919
	if (net->sctp.addip_enable) {
L
Linus Torvalds 已提交
920 921 922 923 924 925 926
		if (cid == SCTP_CID_ASCONF)
			return &addip_chunk_event_table[0][state];

		if (cid == SCTP_CID_ASCONF_ACK)
			return &addip_chunk_event_table[1][state];
	}

927
	if (net->sctp.auth_enable) {
928 929 930 931
		if (cid == SCTP_CID_AUTH)
			return &auth_chunk_event_table[0][state];
	}

L
Linus Torvalds 已提交
932 933
	return &chunk_event_table_unknown[state];
}