1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43#include <linux/types.h>
44#include <linux/compiler.h>
45#include <linux/slab.h>
46#include <linux/in.h>
47#include <net/sctp/command.h>
48#include <net/sctp/sctp.h>
49
50#ifndef __sctp_sm_h__
51#define __sctp_sm_h__
52
53
54
55
56typedef enum {
57 SCTP_DISPOSITION_DISCARD,
58 SCTP_DISPOSITION_CONSUME,
59 SCTP_DISPOSITION_NOMEM,
60 SCTP_DISPOSITION_DELETE_TCB,
61 SCTP_DISPOSITION_ABORT,
62 SCTP_DISPOSITION_VIOLATION,
63 SCTP_DISPOSITION_NOT_IMPL,
64 SCTP_DISPOSITION_ERROR,
65 SCTP_DISPOSITION_BUG,
66} sctp_disposition_t;
67
68typedef struct {
69 int name;
70 int action;
71} sctp_sm_command_t;
72
73typedef sctp_disposition_t (sctp_state_fn_t) (struct net *,
74 const struct sctp_endpoint *,
75 const struct sctp_association *,
76 const sctp_subtype_t type,
77 void *arg,
78 sctp_cmd_seq_t *);
79typedef void (sctp_timer_event_t) (unsigned long);
80typedef struct {
81 sctp_state_fn_t *fn;
82 const char *name;
83} sctp_sm_table_entry_t;
84
85
86
87
88
89
90sctp_state_fn_t sctp_sf_not_impl;
91sctp_state_fn_t sctp_sf_bug;
92
93
94sctp_state_fn_t sctp_sf_timer_ignore;
95
96
97sctp_state_fn_t sctp_sf_do_9_1_abort;
98sctp_state_fn_t sctp_sf_cookie_wait_abort;
99sctp_state_fn_t sctp_sf_cookie_echoed_abort;
100sctp_state_fn_t sctp_sf_shutdown_pending_abort;
101sctp_state_fn_t sctp_sf_shutdown_sent_abort;
102sctp_state_fn_t sctp_sf_shutdown_ack_sent_abort;
103sctp_state_fn_t sctp_sf_do_5_1B_init;
104sctp_state_fn_t sctp_sf_do_5_1C_ack;
105sctp_state_fn_t sctp_sf_do_5_1D_ce;
106sctp_state_fn_t sctp_sf_do_5_1E_ca;
107sctp_state_fn_t sctp_sf_do_4_C;
108sctp_state_fn_t sctp_sf_eat_data_6_2;
109sctp_state_fn_t sctp_sf_eat_data_fast_4_4;
110sctp_state_fn_t sctp_sf_eat_sack_6_2;
111sctp_state_fn_t sctp_sf_operr_notify;
112sctp_state_fn_t sctp_sf_t1_init_timer_expire;
113sctp_state_fn_t sctp_sf_t1_cookie_timer_expire;
114sctp_state_fn_t sctp_sf_t2_timer_expire;
115sctp_state_fn_t sctp_sf_t4_timer_expire;
116sctp_state_fn_t sctp_sf_t5_timer_expire;
117sctp_state_fn_t sctp_sf_sendbeat_8_3;
118sctp_state_fn_t sctp_sf_beat_8_3;
119sctp_state_fn_t sctp_sf_backbeat_8_3;
120sctp_state_fn_t sctp_sf_do_9_2_final;
121sctp_state_fn_t sctp_sf_do_9_2_shutdown;
122sctp_state_fn_t sctp_sf_do_9_2_shut_ctsn;
123sctp_state_fn_t sctp_sf_do_ecn_cwr;
124sctp_state_fn_t sctp_sf_do_ecne;
125sctp_state_fn_t sctp_sf_ootb;
126sctp_state_fn_t sctp_sf_pdiscard;
127sctp_state_fn_t sctp_sf_violation;
128sctp_state_fn_t sctp_sf_discard_chunk;
129sctp_state_fn_t sctp_sf_do_5_2_1_siminit;
130sctp_state_fn_t sctp_sf_do_5_2_2_dupinit;
131sctp_state_fn_t sctp_sf_do_5_2_3_initack;
132sctp_state_fn_t sctp_sf_do_5_2_4_dupcook;
133sctp_state_fn_t sctp_sf_unk_chunk;
134sctp_state_fn_t sctp_sf_do_8_5_1_E_sa;
135sctp_state_fn_t sctp_sf_cookie_echoed_err;
136sctp_state_fn_t sctp_sf_do_asconf;
137sctp_state_fn_t sctp_sf_do_asconf_ack;
138sctp_state_fn_t sctp_sf_do_9_2_reshutack;
139sctp_state_fn_t sctp_sf_eat_fwd_tsn;
140sctp_state_fn_t sctp_sf_eat_fwd_tsn_fast;
141sctp_state_fn_t sctp_sf_eat_auth;
142
143
144sctp_state_fn_t sctp_sf_do_prm_asoc;
145sctp_state_fn_t sctp_sf_do_prm_send;
146sctp_state_fn_t sctp_sf_do_9_2_prm_shutdown;
147sctp_state_fn_t sctp_sf_cookie_wait_prm_shutdown;
148sctp_state_fn_t sctp_sf_cookie_echoed_prm_shutdown;
149sctp_state_fn_t sctp_sf_do_9_1_prm_abort;
150sctp_state_fn_t sctp_sf_cookie_wait_prm_abort;
151sctp_state_fn_t sctp_sf_cookie_echoed_prm_abort;
152sctp_state_fn_t sctp_sf_shutdown_pending_prm_abort;
153sctp_state_fn_t sctp_sf_shutdown_sent_prm_abort;
154sctp_state_fn_t sctp_sf_shutdown_ack_sent_prm_abort;
155sctp_state_fn_t sctp_sf_error_closed;
156sctp_state_fn_t sctp_sf_error_shutdown;
157sctp_state_fn_t sctp_sf_ignore_primitive;
158sctp_state_fn_t sctp_sf_do_prm_requestheartbeat;
159sctp_state_fn_t sctp_sf_do_prm_asconf;
160
161
162sctp_state_fn_t sctp_sf_do_no_pending_tsn;
163sctp_state_fn_t sctp_sf_do_9_2_start_shutdown;
164sctp_state_fn_t sctp_sf_do_9_2_shutdown_ack;
165sctp_state_fn_t sctp_sf_ignore_other;
166sctp_state_fn_t sctp_sf_cookie_wait_icmp_abort;
167
168
169sctp_state_fn_t sctp_sf_do_6_3_3_rtx;
170sctp_state_fn_t sctp_sf_do_6_2_sack;
171sctp_state_fn_t sctp_sf_autoclose_timer_expire;
172
173
174__u8 sctp_get_chunk_type(struct sctp_chunk *chunk);
175const sctp_sm_table_entry_t *sctp_sm_lookup_event(struct net *,
176 sctp_event_t,
177 sctp_state_t,
178 sctp_subtype_t);
179int sctp_chunk_iif(const struct sctp_chunk *);
180struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *,
181 struct sctp_chunk *,
182 gfp_t gfp);
183__u32 sctp_generate_verification_tag(void);
184void sctp_populate_tie_tags(__u8 *cookie, __u32 curTag, __u32 hisTag);
185
186
187struct sctp_chunk *sctp_make_init(const struct sctp_association *,
188 const struct sctp_bind_addr *,
189 gfp_t gfp, int vparam_len);
190struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *,
191 const struct sctp_chunk *,
192 const gfp_t gfp,
193 const int unkparam_len);
194struct sctp_chunk *sctp_make_cookie_echo(const struct sctp_association *,
195 const struct sctp_chunk *);
196struct sctp_chunk *sctp_make_cookie_ack(const struct sctp_association *,
197 const struct sctp_chunk *);
198struct sctp_chunk *sctp_make_cwr(const struct sctp_association *,
199 const __u32 lowest_tsn,
200 const struct sctp_chunk *);
201struct sctp_chunk * sctp_make_datafrag_empty(struct sctp_association *,
202 const struct sctp_sndrcvinfo *sinfo,
203 int len, const __u8 flags,
204 __u16 ssn);
205struct sctp_chunk *sctp_make_ecne(const struct sctp_association *,
206 const __u32);
207struct sctp_chunk *sctp_make_sack(const struct sctp_association *);
208struct sctp_chunk *sctp_make_shutdown(const struct sctp_association *asoc,
209 const struct sctp_chunk *chunk);
210struct sctp_chunk *sctp_make_shutdown_ack(const struct sctp_association *asoc,
211 const struct sctp_chunk *);
212struct sctp_chunk *sctp_make_shutdown_complete(const struct sctp_association *,
213 const struct sctp_chunk *);
214void sctp_init_cause(struct sctp_chunk *, __be16 cause, size_t);
215struct sctp_chunk *sctp_make_abort(const struct sctp_association *,
216 const struct sctp_chunk *,
217 const size_t hint);
218struct sctp_chunk *sctp_make_abort_no_data(const struct sctp_association *,
219 const struct sctp_chunk *,
220 __u32 tsn);
221struct sctp_chunk *sctp_make_abort_user(const struct sctp_association *,
222 const struct msghdr *, size_t msg_len);
223struct sctp_chunk *sctp_make_abort_violation(const struct sctp_association *,
224 const struct sctp_chunk *,
225 const __u8 *,
226 const size_t );
227struct sctp_chunk *sctp_make_violation_paramlen(const struct sctp_association *,
228 const struct sctp_chunk *,
229 struct sctp_paramhdr *);
230struct sctp_chunk *sctp_make_violation_max_retrans(const struct sctp_association *,
231 const struct sctp_chunk *);
232struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *,
233 const struct sctp_transport *);
234struct sctp_chunk *sctp_make_heartbeat_ack(const struct sctp_association *,
235 const struct sctp_chunk *,
236 const void *payload,
237 const size_t paylen);
238struct sctp_chunk *sctp_make_op_error(const struct sctp_association *,
239 const struct sctp_chunk *chunk,
240 __be16 cause_code,
241 const void *payload,
242 size_t paylen,
243 size_t reserve_tail);
244
245struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *,
246 union sctp_addr *,
247 struct sockaddr *,
248 int, __be16);
249struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc,
250 union sctp_addr *addr);
251bool sctp_verify_asconf(const struct sctp_association *asoc,
252 struct sctp_chunk *chunk, bool addr_param_needed,
253 struct sctp_paramhdr **errp);
254struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
255 struct sctp_chunk *asconf);
256int sctp_process_asconf_ack(struct sctp_association *asoc,
257 struct sctp_chunk *asconf_ack);
258struct sctp_chunk *sctp_make_fwdtsn(const struct sctp_association *asoc,
259 __u32 new_cum_tsn, size_t nstreams,
260 struct sctp_fwdtsn_skip *skiplist);
261struct sctp_chunk *sctp_make_auth(const struct sctp_association *asoc);
262
263void sctp_chunk_assign_tsn(struct sctp_chunk *);
264void sctp_chunk_assign_ssn(struct sctp_chunk *);
265
266
267
268int sctp_do_sm(struct net *net, sctp_event_t event_type, sctp_subtype_t subtype,
269 sctp_state_t state,
270 struct sctp_endpoint *,
271 struct sctp_association *asoc,
272 void *event_arg,
273 gfp_t gfp);
274
275
276void sctp_generate_t3_rtx_event(unsigned long peer);
277void sctp_generate_heartbeat_event(unsigned long peer);
278void sctp_generate_proto_unreach_event(unsigned long peer);
279
280void sctp_ootb_pkt_free(struct sctp_packet *);
281
282struct sctp_association *sctp_unpack_cookie(const struct sctp_endpoint *,
283 const struct sctp_association *,
284 struct sctp_chunk *,
285 gfp_t gfp, int *err,
286 struct sctp_chunk **err_chk_p);
287int sctp_addip_addr_config(struct sctp_association *, sctp_param_t,
288 struct sockaddr_storage*, int);
289
290
291__u32 sctp_generate_tag(const struct sctp_endpoint *);
292__u32 sctp_generate_tsn(const struct sctp_endpoint *);
293
294
295extern sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES];
296
297
298
299static inline __u16 sctp_data_size(struct sctp_chunk *chunk)
300{
301 __u16 size;
302
303 size = ntohs(chunk->chunk_hdr->length);
304 size -= sizeof(sctp_data_chunk_t);
305
306 return size;
307}
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338enum {
339 TSN_SIGN_BIT = (1<<31)
340};
341
342static inline int TSN_lt(__u32 s, __u32 t)
343{
344 return ((s) - (t)) & TSN_SIGN_BIT;
345}
346
347static inline int TSN_lte(__u32 s, __u32 t)
348{
349 return ((s) == (t)) || (((s) - (t)) & TSN_SIGN_BIT);
350}
351
352
353
354
355
356
357
358
359
360
361
362enum {
363 SSN_SIGN_BIT = (1<<15)
364};
365
366static inline int SSN_lt(__u16 s, __u16 t)
367{
368 return ((s) - (t)) & SSN_SIGN_BIT;
369}
370
371static inline int SSN_lte(__u16 s, __u16 t)
372{
373 return ((s) == (t)) || (((s) - (t)) & SSN_SIGN_BIT);
374}
375
376
377
378
379
380
381enum {
382 ADDIP_SERIAL_SIGN_BIT = (1<<31)
383};
384
385static inline int ADDIP_SERIAL_gte(__u16 s, __u16 t)
386{
387 return ((s) == (t)) || (((t) - (s)) & ADDIP_SERIAL_SIGN_BIT);
388}
389
390
391static inline int
392sctp_vtag_verify(const struct sctp_chunk *chunk,
393 const struct sctp_association *asoc)
394{
395
396
397
398
399
400
401 if (ntohl(chunk->sctp_hdr->vtag) == asoc->c.my_vtag)
402 return 1;
403
404 return 0;
405}
406
407
408
409
410static inline int
411sctp_vtag_verify_either(const struct sctp_chunk *chunk,
412 const struct sctp_association *asoc)
413{
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435 if ((!sctp_test_T_bit(chunk) &&
436 (ntohl(chunk->sctp_hdr->vtag) == asoc->c.my_vtag)) ||
437 (sctp_test_T_bit(chunk) && asoc->c.peer_vtag &&
438 (ntohl(chunk->sctp_hdr->vtag) == asoc->c.peer_vtag))) {
439 return 1;
440 }
441
442 return 0;
443}
444
445#endif
446