Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/sctp/sm_make_chunk.c
15109 views
1
/* SCTP kernel implementation
2
* (C) Copyright IBM Corp. 2001, 2004
3
* Copyright (c) 1999-2000 Cisco, Inc.
4
* Copyright (c) 1999-2001 Motorola, Inc.
5
* Copyright (c) 2001-2002 Intel Corp.
6
*
7
* This file is part of the SCTP kernel implementation
8
*
9
* These functions work with the state functions in sctp_sm_statefuns.c
10
* to implement the state operations. These functions implement the
11
* steps which require modifying existing data structures.
12
*
13
* This SCTP implementation is free software;
14
* you can redistribute it and/or modify it under the terms of
15
* the GNU General Public License as published by
16
* the Free Software Foundation; either version 2, or (at your option)
17
* any later version.
18
*
19
* This SCTP implementation is distributed in the hope that it
20
* will be useful, but WITHOUT ANY WARRANTY; without even the implied
21
* ************************
22
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
23
* See the GNU General Public License for more details.
24
*
25
* You should have received a copy of the GNU General Public License
26
* along with GNU CC; see the file COPYING. If not, write to
27
* the Free Software Foundation, 59 Temple Place - Suite 330,
28
* Boston, MA 02111-1307, USA.
29
*
30
* Please send any bug reports or fixes you make to the
31
* email address(es):
32
* lksctp developers <[email protected]>
33
*
34
* Or submit a bug report through the following website:
35
* http://www.sf.net/projects/lksctp
36
*
37
* Written or modified by:
38
* La Monte H.P. Yarroll <[email protected]>
39
* Karl Knutson <[email protected]>
40
* C. Robin <[email protected]>
41
* Jon Grimm <[email protected]>
42
* Xingang Guo <[email protected]>
43
* Dajiang Zhang <[email protected]>
44
* Sridhar Samudrala <[email protected]>
45
* Daisy Chang <[email protected]>
46
* Ardelle Fan <[email protected]>
47
* Kevin Gao <[email protected]>
48
*
49
* Any bugs reported given to us we will try to fix... any fixes shared will
50
* be incorporated into the next SCTP release.
51
*/
52
53
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
54
55
#include <linux/types.h>
56
#include <linux/kernel.h>
57
#include <linux/ip.h>
58
#include <linux/ipv6.h>
59
#include <linux/net.h>
60
#include <linux/inet.h>
61
#include <linux/scatterlist.h>
62
#include <linux/crypto.h>
63
#include <linux/slab.h>
64
#include <net/sock.h>
65
66
#include <linux/skbuff.h>
67
#include <linux/random.h> /* for get_random_bytes */
68
#include <net/sctp/sctp.h>
69
#include <net/sctp/sm.h>
70
71
SCTP_STATIC
72
struct sctp_chunk *sctp_make_chunk(const struct sctp_association *asoc,
73
__u8 type, __u8 flags, int paylen);
74
static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
75
const struct sctp_association *asoc,
76
const struct sctp_chunk *init_chunk,
77
int *cookie_len,
78
const __u8 *raw_addrs, int addrs_len);
79
static int sctp_process_param(struct sctp_association *asoc,
80
union sctp_params param,
81
const union sctp_addr *peer_addr,
82
gfp_t gfp);
83
static void *sctp_addto_param(struct sctp_chunk *chunk, int len,
84
const void *data);
85
86
/* What was the inbound interface for this chunk? */
87
int sctp_chunk_iif(const struct sctp_chunk *chunk)
88
{
89
struct sctp_af *af;
90
int iif = 0;
91
92
af = sctp_get_af_specific(ipver2af(ip_hdr(chunk->skb)->version));
93
if (af)
94
iif = af->skb_iif(chunk->skb);
95
96
return iif;
97
}
98
99
/* RFC 2960 3.3.2 Initiation (INIT) (1)
100
*
101
* Note 2: The ECN capable field is reserved for future use of
102
* Explicit Congestion Notification.
103
*/
104
static const struct sctp_paramhdr ecap_param = {
105
SCTP_PARAM_ECN_CAPABLE,
106
cpu_to_be16(sizeof(struct sctp_paramhdr)),
107
};
108
static const struct sctp_paramhdr prsctp_param = {
109
SCTP_PARAM_FWD_TSN_SUPPORT,
110
cpu_to_be16(sizeof(struct sctp_paramhdr)),
111
};
112
113
/* A helper to initialize an op error inside a
114
* provided chunk, as most cause codes will be embedded inside an
115
* abort chunk.
116
*/
117
void sctp_init_cause(struct sctp_chunk *chunk, __be16 cause_code,
118
size_t paylen)
119
{
120
sctp_errhdr_t err;
121
__u16 len;
122
123
/* Cause code constants are now defined in network order. */
124
err.cause = cause_code;
125
len = sizeof(sctp_errhdr_t) + paylen;
126
err.length = htons(len);
127
chunk->subh.err_hdr = sctp_addto_chunk(chunk, sizeof(sctp_errhdr_t), &err);
128
}
129
130
/* A helper to initialize an op error inside a
131
* provided chunk, as most cause codes will be embedded inside an
132
* abort chunk. Differs from sctp_init_cause in that it won't oops
133
* if there isn't enough space in the op error chunk
134
*/
135
int sctp_init_cause_fixed(struct sctp_chunk *chunk, __be16 cause_code,
136
size_t paylen)
137
{
138
sctp_errhdr_t err;
139
__u16 len;
140
141
/* Cause code constants are now defined in network order. */
142
err.cause = cause_code;
143
len = sizeof(sctp_errhdr_t) + paylen;
144
err.length = htons(len);
145
146
if (skb_tailroom(chunk->skb) < len)
147
return -ENOSPC;
148
chunk->subh.err_hdr = sctp_addto_chunk_fixed(chunk,
149
sizeof(sctp_errhdr_t),
150
&err);
151
return 0;
152
}
153
/* 3.3.2 Initiation (INIT) (1)
154
*
155
* This chunk is used to initiate a SCTP association between two
156
* endpoints. The format of the INIT chunk is shown below:
157
*
158
* 0 1 2 3
159
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
160
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
161
* | Type = 1 | Chunk Flags | Chunk Length |
162
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
163
* | Initiate Tag |
164
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
165
* | Advertised Receiver Window Credit (a_rwnd) |
166
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
167
* | Number of Outbound Streams | Number of Inbound Streams |
168
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
169
* | Initial TSN |
170
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
171
* \ \
172
* / Optional/Variable-Length Parameters /
173
* \ \
174
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
175
*
176
*
177
* The INIT chunk contains the following parameters. Unless otherwise
178
* noted, each parameter MUST only be included once in the INIT chunk.
179
*
180
* Fixed Parameters Status
181
* ----------------------------------------------
182
* Initiate Tag Mandatory
183
* Advertised Receiver Window Credit Mandatory
184
* Number of Outbound Streams Mandatory
185
* Number of Inbound Streams Mandatory
186
* Initial TSN Mandatory
187
*
188
* Variable Parameters Status Type Value
189
* -------------------------------------------------------------
190
* IPv4 Address (Note 1) Optional 5
191
* IPv6 Address (Note 1) Optional 6
192
* Cookie Preservative Optional 9
193
* Reserved for ECN Capable (Note 2) Optional 32768 (0x8000)
194
* Host Name Address (Note 3) Optional 11
195
* Supported Address Types (Note 4) Optional 12
196
*/
197
struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
198
const struct sctp_bind_addr *bp,
199
gfp_t gfp, int vparam_len)
200
{
201
sctp_inithdr_t init;
202
union sctp_params addrs;
203
size_t chunksize;
204
struct sctp_chunk *retval = NULL;
205
int num_types, addrs_len = 0;
206
struct sctp_sock *sp;
207
sctp_supported_addrs_param_t sat;
208
__be16 types[2];
209
sctp_adaptation_ind_param_t aiparam;
210
sctp_supported_ext_param_t ext_param;
211
int num_ext = 0;
212
__u8 extensions[3];
213
sctp_paramhdr_t *auth_chunks = NULL,
214
*auth_hmacs = NULL;
215
216
/* RFC 2960 3.3.2 Initiation (INIT) (1)
217
*
218
* Note 1: The INIT chunks can contain multiple addresses that
219
* can be IPv4 and/or IPv6 in any combination.
220
*/
221
retval = NULL;
222
223
/* Convert the provided bind address list to raw format. */
224
addrs = sctp_bind_addrs_to_raw(bp, &addrs_len, gfp);
225
226
init.init_tag = htonl(asoc->c.my_vtag);
227
init.a_rwnd = htonl(asoc->rwnd);
228
init.num_outbound_streams = htons(asoc->c.sinit_num_ostreams);
229
init.num_inbound_streams = htons(asoc->c.sinit_max_instreams);
230
init.initial_tsn = htonl(asoc->c.initial_tsn);
231
232
/* How many address types are needed? */
233
sp = sctp_sk(asoc->base.sk);
234
num_types = sp->pf->supported_addrs(sp, types);
235
236
chunksize = sizeof(init) + addrs_len;
237
chunksize += WORD_ROUND(SCTP_SAT_LEN(num_types));
238
chunksize += sizeof(ecap_param);
239
240
if (sctp_prsctp_enable)
241
chunksize += sizeof(prsctp_param);
242
243
/* ADDIP: Section 4.2.7:
244
* An implementation supporting this extension [ADDIP] MUST list
245
* the ASCONF,the ASCONF-ACK, and the AUTH chunks in its INIT and
246
* INIT-ACK parameters.
247
*/
248
if (sctp_addip_enable) {
249
extensions[num_ext] = SCTP_CID_ASCONF;
250
extensions[num_ext+1] = SCTP_CID_ASCONF_ACK;
251
num_ext += 2;
252
}
253
254
if (sp->adaptation_ind)
255
chunksize += sizeof(aiparam);
256
257
chunksize += vparam_len;
258
259
/* Account for AUTH related parameters */
260
if (sctp_auth_enable) {
261
/* Add random parameter length*/
262
chunksize += sizeof(asoc->c.auth_random);
263
264
/* Add HMACS parameter length if any were defined */
265
auth_hmacs = (sctp_paramhdr_t *)asoc->c.auth_hmacs;
266
if (auth_hmacs->length)
267
chunksize += WORD_ROUND(ntohs(auth_hmacs->length));
268
else
269
auth_hmacs = NULL;
270
271
/* Add CHUNKS parameter length */
272
auth_chunks = (sctp_paramhdr_t *)asoc->c.auth_chunks;
273
if (auth_chunks->length)
274
chunksize += WORD_ROUND(ntohs(auth_chunks->length));
275
else
276
auth_chunks = NULL;
277
278
extensions[num_ext] = SCTP_CID_AUTH;
279
num_ext += 1;
280
}
281
282
/* If we have any extensions to report, account for that */
283
if (num_ext)
284
chunksize += WORD_ROUND(sizeof(sctp_supported_ext_param_t) +
285
num_ext);
286
287
/* RFC 2960 3.3.2 Initiation (INIT) (1)
288
*
289
* Note 3: An INIT chunk MUST NOT contain more than one Host
290
* Name address parameter. Moreover, the sender of the INIT
291
* MUST NOT combine any other address types with the Host Name
292
* address in the INIT. The receiver of INIT MUST ignore any
293
* other address types if the Host Name address parameter is
294
* present in the received INIT chunk.
295
*
296
* PLEASE DO NOT FIXME [This version does not support Host Name.]
297
*/
298
299
retval = sctp_make_chunk(asoc, SCTP_CID_INIT, 0, chunksize);
300
if (!retval)
301
goto nodata;
302
303
retval->subh.init_hdr =
304
sctp_addto_chunk(retval, sizeof(init), &init);
305
retval->param_hdr.v =
306
sctp_addto_chunk(retval, addrs_len, addrs.v);
307
308
/* RFC 2960 3.3.2 Initiation (INIT) (1)
309
*
310
* Note 4: This parameter, when present, specifies all the
311
* address types the sending endpoint can support. The absence
312
* of this parameter indicates that the sending endpoint can
313
* support any address type.
314
*/
315
sat.param_hdr.type = SCTP_PARAM_SUPPORTED_ADDRESS_TYPES;
316
sat.param_hdr.length = htons(SCTP_SAT_LEN(num_types));
317
sctp_addto_chunk(retval, sizeof(sat), &sat);
318
sctp_addto_chunk(retval, num_types * sizeof(__u16), &types);
319
320
sctp_addto_chunk(retval, sizeof(ecap_param), &ecap_param);
321
322
/* Add the supported extensions parameter. Be nice and add this
323
* fist before addiding the parameters for the extensions themselves
324
*/
325
if (num_ext) {
326
ext_param.param_hdr.type = SCTP_PARAM_SUPPORTED_EXT;
327
ext_param.param_hdr.length =
328
htons(sizeof(sctp_supported_ext_param_t) + num_ext);
329
sctp_addto_chunk(retval, sizeof(sctp_supported_ext_param_t),
330
&ext_param);
331
sctp_addto_param(retval, num_ext, extensions);
332
}
333
334
if (sctp_prsctp_enable)
335
sctp_addto_chunk(retval, sizeof(prsctp_param), &prsctp_param);
336
337
if (sp->adaptation_ind) {
338
aiparam.param_hdr.type = SCTP_PARAM_ADAPTATION_LAYER_IND;
339
aiparam.param_hdr.length = htons(sizeof(aiparam));
340
aiparam.adaptation_ind = htonl(sp->adaptation_ind);
341
sctp_addto_chunk(retval, sizeof(aiparam), &aiparam);
342
}
343
344
/* Add SCTP-AUTH chunks to the parameter list */
345
if (sctp_auth_enable) {
346
sctp_addto_chunk(retval, sizeof(asoc->c.auth_random),
347
asoc->c.auth_random);
348
if (auth_hmacs)
349
sctp_addto_chunk(retval, ntohs(auth_hmacs->length),
350
auth_hmacs);
351
if (auth_chunks)
352
sctp_addto_chunk(retval, ntohs(auth_chunks->length),
353
auth_chunks);
354
}
355
nodata:
356
kfree(addrs.v);
357
return retval;
358
}
359
360
struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
361
const struct sctp_chunk *chunk,
362
gfp_t gfp, int unkparam_len)
363
{
364
sctp_inithdr_t initack;
365
struct sctp_chunk *retval;
366
union sctp_params addrs;
367
struct sctp_sock *sp;
368
int addrs_len;
369
sctp_cookie_param_t *cookie;
370
int cookie_len;
371
size_t chunksize;
372
sctp_adaptation_ind_param_t aiparam;
373
sctp_supported_ext_param_t ext_param;
374
int num_ext = 0;
375
__u8 extensions[3];
376
sctp_paramhdr_t *auth_chunks = NULL,
377
*auth_hmacs = NULL,
378
*auth_random = NULL;
379
380
retval = NULL;
381
382
/* Note: there may be no addresses to embed. */
383
addrs = sctp_bind_addrs_to_raw(&asoc->base.bind_addr, &addrs_len, gfp);
384
385
initack.init_tag = htonl(asoc->c.my_vtag);
386
initack.a_rwnd = htonl(asoc->rwnd);
387
initack.num_outbound_streams = htons(asoc->c.sinit_num_ostreams);
388
initack.num_inbound_streams = htons(asoc->c.sinit_max_instreams);
389
initack.initial_tsn = htonl(asoc->c.initial_tsn);
390
391
/* FIXME: We really ought to build the cookie right
392
* into the packet instead of allocating more fresh memory.
393
*/
394
cookie = sctp_pack_cookie(asoc->ep, asoc, chunk, &cookie_len,
395
addrs.v, addrs_len);
396
if (!cookie)
397
goto nomem_cookie;
398
399
/* Calculate the total size of allocation, include the reserved
400
* space for reporting unknown parameters if it is specified.
401
*/
402
sp = sctp_sk(asoc->base.sk);
403
chunksize = sizeof(initack) + addrs_len + cookie_len + unkparam_len;
404
405
/* Tell peer that we'll do ECN only if peer advertised such cap. */
406
if (asoc->peer.ecn_capable)
407
chunksize += sizeof(ecap_param);
408
409
if (asoc->peer.prsctp_capable)
410
chunksize += sizeof(prsctp_param);
411
412
if (asoc->peer.asconf_capable) {
413
extensions[num_ext] = SCTP_CID_ASCONF;
414
extensions[num_ext+1] = SCTP_CID_ASCONF_ACK;
415
num_ext += 2;
416
}
417
418
if (sp->adaptation_ind)
419
chunksize += sizeof(aiparam);
420
421
if (asoc->peer.auth_capable) {
422
auth_random = (sctp_paramhdr_t *)asoc->c.auth_random;
423
chunksize += ntohs(auth_random->length);
424
425
auth_hmacs = (sctp_paramhdr_t *)asoc->c.auth_hmacs;
426
if (auth_hmacs->length)
427
chunksize += WORD_ROUND(ntohs(auth_hmacs->length));
428
else
429
auth_hmacs = NULL;
430
431
auth_chunks = (sctp_paramhdr_t *)asoc->c.auth_chunks;
432
if (auth_chunks->length)
433
chunksize += WORD_ROUND(ntohs(auth_chunks->length));
434
else
435
auth_chunks = NULL;
436
437
extensions[num_ext] = SCTP_CID_AUTH;
438
num_ext += 1;
439
}
440
441
if (num_ext)
442
chunksize += WORD_ROUND(sizeof(sctp_supported_ext_param_t) +
443
num_ext);
444
445
/* Now allocate and fill out the chunk. */
446
retval = sctp_make_chunk(asoc, SCTP_CID_INIT_ACK, 0, chunksize);
447
if (!retval)
448
goto nomem_chunk;
449
450
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
451
*
452
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
453
* HEARTBEAT ACK, * etc.) to the same destination transport
454
* address from which it received the DATA or control chunk
455
* to which it is replying.
456
*
457
* [INIT ACK back to where the INIT came from.]
458
*/
459
retval->transport = chunk->transport;
460
461
retval->subh.init_hdr =
462
sctp_addto_chunk(retval, sizeof(initack), &initack);
463
retval->param_hdr.v = sctp_addto_chunk(retval, addrs_len, addrs.v);
464
sctp_addto_chunk(retval, cookie_len, cookie);
465
if (asoc->peer.ecn_capable)
466
sctp_addto_chunk(retval, sizeof(ecap_param), &ecap_param);
467
if (num_ext) {
468
ext_param.param_hdr.type = SCTP_PARAM_SUPPORTED_EXT;
469
ext_param.param_hdr.length =
470
htons(sizeof(sctp_supported_ext_param_t) + num_ext);
471
sctp_addto_chunk(retval, sizeof(sctp_supported_ext_param_t),
472
&ext_param);
473
sctp_addto_param(retval, num_ext, extensions);
474
}
475
if (asoc->peer.prsctp_capable)
476
sctp_addto_chunk(retval, sizeof(prsctp_param), &prsctp_param);
477
478
if (sp->adaptation_ind) {
479
aiparam.param_hdr.type = SCTP_PARAM_ADAPTATION_LAYER_IND;
480
aiparam.param_hdr.length = htons(sizeof(aiparam));
481
aiparam.adaptation_ind = htonl(sp->adaptation_ind);
482
sctp_addto_chunk(retval, sizeof(aiparam), &aiparam);
483
}
484
485
if (asoc->peer.auth_capable) {
486
sctp_addto_chunk(retval, ntohs(auth_random->length),
487
auth_random);
488
if (auth_hmacs)
489
sctp_addto_chunk(retval, ntohs(auth_hmacs->length),
490
auth_hmacs);
491
if (auth_chunks)
492
sctp_addto_chunk(retval, ntohs(auth_chunks->length),
493
auth_chunks);
494
}
495
496
/* We need to remove the const qualifier at this point. */
497
retval->asoc = (struct sctp_association *) asoc;
498
499
nomem_chunk:
500
kfree(cookie);
501
nomem_cookie:
502
kfree(addrs.v);
503
return retval;
504
}
505
506
/* 3.3.11 Cookie Echo (COOKIE ECHO) (10):
507
*
508
* This chunk is used only during the initialization of an association.
509
* It is sent by the initiator of an association to its peer to complete
510
* the initialization process. This chunk MUST precede any DATA chunk
511
* sent within the association, but MAY be bundled with one or more DATA
512
* chunks in the same packet.
513
*
514
* 0 1 2 3
515
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
516
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
517
* | Type = 10 |Chunk Flags | Length |
518
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
519
* / Cookie /
520
* \ \
521
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
522
*
523
* Chunk Flags: 8 bit
524
*
525
* Set to zero on transmit and ignored on receipt.
526
*
527
* Length: 16 bits (unsigned integer)
528
*
529
* Set to the size of the chunk in bytes, including the 4 bytes of
530
* the chunk header and the size of the Cookie.
531
*
532
* Cookie: variable size
533
*
534
* This field must contain the exact cookie received in the
535
* State Cookie parameter from the previous INIT ACK.
536
*
537
* An implementation SHOULD make the cookie as small as possible
538
* to insure interoperability.
539
*/
540
struct sctp_chunk *sctp_make_cookie_echo(const struct sctp_association *asoc,
541
const struct sctp_chunk *chunk)
542
{
543
struct sctp_chunk *retval;
544
void *cookie;
545
int cookie_len;
546
547
cookie = asoc->peer.cookie;
548
cookie_len = asoc->peer.cookie_len;
549
550
/* Build a cookie echo chunk. */
551
retval = sctp_make_chunk(asoc, SCTP_CID_COOKIE_ECHO, 0, cookie_len);
552
if (!retval)
553
goto nodata;
554
retval->subh.cookie_hdr =
555
sctp_addto_chunk(retval, cookie_len, cookie);
556
557
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
558
*
559
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
560
* HEARTBEAT ACK, * etc.) to the same destination transport
561
* address from which it * received the DATA or control chunk
562
* to which it is replying.
563
*
564
* [COOKIE ECHO back to where the INIT ACK came from.]
565
*/
566
if (chunk)
567
retval->transport = chunk->transport;
568
569
nodata:
570
return retval;
571
}
572
573
/* 3.3.12 Cookie Acknowledgement (COOKIE ACK) (11):
574
*
575
* This chunk is used only during the initialization of an
576
* association. It is used to acknowledge the receipt of a COOKIE
577
* ECHO chunk. This chunk MUST precede any DATA or SACK chunk sent
578
* within the association, but MAY be bundled with one or more DATA
579
* chunks or SACK chunk in the same SCTP packet.
580
*
581
* 0 1 2 3
582
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
583
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
584
* | Type = 11 |Chunk Flags | Length = 4 |
585
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
586
*
587
* Chunk Flags: 8 bits
588
*
589
* Set to zero on transmit and ignored on receipt.
590
*/
591
struct sctp_chunk *sctp_make_cookie_ack(const struct sctp_association *asoc,
592
const struct sctp_chunk *chunk)
593
{
594
struct sctp_chunk *retval;
595
596
retval = sctp_make_chunk(asoc, SCTP_CID_COOKIE_ACK, 0, 0);
597
598
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
599
*
600
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
601
* HEARTBEAT ACK, * etc.) to the same destination transport
602
* address from which it * received the DATA or control chunk
603
* to which it is replying.
604
*
605
* [COOKIE ACK back to where the COOKIE ECHO came from.]
606
*/
607
if (retval && chunk)
608
retval->transport = chunk->transport;
609
610
return retval;
611
}
612
613
/*
614
* Appendix A: Explicit Congestion Notification:
615
* CWR:
616
*
617
* RFC 2481 details a specific bit for a sender to send in the header of
618
* its next outbound TCP segment to indicate to its peer that it has
619
* reduced its congestion window. This is termed the CWR bit. For
620
* SCTP the same indication is made by including the CWR chunk.
621
* This chunk contains one data element, i.e. the TSN number that
622
* was sent in the ECNE chunk. This element represents the lowest
623
* TSN number in the datagram that was originally marked with the
624
* CE bit.
625
*
626
* 0 1 2 3
627
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
628
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
629
* | Chunk Type=13 | Flags=00000000| Chunk Length = 8 |
630
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
631
* | Lowest TSN Number |
632
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
633
*
634
* Note: The CWR is considered a Control chunk.
635
*/
636
struct sctp_chunk *sctp_make_cwr(const struct sctp_association *asoc,
637
const __u32 lowest_tsn,
638
const struct sctp_chunk *chunk)
639
{
640
struct sctp_chunk *retval;
641
sctp_cwrhdr_t cwr;
642
643
cwr.lowest_tsn = htonl(lowest_tsn);
644
retval = sctp_make_chunk(asoc, SCTP_CID_ECN_CWR, 0,
645
sizeof(sctp_cwrhdr_t));
646
647
if (!retval)
648
goto nodata;
649
650
retval->subh.ecn_cwr_hdr =
651
sctp_addto_chunk(retval, sizeof(cwr), &cwr);
652
653
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
654
*
655
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
656
* HEARTBEAT ACK, * etc.) to the same destination transport
657
* address from which it * received the DATA or control chunk
658
* to which it is replying.
659
*
660
* [Report a reduced congestion window back to where the ECNE
661
* came from.]
662
*/
663
if (chunk)
664
retval->transport = chunk->transport;
665
666
nodata:
667
return retval;
668
}
669
670
/* Make an ECNE chunk. This is a congestion experienced report. */
671
struct sctp_chunk *sctp_make_ecne(const struct sctp_association *asoc,
672
const __u32 lowest_tsn)
673
{
674
struct sctp_chunk *retval;
675
sctp_ecnehdr_t ecne;
676
677
ecne.lowest_tsn = htonl(lowest_tsn);
678
retval = sctp_make_chunk(asoc, SCTP_CID_ECN_ECNE, 0,
679
sizeof(sctp_ecnehdr_t));
680
if (!retval)
681
goto nodata;
682
retval->subh.ecne_hdr =
683
sctp_addto_chunk(retval, sizeof(ecne), &ecne);
684
685
nodata:
686
return retval;
687
}
688
689
/* Make a DATA chunk for the given association from the provided
690
* parameters. However, do not populate the data payload.
691
*/
692
struct sctp_chunk *sctp_make_datafrag_empty(struct sctp_association *asoc,
693
const struct sctp_sndrcvinfo *sinfo,
694
int data_len, __u8 flags, __u16 ssn)
695
{
696
struct sctp_chunk *retval;
697
struct sctp_datahdr dp;
698
int chunk_len;
699
700
/* We assign the TSN as LATE as possible, not here when
701
* creating the chunk.
702
*/
703
dp.tsn = 0;
704
dp.stream = htons(sinfo->sinfo_stream);
705
dp.ppid = sinfo->sinfo_ppid;
706
707
/* Set the flags for an unordered send. */
708
if (sinfo->sinfo_flags & SCTP_UNORDERED) {
709
flags |= SCTP_DATA_UNORDERED;
710
dp.ssn = 0;
711
} else
712
dp.ssn = htons(ssn);
713
714
chunk_len = sizeof(dp) + data_len;
715
retval = sctp_make_chunk(asoc, SCTP_CID_DATA, flags, chunk_len);
716
if (!retval)
717
goto nodata;
718
719
retval->subh.data_hdr = sctp_addto_chunk(retval, sizeof(dp), &dp);
720
memcpy(&retval->sinfo, sinfo, sizeof(struct sctp_sndrcvinfo));
721
722
nodata:
723
return retval;
724
}
725
726
/* Create a selective ackowledgement (SACK) for the given
727
* association. This reports on which TSN's we've seen to date,
728
* including duplicates and gaps.
729
*/
730
struct sctp_chunk *sctp_make_sack(const struct sctp_association *asoc)
731
{
732
struct sctp_chunk *retval;
733
struct sctp_sackhdr sack;
734
int len;
735
__u32 ctsn;
736
__u16 num_gabs, num_dup_tsns;
737
struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map;
738
struct sctp_gap_ack_block gabs[SCTP_MAX_GABS];
739
740
memset(gabs, 0, sizeof(gabs));
741
ctsn = sctp_tsnmap_get_ctsn(map);
742
SCTP_DEBUG_PRINTK("sackCTSNAck sent: 0x%x.\n", ctsn);
743
744
/* How much room is needed in the chunk? */
745
num_gabs = sctp_tsnmap_num_gabs(map, gabs);
746
num_dup_tsns = sctp_tsnmap_num_dups(map);
747
748
/* Initialize the SACK header. */
749
sack.cum_tsn_ack = htonl(ctsn);
750
sack.a_rwnd = htonl(asoc->a_rwnd);
751
sack.num_gap_ack_blocks = htons(num_gabs);
752
sack.num_dup_tsns = htons(num_dup_tsns);
753
754
len = sizeof(sack)
755
+ sizeof(struct sctp_gap_ack_block) * num_gabs
756
+ sizeof(__u32) * num_dup_tsns;
757
758
/* Create the chunk. */
759
retval = sctp_make_chunk(asoc, SCTP_CID_SACK, 0, len);
760
if (!retval)
761
goto nodata;
762
763
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
764
*
765
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
766
* HEARTBEAT ACK, etc.) to the same destination transport
767
* address from which it received the DATA or control chunk to
768
* which it is replying. This rule should also be followed if
769
* the endpoint is bundling DATA chunks together with the
770
* reply chunk.
771
*
772
* However, when acknowledging multiple DATA chunks received
773
* in packets from different source addresses in a single
774
* SACK, the SACK chunk may be transmitted to one of the
775
* destination transport addresses from which the DATA or
776
* control chunks being acknowledged were received.
777
*
778
* [BUG: We do not implement the following paragraph.
779
* Perhaps we should remember the last transport we used for a
780
* SACK and avoid that (if possible) if we have seen any
781
* duplicates. --piggy]
782
*
783
* When a receiver of a duplicate DATA chunk sends a SACK to a
784
* multi- homed endpoint it MAY be beneficial to vary the
785
* destination address and not use the source address of the
786
* DATA chunk. The reason being that receiving a duplicate
787
* from a multi-homed endpoint might indicate that the return
788
* path (as specified in the source address of the DATA chunk)
789
* for the SACK is broken.
790
*
791
* [Send to the address from which we last received a DATA chunk.]
792
*/
793
retval->transport = asoc->peer.last_data_from;
794
795
retval->subh.sack_hdr =
796
sctp_addto_chunk(retval, sizeof(sack), &sack);
797
798
/* Add the gap ack block information. */
799
if (num_gabs)
800
sctp_addto_chunk(retval, sizeof(__u32) * num_gabs,
801
gabs);
802
803
/* Add the duplicate TSN information. */
804
if (num_dup_tsns)
805
sctp_addto_chunk(retval, sizeof(__u32) * num_dup_tsns,
806
sctp_tsnmap_get_dups(map));
807
808
nodata:
809
return retval;
810
}
811
812
/* Make a SHUTDOWN chunk. */
813
struct sctp_chunk *sctp_make_shutdown(const struct sctp_association *asoc,
814
const struct sctp_chunk *chunk)
815
{
816
struct sctp_chunk *retval;
817
sctp_shutdownhdr_t shut;
818
__u32 ctsn;
819
820
ctsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map);
821
shut.cum_tsn_ack = htonl(ctsn);
822
823
retval = sctp_make_chunk(asoc, SCTP_CID_SHUTDOWN, 0,
824
sizeof(sctp_shutdownhdr_t));
825
if (!retval)
826
goto nodata;
827
828
retval->subh.shutdown_hdr =
829
sctp_addto_chunk(retval, sizeof(shut), &shut);
830
831
if (chunk)
832
retval->transport = chunk->transport;
833
nodata:
834
return retval;
835
}
836
837
struct sctp_chunk *sctp_make_shutdown_ack(const struct sctp_association *asoc,
838
const struct sctp_chunk *chunk)
839
{
840
struct sctp_chunk *retval;
841
842
retval = sctp_make_chunk(asoc, SCTP_CID_SHUTDOWN_ACK, 0, 0);
843
844
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
845
*
846
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
847
* HEARTBEAT ACK, * etc.) to the same destination transport
848
* address from which it * received the DATA or control chunk
849
* to which it is replying.
850
*
851
* [ACK back to where the SHUTDOWN came from.]
852
*/
853
if (retval && chunk)
854
retval->transport = chunk->transport;
855
856
return retval;
857
}
858
859
struct sctp_chunk *sctp_make_shutdown_complete(
860
const struct sctp_association *asoc,
861
const struct sctp_chunk *chunk)
862
{
863
struct sctp_chunk *retval;
864
__u8 flags = 0;
865
866
/* Set the T-bit if we have no association (vtag will be
867
* reflected)
868
*/
869
flags |= asoc ? 0 : SCTP_CHUNK_FLAG_T;
870
871
retval = sctp_make_chunk(asoc, SCTP_CID_SHUTDOWN_COMPLETE, flags, 0);
872
873
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
874
*
875
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
876
* HEARTBEAT ACK, * etc.) to the same destination transport
877
* address from which it * received the DATA or control chunk
878
* to which it is replying.
879
*
880
* [Report SHUTDOWN COMPLETE back to where the SHUTDOWN ACK
881
* came from.]
882
*/
883
if (retval && chunk)
884
retval->transport = chunk->transport;
885
886
return retval;
887
}
888
889
/* Create an ABORT. Note that we set the T bit if we have no
890
* association, except when responding to an INIT (sctpimpguide 2.41).
891
*/
892
struct sctp_chunk *sctp_make_abort(const struct sctp_association *asoc,
893
const struct sctp_chunk *chunk,
894
const size_t hint)
895
{
896
struct sctp_chunk *retval;
897
__u8 flags = 0;
898
899
/* Set the T-bit if we have no association and 'chunk' is not
900
* an INIT (vtag will be reflected).
901
*/
902
if (!asoc) {
903
if (chunk && chunk->chunk_hdr &&
904
chunk->chunk_hdr->type == SCTP_CID_INIT)
905
flags = 0;
906
else
907
flags = SCTP_CHUNK_FLAG_T;
908
}
909
910
retval = sctp_make_chunk(asoc, SCTP_CID_ABORT, flags, hint);
911
912
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
913
*
914
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
915
* HEARTBEAT ACK, * etc.) to the same destination transport
916
* address from which it * received the DATA or control chunk
917
* to which it is replying.
918
*
919
* [ABORT back to where the offender came from.]
920
*/
921
if (retval && chunk)
922
retval->transport = chunk->transport;
923
924
return retval;
925
}
926
927
/* Helper to create ABORT with a NO_USER_DATA error. */
928
struct sctp_chunk *sctp_make_abort_no_data(
929
const struct sctp_association *asoc,
930
const struct sctp_chunk *chunk, __u32 tsn)
931
{
932
struct sctp_chunk *retval;
933
__be32 payload;
934
935
retval = sctp_make_abort(asoc, chunk, sizeof(sctp_errhdr_t)
936
+ sizeof(tsn));
937
938
if (!retval)
939
goto no_mem;
940
941
/* Put the tsn back into network byte order. */
942
payload = htonl(tsn);
943
sctp_init_cause(retval, SCTP_ERROR_NO_DATA, sizeof(payload));
944
sctp_addto_chunk(retval, sizeof(payload), (const void *)&payload);
945
946
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
947
*
948
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
949
* HEARTBEAT ACK, * etc.) to the same destination transport
950
* address from which it * received the DATA or control chunk
951
* to which it is replying.
952
*
953
* [ABORT back to where the offender came from.]
954
*/
955
if (chunk)
956
retval->transport = chunk->transport;
957
958
no_mem:
959
return retval;
960
}
961
962
/* Helper to create ABORT with a SCTP_ERROR_USER_ABORT error. */
963
struct sctp_chunk *sctp_make_abort_user(const struct sctp_association *asoc,
964
const struct msghdr *msg,
965
size_t paylen)
966
{
967
struct sctp_chunk *retval;
968
void *payload = NULL;
969
int err;
970
971
retval = sctp_make_abort(asoc, NULL, sizeof(sctp_errhdr_t) + paylen);
972
if (!retval)
973
goto err_chunk;
974
975
if (paylen) {
976
/* Put the msg_iov together into payload. */
977
payload = kmalloc(paylen, GFP_KERNEL);
978
if (!payload)
979
goto err_payload;
980
981
err = memcpy_fromiovec(payload, msg->msg_iov, paylen);
982
if (err < 0)
983
goto err_copy;
984
}
985
986
sctp_init_cause(retval, SCTP_ERROR_USER_ABORT, paylen);
987
sctp_addto_chunk(retval, paylen, payload);
988
989
if (paylen)
990
kfree(payload);
991
992
return retval;
993
994
err_copy:
995
kfree(payload);
996
err_payload:
997
sctp_chunk_free(retval);
998
retval = NULL;
999
err_chunk:
1000
return retval;
1001
}
1002
1003
/* Append bytes to the end of a parameter. Will panic if chunk is not big
1004
* enough.
1005
*/
1006
static void *sctp_addto_param(struct sctp_chunk *chunk, int len,
1007
const void *data)
1008
{
1009
void *target;
1010
int chunklen = ntohs(chunk->chunk_hdr->length);
1011
1012
target = skb_put(chunk->skb, len);
1013
1014
if (data)
1015
memcpy(target, data, len);
1016
else
1017
memset(target, 0, len);
1018
1019
/* Adjust the chunk length field. */
1020
chunk->chunk_hdr->length = htons(chunklen + len);
1021
chunk->chunk_end = skb_tail_pointer(chunk->skb);
1022
1023
return target;
1024
}
1025
1026
/* Make an ABORT chunk with a PROTOCOL VIOLATION cause code. */
1027
struct sctp_chunk *sctp_make_abort_violation(
1028
const struct sctp_association *asoc,
1029
const struct sctp_chunk *chunk,
1030
const __u8 *payload,
1031
const size_t paylen)
1032
{
1033
struct sctp_chunk *retval;
1034
struct sctp_paramhdr phdr;
1035
1036
retval = sctp_make_abort(asoc, chunk, sizeof(sctp_errhdr_t) + paylen
1037
+ sizeof(sctp_paramhdr_t));
1038
if (!retval)
1039
goto end;
1040
1041
sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION, paylen
1042
+ sizeof(sctp_paramhdr_t));
1043
1044
phdr.type = htons(chunk->chunk_hdr->type);
1045
phdr.length = chunk->chunk_hdr->length;
1046
sctp_addto_chunk(retval, paylen, payload);
1047
sctp_addto_param(retval, sizeof(sctp_paramhdr_t), &phdr);
1048
1049
end:
1050
return retval;
1051
}
1052
1053
struct sctp_chunk *sctp_make_violation_paramlen(
1054
const struct sctp_association *asoc,
1055
const struct sctp_chunk *chunk,
1056
struct sctp_paramhdr *param)
1057
{
1058
struct sctp_chunk *retval;
1059
static const char error[] = "The following parameter had invalid length:";
1060
size_t payload_len = sizeof(error) + sizeof(sctp_errhdr_t) +
1061
sizeof(sctp_paramhdr_t);
1062
1063
retval = sctp_make_abort(asoc, chunk, payload_len);
1064
if (!retval)
1065
goto nodata;
1066
1067
sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION,
1068
sizeof(error) + sizeof(sctp_paramhdr_t));
1069
sctp_addto_chunk(retval, sizeof(error), error);
1070
sctp_addto_param(retval, sizeof(sctp_paramhdr_t), param);
1071
1072
nodata:
1073
return retval;
1074
}
1075
1076
/* Make a HEARTBEAT chunk. */
1077
struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc,
1078
const struct sctp_transport *transport)
1079
{
1080
struct sctp_chunk *retval;
1081
sctp_sender_hb_info_t hbinfo;
1082
1083
retval = sctp_make_chunk(asoc, SCTP_CID_HEARTBEAT, 0, sizeof(hbinfo));
1084
1085
if (!retval)
1086
goto nodata;
1087
1088
hbinfo.param_hdr.type = SCTP_PARAM_HEARTBEAT_INFO;
1089
hbinfo.param_hdr.length = htons(sizeof(sctp_sender_hb_info_t));
1090
hbinfo.daddr = transport->ipaddr;
1091
hbinfo.sent_at = jiffies;
1092
hbinfo.hb_nonce = transport->hb_nonce;
1093
1094
/* Cast away the 'const', as this is just telling the chunk
1095
* what transport it belongs to.
1096
*/
1097
retval->transport = (struct sctp_transport *) transport;
1098
retval->subh.hbs_hdr = sctp_addto_chunk(retval, sizeof(hbinfo),
1099
&hbinfo);
1100
1101
nodata:
1102
return retval;
1103
}
1104
1105
struct sctp_chunk *sctp_make_heartbeat_ack(const struct sctp_association *asoc,
1106
const struct sctp_chunk *chunk,
1107
const void *payload, const size_t paylen)
1108
{
1109
struct sctp_chunk *retval;
1110
1111
retval = sctp_make_chunk(asoc, SCTP_CID_HEARTBEAT_ACK, 0, paylen);
1112
if (!retval)
1113
goto nodata;
1114
1115
retval->subh.hbs_hdr = sctp_addto_chunk(retval, paylen, payload);
1116
1117
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
1118
*
1119
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
1120
* HEARTBEAT ACK, * etc.) to the same destination transport
1121
* address from which it * received the DATA or control chunk
1122
* to which it is replying.
1123
*
1124
* [HBACK back to where the HEARTBEAT came from.]
1125
*/
1126
if (chunk)
1127
retval->transport = chunk->transport;
1128
1129
nodata:
1130
return retval;
1131
}
1132
1133
/* Create an Operation Error chunk with the specified space reserved.
1134
* This routine can be used for containing multiple causes in the chunk.
1135
*/
1136
static struct sctp_chunk *sctp_make_op_error_space(
1137
const struct sctp_association *asoc,
1138
const struct sctp_chunk *chunk,
1139
size_t size)
1140
{
1141
struct sctp_chunk *retval;
1142
1143
retval = sctp_make_chunk(asoc, SCTP_CID_ERROR, 0,
1144
sizeof(sctp_errhdr_t) + size);
1145
if (!retval)
1146
goto nodata;
1147
1148
/* RFC 2960 6.4 Multi-homed SCTP Endpoints
1149
*
1150
* An endpoint SHOULD transmit reply chunks (e.g., SACK,
1151
* HEARTBEAT ACK, etc.) to the same destination transport
1152
* address from which it received the DATA or control chunk
1153
* to which it is replying.
1154
*
1155
*/
1156
if (chunk)
1157
retval->transport = chunk->transport;
1158
1159
nodata:
1160
return retval;
1161
}
1162
1163
/* Create an Operation Error chunk of a fixed size,
1164
* specifically, max(asoc->pathmtu, SCTP_DEFAULT_MAXSEGMENT)
1165
* This is a helper function to allocate an error chunk for
1166
* for those invalid parameter codes in which we may not want
1167
* to report all the errors, if the incomming chunk is large
1168
*/
1169
static inline struct sctp_chunk *sctp_make_op_error_fixed(
1170
const struct sctp_association *asoc,
1171
const struct sctp_chunk *chunk)
1172
{
1173
size_t size = asoc ? asoc->pathmtu : 0;
1174
1175
if (!size)
1176
size = SCTP_DEFAULT_MAXSEGMENT;
1177
1178
return sctp_make_op_error_space(asoc, chunk, size);
1179
}
1180
1181
/* Create an Operation Error chunk. */
1182
struct sctp_chunk *sctp_make_op_error(const struct sctp_association *asoc,
1183
const struct sctp_chunk *chunk,
1184
__be16 cause_code, const void *payload,
1185
size_t paylen, size_t reserve_tail)
1186
{
1187
struct sctp_chunk *retval;
1188
1189
retval = sctp_make_op_error_space(asoc, chunk, paylen + reserve_tail);
1190
if (!retval)
1191
goto nodata;
1192
1193
sctp_init_cause(retval, cause_code, paylen + reserve_tail);
1194
sctp_addto_chunk(retval, paylen, payload);
1195
if (reserve_tail)
1196
sctp_addto_param(retval, reserve_tail, NULL);
1197
1198
nodata:
1199
return retval;
1200
}
1201
1202
struct sctp_chunk *sctp_make_auth(const struct sctp_association *asoc)
1203
{
1204
struct sctp_chunk *retval;
1205
struct sctp_hmac *hmac_desc;
1206
struct sctp_authhdr auth_hdr;
1207
__u8 *hmac;
1208
1209
/* Get the first hmac that the peer told us to use */
1210
hmac_desc = sctp_auth_asoc_get_hmac(asoc);
1211
if (unlikely(!hmac_desc))
1212
return NULL;
1213
1214
retval = sctp_make_chunk(asoc, SCTP_CID_AUTH, 0,
1215
hmac_desc->hmac_len + sizeof(sctp_authhdr_t));
1216
if (!retval)
1217
return NULL;
1218
1219
auth_hdr.hmac_id = htons(hmac_desc->hmac_id);
1220
auth_hdr.shkey_id = htons(asoc->active_key_id);
1221
1222
retval->subh.auth_hdr = sctp_addto_chunk(retval, sizeof(sctp_authhdr_t),
1223
&auth_hdr);
1224
1225
hmac = skb_put(retval->skb, hmac_desc->hmac_len);
1226
memset(hmac, 0, hmac_desc->hmac_len);
1227
1228
/* Adjust the chunk header to include the empty MAC */
1229
retval->chunk_hdr->length =
1230
htons(ntohs(retval->chunk_hdr->length) + hmac_desc->hmac_len);
1231
retval->chunk_end = skb_tail_pointer(retval->skb);
1232
1233
return retval;
1234
}
1235
1236
1237
/********************************************************************
1238
* 2nd Level Abstractions
1239
********************************************************************/
1240
1241
/* Turn an skb into a chunk.
1242
* FIXME: Eventually move the structure directly inside the skb->cb[].
1243
*/
1244
struct sctp_chunk *sctp_chunkify(struct sk_buff *skb,
1245
const struct sctp_association *asoc,
1246
struct sock *sk)
1247
{
1248
struct sctp_chunk *retval;
1249
1250
retval = kmem_cache_zalloc(sctp_chunk_cachep, GFP_ATOMIC);
1251
1252
if (!retval)
1253
goto nodata;
1254
1255
if (!sk) {
1256
SCTP_DEBUG_PRINTK("chunkifying skb %p w/o an sk\n", skb);
1257
}
1258
1259
INIT_LIST_HEAD(&retval->list);
1260
retval->skb = skb;
1261
retval->asoc = (struct sctp_association *)asoc;
1262
retval->has_tsn = 0;
1263
retval->has_ssn = 0;
1264
retval->rtt_in_progress = 0;
1265
retval->sent_at = 0;
1266
retval->singleton = 1;
1267
retval->end_of_packet = 0;
1268
retval->ecn_ce_done = 0;
1269
retval->pdiscard = 0;
1270
1271
/* sctpimpguide-05.txt Section 2.8.2
1272
* M1) Each time a new DATA chunk is transmitted
1273
* set the 'TSN.Missing.Report' count for that TSN to 0. The
1274
* 'TSN.Missing.Report' count will be used to determine missing chunks
1275
* and when to fast retransmit.
1276
*/
1277
retval->tsn_missing_report = 0;
1278
retval->tsn_gap_acked = 0;
1279
retval->fast_retransmit = SCTP_CAN_FRTX;
1280
1281
/* If this is a fragmented message, track all fragments
1282
* of the message (for SEND_FAILED).
1283
*/
1284
retval->msg = NULL;
1285
1286
/* Polish the bead hole. */
1287
INIT_LIST_HEAD(&retval->transmitted_list);
1288
INIT_LIST_HEAD(&retval->frag_list);
1289
SCTP_DBG_OBJCNT_INC(chunk);
1290
atomic_set(&retval->refcnt, 1);
1291
1292
nodata:
1293
return retval;
1294
}
1295
1296
/* Set chunk->source and dest based on the IP header in chunk->skb. */
1297
void sctp_init_addrs(struct sctp_chunk *chunk, union sctp_addr *src,
1298
union sctp_addr *dest)
1299
{
1300
memcpy(&chunk->source, src, sizeof(union sctp_addr));
1301
memcpy(&chunk->dest, dest, sizeof(union sctp_addr));
1302
}
1303
1304
/* Extract the source address from a chunk. */
1305
const union sctp_addr *sctp_source(const struct sctp_chunk *chunk)
1306
{
1307
/* If we have a known transport, use that. */
1308
if (chunk->transport) {
1309
return &chunk->transport->ipaddr;
1310
} else {
1311
/* Otherwise, extract it from the IP header. */
1312
return &chunk->source;
1313
}
1314
}
1315
1316
/* Create a new chunk, setting the type and flags headers from the
1317
* arguments, reserving enough space for a 'paylen' byte payload.
1318
*/
1319
SCTP_STATIC
1320
struct sctp_chunk *sctp_make_chunk(const struct sctp_association *asoc,
1321
__u8 type, __u8 flags, int paylen)
1322
{
1323
struct sctp_chunk *retval;
1324
sctp_chunkhdr_t *chunk_hdr;
1325
struct sk_buff *skb;
1326
struct sock *sk;
1327
1328
/* No need to allocate LL here, as this is only a chunk. */
1329
skb = alloc_skb(WORD_ROUND(sizeof(sctp_chunkhdr_t) + paylen),
1330
GFP_ATOMIC);
1331
if (!skb)
1332
goto nodata;
1333
1334
/* Make room for the chunk header. */
1335
chunk_hdr = (sctp_chunkhdr_t *)skb_put(skb, sizeof(sctp_chunkhdr_t));
1336
chunk_hdr->type = type;
1337
chunk_hdr->flags = flags;
1338
chunk_hdr->length = htons(sizeof(sctp_chunkhdr_t));
1339
1340
sk = asoc ? asoc->base.sk : NULL;
1341
retval = sctp_chunkify(skb, asoc, sk);
1342
if (!retval) {
1343
kfree_skb(skb);
1344
goto nodata;
1345
}
1346
1347
retval->chunk_hdr = chunk_hdr;
1348
retval->chunk_end = ((__u8 *)chunk_hdr) + sizeof(struct sctp_chunkhdr);
1349
1350
/* Determine if the chunk needs to be authenticated */
1351
if (sctp_auth_send_cid(type, asoc))
1352
retval->auth = 1;
1353
1354
/* Set the skb to the belonging sock for accounting. */
1355
skb->sk = sk;
1356
1357
return retval;
1358
nodata:
1359
return NULL;
1360
}
1361
1362
1363
/* Release the memory occupied by a chunk. */
1364
static void sctp_chunk_destroy(struct sctp_chunk *chunk)
1365
{
1366
BUG_ON(!list_empty(&chunk->list));
1367
list_del_init(&chunk->transmitted_list);
1368
1369
/* Free the chunk skb data and the SCTP_chunk stub itself. */
1370
dev_kfree_skb(chunk->skb);
1371
1372
SCTP_DBG_OBJCNT_DEC(chunk);
1373
kmem_cache_free(sctp_chunk_cachep, chunk);
1374
}
1375
1376
/* Possibly, free the chunk. */
1377
void sctp_chunk_free(struct sctp_chunk *chunk)
1378
{
1379
/* Release our reference on the message tracker. */
1380
if (chunk->msg)
1381
sctp_datamsg_put(chunk->msg);
1382
1383
sctp_chunk_put(chunk);
1384
}
1385
1386
/* Grab a reference to the chunk. */
1387
void sctp_chunk_hold(struct sctp_chunk *ch)
1388
{
1389
atomic_inc(&ch->refcnt);
1390
}
1391
1392
/* Release a reference to the chunk. */
1393
void sctp_chunk_put(struct sctp_chunk *ch)
1394
{
1395
if (atomic_dec_and_test(&ch->refcnt))
1396
sctp_chunk_destroy(ch);
1397
}
1398
1399
/* Append bytes to the end of a chunk. Will panic if chunk is not big
1400
* enough.
1401
*/
1402
void *sctp_addto_chunk(struct sctp_chunk *chunk, int len, const void *data)
1403
{
1404
void *target;
1405
void *padding;
1406
int chunklen = ntohs(chunk->chunk_hdr->length);
1407
int padlen = WORD_ROUND(chunklen) - chunklen;
1408
1409
padding = skb_put(chunk->skb, padlen);
1410
target = skb_put(chunk->skb, len);
1411
1412
memset(padding, 0, padlen);
1413
memcpy(target, data, len);
1414
1415
/* Adjust the chunk length field. */
1416
chunk->chunk_hdr->length = htons(chunklen + padlen + len);
1417
chunk->chunk_end = skb_tail_pointer(chunk->skb);
1418
1419
return target;
1420
}
1421
1422
/* Append bytes to the end of a chunk. Returns NULL if there isn't sufficient
1423
* space in the chunk
1424
*/
1425
void *sctp_addto_chunk_fixed(struct sctp_chunk *chunk,
1426
int len, const void *data)
1427
{
1428
if (skb_tailroom(chunk->skb) >= len)
1429
return sctp_addto_chunk(chunk, len, data);
1430
else
1431
return NULL;
1432
}
1433
1434
/* Append bytes from user space to the end of a chunk. Will panic if
1435
* chunk is not big enough.
1436
* Returns a kernel err value.
1437
*/
1438
int sctp_user_addto_chunk(struct sctp_chunk *chunk, int off, int len,
1439
struct iovec *data)
1440
{
1441
__u8 *target;
1442
int err = 0;
1443
1444
/* Make room in chunk for data. */
1445
target = skb_put(chunk->skb, len);
1446
1447
/* Copy data (whole iovec) into chunk */
1448
if ((err = memcpy_fromiovecend(target, data, off, len)))
1449
goto out;
1450
1451
/* Adjust the chunk length field. */
1452
chunk->chunk_hdr->length =
1453
htons(ntohs(chunk->chunk_hdr->length) + len);
1454
chunk->chunk_end = skb_tail_pointer(chunk->skb);
1455
1456
out:
1457
return err;
1458
}
1459
1460
/* Helper function to assign a TSN if needed. This assumes that both
1461
* the data_hdr and association have already been assigned.
1462
*/
1463
void sctp_chunk_assign_ssn(struct sctp_chunk *chunk)
1464
{
1465
struct sctp_datamsg *msg;
1466
struct sctp_chunk *lchunk;
1467
struct sctp_stream *stream;
1468
__u16 ssn;
1469
__u16 sid;
1470
1471
if (chunk->has_ssn)
1472
return;
1473
1474
/* All fragments will be on the same stream */
1475
sid = ntohs(chunk->subh.data_hdr->stream);
1476
stream = &chunk->asoc->ssnmap->out;
1477
1478
/* Now assign the sequence number to the entire message.
1479
* All fragments must have the same stream sequence number.
1480
*/
1481
msg = chunk->msg;
1482
list_for_each_entry(lchunk, &msg->chunks, frag_list) {
1483
if (lchunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) {
1484
ssn = 0;
1485
} else {
1486
if (lchunk->chunk_hdr->flags & SCTP_DATA_LAST_FRAG)
1487
ssn = sctp_ssn_next(stream, sid);
1488
else
1489
ssn = sctp_ssn_peek(stream, sid);
1490
}
1491
1492
lchunk->subh.data_hdr->ssn = htons(ssn);
1493
lchunk->has_ssn = 1;
1494
}
1495
}
1496
1497
/* Helper function to assign a TSN if needed. This assumes that both
1498
* the data_hdr and association have already been assigned.
1499
*/
1500
void sctp_chunk_assign_tsn(struct sctp_chunk *chunk)
1501
{
1502
if (!chunk->has_tsn) {
1503
/* This is the last possible instant to
1504
* assign a TSN.
1505
*/
1506
chunk->subh.data_hdr->tsn =
1507
htonl(sctp_association_get_next_tsn(chunk->asoc));
1508
chunk->has_tsn = 1;
1509
}
1510
}
1511
1512
/* Create a CLOSED association to use with an incoming packet. */
1513
struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *ep,
1514
struct sctp_chunk *chunk,
1515
gfp_t gfp)
1516
{
1517
struct sctp_association *asoc;
1518
struct sk_buff *skb;
1519
sctp_scope_t scope;
1520
struct sctp_af *af;
1521
1522
/* Create the bare association. */
1523
scope = sctp_scope(sctp_source(chunk));
1524
asoc = sctp_association_new(ep, ep->base.sk, scope, gfp);
1525
if (!asoc)
1526
goto nodata;
1527
asoc->temp = 1;
1528
skb = chunk->skb;
1529
/* Create an entry for the source address of the packet. */
1530
af = sctp_get_af_specific(ipver2af(ip_hdr(skb)->version));
1531
if (unlikely(!af))
1532
goto fail;
1533
af->from_skb(&asoc->c.peer_addr, skb, 1);
1534
nodata:
1535
return asoc;
1536
1537
fail:
1538
sctp_association_free(asoc);
1539
return NULL;
1540
}
1541
1542
/* Build a cookie representing asoc.
1543
* This INCLUDES the param header needed to put the cookie in the INIT ACK.
1544
*/
1545
static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
1546
const struct sctp_association *asoc,
1547
const struct sctp_chunk *init_chunk,
1548
int *cookie_len,
1549
const __u8 *raw_addrs, int addrs_len)
1550
{
1551
sctp_cookie_param_t *retval;
1552
struct sctp_signed_cookie *cookie;
1553
struct scatterlist sg;
1554
int headersize, bodysize;
1555
unsigned int keylen;
1556
char *key;
1557
1558
/* Header size is static data prior to the actual cookie, including
1559
* any padding.
1560
*/
1561
headersize = sizeof(sctp_paramhdr_t) +
1562
(sizeof(struct sctp_signed_cookie) -
1563
sizeof(struct sctp_cookie));
1564
bodysize = sizeof(struct sctp_cookie)
1565
+ ntohs(init_chunk->chunk_hdr->length) + addrs_len;
1566
1567
/* Pad out the cookie to a multiple to make the signature
1568
* functions simpler to write.
1569
*/
1570
if (bodysize % SCTP_COOKIE_MULTIPLE)
1571
bodysize += SCTP_COOKIE_MULTIPLE
1572
- (bodysize % SCTP_COOKIE_MULTIPLE);
1573
*cookie_len = headersize + bodysize;
1574
1575
/* Clear this memory since we are sending this data structure
1576
* out on the network.
1577
*/
1578
retval = kzalloc(*cookie_len, GFP_ATOMIC);
1579
if (!retval)
1580
goto nodata;
1581
1582
cookie = (struct sctp_signed_cookie *) retval->body;
1583
1584
/* Set up the parameter header. */
1585
retval->p.type = SCTP_PARAM_STATE_COOKIE;
1586
retval->p.length = htons(*cookie_len);
1587
1588
/* Copy the cookie part of the association itself. */
1589
cookie->c = asoc->c;
1590
/* Save the raw address list length in the cookie. */
1591
cookie->c.raw_addr_list_len = addrs_len;
1592
1593
/* Remember PR-SCTP capability. */
1594
cookie->c.prsctp_capable = asoc->peer.prsctp_capable;
1595
1596
/* Save adaptation indication in the cookie. */
1597
cookie->c.adaptation_ind = asoc->peer.adaptation_ind;
1598
1599
/* Set an expiration time for the cookie. */
1600
do_gettimeofday(&cookie->c.expiration);
1601
TIMEVAL_ADD(asoc->cookie_life, cookie->c.expiration);
1602
1603
/* Copy the peer's init packet. */
1604
memcpy(&cookie->c.peer_init[0], init_chunk->chunk_hdr,
1605
ntohs(init_chunk->chunk_hdr->length));
1606
1607
/* Copy the raw local address list of the association. */
1608
memcpy((__u8 *)&cookie->c.peer_init[0] +
1609
ntohs(init_chunk->chunk_hdr->length), raw_addrs, addrs_len);
1610
1611
if (sctp_sk(ep->base.sk)->hmac) {
1612
struct hash_desc desc;
1613
1614
/* Sign the message. */
1615
sg_init_one(&sg, &cookie->c, bodysize);
1616
keylen = SCTP_SECRET_SIZE;
1617
key = (char *)ep->secret_key[ep->current_key];
1618
desc.tfm = sctp_sk(ep->base.sk)->hmac;
1619
desc.flags = 0;
1620
1621
if (crypto_hash_setkey(desc.tfm, key, keylen) ||
1622
crypto_hash_digest(&desc, &sg, bodysize, cookie->signature))
1623
goto free_cookie;
1624
}
1625
1626
return retval;
1627
1628
free_cookie:
1629
kfree(retval);
1630
nodata:
1631
*cookie_len = 0;
1632
return NULL;
1633
}
1634
1635
/* Unpack the cookie from COOKIE ECHO chunk, recreating the association. */
1636
struct sctp_association *sctp_unpack_cookie(
1637
const struct sctp_endpoint *ep,
1638
const struct sctp_association *asoc,
1639
struct sctp_chunk *chunk, gfp_t gfp,
1640
int *error, struct sctp_chunk **errp)
1641
{
1642
struct sctp_association *retval = NULL;
1643
struct sctp_signed_cookie *cookie;
1644
struct sctp_cookie *bear_cookie;
1645
int headersize, bodysize, fixed_size;
1646
__u8 *digest = ep->digest;
1647
struct scatterlist sg;
1648
unsigned int keylen, len;
1649
char *key;
1650
sctp_scope_t scope;
1651
struct sk_buff *skb = chunk->skb;
1652
struct timeval tv;
1653
struct hash_desc desc;
1654
1655
/* Header size is static data prior to the actual cookie, including
1656
* any padding.
1657
*/
1658
headersize = sizeof(sctp_chunkhdr_t) +
1659
(sizeof(struct sctp_signed_cookie) -
1660
sizeof(struct sctp_cookie));
1661
bodysize = ntohs(chunk->chunk_hdr->length) - headersize;
1662
fixed_size = headersize + sizeof(struct sctp_cookie);
1663
1664
/* Verify that the chunk looks like it even has a cookie.
1665
* There must be enough room for our cookie and our peer's
1666
* INIT chunk.
1667
*/
1668
len = ntohs(chunk->chunk_hdr->length);
1669
if (len < fixed_size + sizeof(struct sctp_chunkhdr))
1670
goto malformed;
1671
1672
/* Verify that the cookie has been padded out. */
1673
if (bodysize % SCTP_COOKIE_MULTIPLE)
1674
goto malformed;
1675
1676
/* Process the cookie. */
1677
cookie = chunk->subh.cookie_hdr;
1678
bear_cookie = &cookie->c;
1679
1680
if (!sctp_sk(ep->base.sk)->hmac)
1681
goto no_hmac;
1682
1683
/* Check the signature. */
1684
keylen = SCTP_SECRET_SIZE;
1685
sg_init_one(&sg, bear_cookie, bodysize);
1686
key = (char *)ep->secret_key[ep->current_key];
1687
desc.tfm = sctp_sk(ep->base.sk)->hmac;
1688
desc.flags = 0;
1689
1690
memset(digest, 0x00, SCTP_SIGNATURE_SIZE);
1691
if (crypto_hash_setkey(desc.tfm, key, keylen) ||
1692
crypto_hash_digest(&desc, &sg, bodysize, digest)) {
1693
*error = -SCTP_IERROR_NOMEM;
1694
goto fail;
1695
}
1696
1697
if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) {
1698
/* Try the previous key. */
1699
key = (char *)ep->secret_key[ep->last_key];
1700
memset(digest, 0x00, SCTP_SIGNATURE_SIZE);
1701
if (crypto_hash_setkey(desc.tfm, key, keylen) ||
1702
crypto_hash_digest(&desc, &sg, bodysize, digest)) {
1703
*error = -SCTP_IERROR_NOMEM;
1704
goto fail;
1705
}
1706
1707
if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) {
1708
/* Yikes! Still bad signature! */
1709
*error = -SCTP_IERROR_BAD_SIG;
1710
goto fail;
1711
}
1712
}
1713
1714
no_hmac:
1715
/* IG Section 2.35.2:
1716
* 3) Compare the port numbers and the verification tag contained
1717
* within the COOKIE ECHO chunk to the actual port numbers and the
1718
* verification tag within the SCTP common header of the received
1719
* packet. If these values do not match the packet MUST be silently
1720
* discarded,
1721
*/
1722
if (ntohl(chunk->sctp_hdr->vtag) != bear_cookie->my_vtag) {
1723
*error = -SCTP_IERROR_BAD_TAG;
1724
goto fail;
1725
}
1726
1727
if (chunk->sctp_hdr->source != bear_cookie->peer_addr.v4.sin_port ||
1728
ntohs(chunk->sctp_hdr->dest) != bear_cookie->my_port) {
1729
*error = -SCTP_IERROR_BAD_PORTS;
1730
goto fail;
1731
}
1732
1733
/* Check to see if the cookie is stale. If there is already
1734
* an association, there is no need to check cookie's expiration
1735
* for init collision case of lost COOKIE ACK.
1736
* If skb has been timestamped, then use the stamp, otherwise
1737
* use current time. This introduces a small possibility that
1738
* that a cookie may be considered expired, but his would only slow
1739
* down the new association establishment instead of every packet.
1740
*/
1741
if (sock_flag(ep->base.sk, SOCK_TIMESTAMP))
1742
skb_get_timestamp(skb, &tv);
1743
else
1744
do_gettimeofday(&tv);
1745
1746
if (!asoc && tv_lt(bear_cookie->expiration, tv)) {
1747
/*
1748
* Section 3.3.10.3 Stale Cookie Error (3)
1749
*
1750
* Cause of error
1751
* ---------------
1752
* Stale Cookie Error: Indicates the receipt of a valid State
1753
* Cookie that has expired.
1754
*/
1755
len = ntohs(chunk->chunk_hdr->length);
1756
*errp = sctp_make_op_error_space(asoc, chunk, len);
1757
if (*errp) {
1758
suseconds_t usecs = (tv.tv_sec -
1759
bear_cookie->expiration.tv_sec) * 1000000L +
1760
tv.tv_usec - bear_cookie->expiration.tv_usec;
1761
__be32 n = htonl(usecs);
1762
1763
sctp_init_cause(*errp, SCTP_ERROR_STALE_COOKIE,
1764
sizeof(n));
1765
sctp_addto_chunk(*errp, sizeof(n), &n);
1766
*error = -SCTP_IERROR_STALE_COOKIE;
1767
} else
1768
*error = -SCTP_IERROR_NOMEM;
1769
1770
goto fail;
1771
}
1772
1773
/* Make a new base association. */
1774
scope = sctp_scope(sctp_source(chunk));
1775
retval = sctp_association_new(ep, ep->base.sk, scope, gfp);
1776
if (!retval) {
1777
*error = -SCTP_IERROR_NOMEM;
1778
goto fail;
1779
}
1780
1781
/* Set up our peer's port number. */
1782
retval->peer.port = ntohs(chunk->sctp_hdr->source);
1783
1784
/* Populate the association from the cookie. */
1785
memcpy(&retval->c, bear_cookie, sizeof(*bear_cookie));
1786
1787
if (sctp_assoc_set_bind_addr_from_cookie(retval, bear_cookie,
1788
GFP_ATOMIC) < 0) {
1789
*error = -SCTP_IERROR_NOMEM;
1790
goto fail;
1791
}
1792
1793
/* Also, add the destination address. */
1794
if (list_empty(&retval->base.bind_addr.address_list)) {
1795
sctp_add_bind_addr(&retval->base.bind_addr, &chunk->dest,
1796
SCTP_ADDR_SRC, GFP_ATOMIC);
1797
}
1798
1799
retval->next_tsn = retval->c.initial_tsn;
1800
retval->ctsn_ack_point = retval->next_tsn - 1;
1801
retval->addip_serial = retval->c.initial_tsn;
1802
retval->adv_peer_ack_point = retval->ctsn_ack_point;
1803
retval->peer.prsctp_capable = retval->c.prsctp_capable;
1804
retval->peer.adaptation_ind = retval->c.adaptation_ind;
1805
1806
/* The INIT stuff will be done by the side effects. */
1807
return retval;
1808
1809
fail:
1810
if (retval)
1811
sctp_association_free(retval);
1812
1813
return NULL;
1814
1815
malformed:
1816
/* Yikes! The packet is either corrupt or deliberately
1817
* malformed.
1818
*/
1819
*error = -SCTP_IERROR_MALFORMED;
1820
goto fail;
1821
}
1822
1823
/********************************************************************
1824
* 3rd Level Abstractions
1825
********************************************************************/
1826
1827
struct __sctp_missing {
1828
__be32 num_missing;
1829
__be16 type;
1830
} __packed;
1831
1832
/*
1833
* Report a missing mandatory parameter.
1834
*/
1835
static int sctp_process_missing_param(const struct sctp_association *asoc,
1836
sctp_param_t paramtype,
1837
struct sctp_chunk *chunk,
1838
struct sctp_chunk **errp)
1839
{
1840
struct __sctp_missing report;
1841
__u16 len;
1842
1843
len = WORD_ROUND(sizeof(report));
1844
1845
/* Make an ERROR chunk, preparing enough room for
1846
* returning multiple unknown parameters.
1847
*/
1848
if (!*errp)
1849
*errp = sctp_make_op_error_space(asoc, chunk, len);
1850
1851
if (*errp) {
1852
report.num_missing = htonl(1);
1853
report.type = paramtype;
1854
sctp_init_cause(*errp, SCTP_ERROR_MISS_PARAM,
1855
sizeof(report));
1856
sctp_addto_chunk(*errp, sizeof(report), &report);
1857
}
1858
1859
/* Stop processing this chunk. */
1860
return 0;
1861
}
1862
1863
/* Report an Invalid Mandatory Parameter. */
1864
static int sctp_process_inv_mandatory(const struct sctp_association *asoc,
1865
struct sctp_chunk *chunk,
1866
struct sctp_chunk **errp)
1867
{
1868
/* Invalid Mandatory Parameter Error has no payload. */
1869
1870
if (!*errp)
1871
*errp = sctp_make_op_error_space(asoc, chunk, 0);
1872
1873
if (*errp)
1874
sctp_init_cause(*errp, SCTP_ERROR_INV_PARAM, 0);
1875
1876
/* Stop processing this chunk. */
1877
return 0;
1878
}
1879
1880
static int sctp_process_inv_paramlength(const struct sctp_association *asoc,
1881
struct sctp_paramhdr *param,
1882
const struct sctp_chunk *chunk,
1883
struct sctp_chunk **errp)
1884
{
1885
/* This is a fatal error. Any accumulated non-fatal errors are
1886
* not reported.
1887
*/
1888
if (*errp)
1889
sctp_chunk_free(*errp);
1890
1891
/* Create an error chunk and fill it in with our payload. */
1892
*errp = sctp_make_violation_paramlen(asoc, chunk, param);
1893
1894
return 0;
1895
}
1896
1897
1898
/* Do not attempt to handle the HOST_NAME parm. However, do
1899
* send back an indicator to the peer.
1900
*/
1901
static int sctp_process_hn_param(const struct sctp_association *asoc,
1902
union sctp_params param,
1903
struct sctp_chunk *chunk,
1904
struct sctp_chunk **errp)
1905
{
1906
__u16 len = ntohs(param.p->length);
1907
1908
/* Processing of the HOST_NAME parameter will generate an
1909
* ABORT. If we've accumulated any non-fatal errors, they
1910
* would be unrecognized parameters and we should not include
1911
* them in the ABORT.
1912
*/
1913
if (*errp)
1914
sctp_chunk_free(*errp);
1915
1916
*errp = sctp_make_op_error_space(asoc, chunk, len);
1917
1918
if (*errp) {
1919
sctp_init_cause(*errp, SCTP_ERROR_DNS_FAILED, len);
1920
sctp_addto_chunk(*errp, len, param.v);
1921
}
1922
1923
/* Stop processing this chunk. */
1924
return 0;
1925
}
1926
1927
static int sctp_verify_ext_param(union sctp_params param)
1928
{
1929
__u16 num_ext = ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
1930
int have_auth = 0;
1931
int have_asconf = 0;
1932
int i;
1933
1934
for (i = 0; i < num_ext; i++) {
1935
switch (param.ext->chunks[i]) {
1936
case SCTP_CID_AUTH:
1937
have_auth = 1;
1938
break;
1939
case SCTP_CID_ASCONF:
1940
case SCTP_CID_ASCONF_ACK:
1941
have_asconf = 1;
1942
break;
1943
}
1944
}
1945
1946
/* ADD-IP Security: The draft requires us to ABORT or ignore the
1947
* INIT/INIT-ACK if ADD-IP is listed, but AUTH is not. Do this
1948
* only if ADD-IP is turned on and we are not backward-compatible
1949
* mode.
1950
*/
1951
if (sctp_addip_noauth)
1952
return 1;
1953
1954
if (sctp_addip_enable && !have_auth && have_asconf)
1955
return 0;
1956
1957
return 1;
1958
}
1959
1960
static void sctp_process_ext_param(struct sctp_association *asoc,
1961
union sctp_params param)
1962
{
1963
__u16 num_ext = ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
1964
int i;
1965
1966
for (i = 0; i < num_ext; i++) {
1967
switch (param.ext->chunks[i]) {
1968
case SCTP_CID_FWD_TSN:
1969
if (sctp_prsctp_enable &&
1970
!asoc->peer.prsctp_capable)
1971
asoc->peer.prsctp_capable = 1;
1972
break;
1973
case SCTP_CID_AUTH:
1974
/* if the peer reports AUTH, assume that he
1975
* supports AUTH.
1976
*/
1977
if (sctp_auth_enable)
1978
asoc->peer.auth_capable = 1;
1979
break;
1980
case SCTP_CID_ASCONF:
1981
case SCTP_CID_ASCONF_ACK:
1982
if (sctp_addip_enable)
1983
asoc->peer.asconf_capable = 1;
1984
break;
1985
default:
1986
break;
1987
}
1988
}
1989
}
1990
1991
/* RFC 3.2.1 & the Implementers Guide 2.2.
1992
*
1993
* The Parameter Types are encoded such that the
1994
* highest-order two bits specify the action that must be
1995
* taken if the processing endpoint does not recognize the
1996
* Parameter Type.
1997
*
1998
* 00 - Stop processing this parameter; do not process any further
1999
* parameters within this chunk
2000
*
2001
* 01 - Stop processing this parameter, do not process any further
2002
* parameters within this chunk, and report the unrecognized
2003
* parameter in an 'Unrecognized Parameter' ERROR chunk.
2004
*
2005
* 10 - Skip this parameter and continue processing.
2006
*
2007
* 11 - Skip this parameter and continue processing but
2008
* report the unrecognized parameter in an
2009
* 'Unrecognized Parameter' ERROR chunk.
2010
*
2011
* Return value:
2012
* SCTP_IERROR_NO_ERROR - continue with the chunk
2013
* SCTP_IERROR_ERROR - stop and report an error.
2014
* SCTP_IERROR_NOMEME - out of memory.
2015
*/
2016
static sctp_ierror_t sctp_process_unk_param(const struct sctp_association *asoc,
2017
union sctp_params param,
2018
struct sctp_chunk *chunk,
2019
struct sctp_chunk **errp)
2020
{
2021
int retval = SCTP_IERROR_NO_ERROR;
2022
2023
switch (param.p->type & SCTP_PARAM_ACTION_MASK) {
2024
case SCTP_PARAM_ACTION_DISCARD:
2025
retval = SCTP_IERROR_ERROR;
2026
break;
2027
case SCTP_PARAM_ACTION_SKIP:
2028
break;
2029
case SCTP_PARAM_ACTION_DISCARD_ERR:
2030
retval = SCTP_IERROR_ERROR;
2031
/* Fall through */
2032
case SCTP_PARAM_ACTION_SKIP_ERR:
2033
/* Make an ERROR chunk, preparing enough room for
2034
* returning multiple unknown parameters.
2035
*/
2036
if (NULL == *errp)
2037
*errp = sctp_make_op_error_fixed(asoc, chunk);
2038
2039
if (*errp) {
2040
if (!sctp_init_cause_fixed(*errp, SCTP_ERROR_UNKNOWN_PARAM,
2041
WORD_ROUND(ntohs(param.p->length))))
2042
sctp_addto_chunk_fixed(*errp,
2043
WORD_ROUND(ntohs(param.p->length)),
2044
param.v);
2045
} else {
2046
/* If there is no memory for generating the ERROR
2047
* report as specified, an ABORT will be triggered
2048
* to the peer and the association won't be
2049
* established.
2050
*/
2051
retval = SCTP_IERROR_NOMEM;
2052
}
2053
break;
2054
default:
2055
break;
2056
}
2057
2058
return retval;
2059
}
2060
2061
/* Verify variable length parameters
2062
* Return values:
2063
* SCTP_IERROR_ABORT - trigger an ABORT
2064
* SCTP_IERROR_NOMEM - out of memory (abort)
2065
* SCTP_IERROR_ERROR - stop processing, trigger an ERROR
2066
* SCTP_IERROR_NO_ERROR - continue with the chunk
2067
*/
2068
static sctp_ierror_t sctp_verify_param(const struct sctp_association *asoc,
2069
union sctp_params param,
2070
sctp_cid_t cid,
2071
struct sctp_chunk *chunk,
2072
struct sctp_chunk **err_chunk)
2073
{
2074
struct sctp_hmac_algo_param *hmacs;
2075
int retval = SCTP_IERROR_NO_ERROR;
2076
__u16 n_elt, id = 0;
2077
int i;
2078
2079
/* FIXME - This routine is not looking at each parameter per the
2080
* chunk type, i.e., unrecognized parameters should be further
2081
* identified based on the chunk id.
2082
*/
2083
2084
switch (param.p->type) {
2085
case SCTP_PARAM_IPV4_ADDRESS:
2086
case SCTP_PARAM_IPV6_ADDRESS:
2087
case SCTP_PARAM_COOKIE_PRESERVATIVE:
2088
case SCTP_PARAM_SUPPORTED_ADDRESS_TYPES:
2089
case SCTP_PARAM_STATE_COOKIE:
2090
case SCTP_PARAM_HEARTBEAT_INFO:
2091
case SCTP_PARAM_UNRECOGNIZED_PARAMETERS:
2092
case SCTP_PARAM_ECN_CAPABLE:
2093
case SCTP_PARAM_ADAPTATION_LAYER_IND:
2094
break;
2095
2096
case SCTP_PARAM_SUPPORTED_EXT:
2097
if (!sctp_verify_ext_param(param))
2098
return SCTP_IERROR_ABORT;
2099
break;
2100
2101
case SCTP_PARAM_SET_PRIMARY:
2102
if (sctp_addip_enable)
2103
break;
2104
goto fallthrough;
2105
2106
case SCTP_PARAM_HOST_NAME_ADDRESS:
2107
/* Tell the peer, we won't support this param. */
2108
sctp_process_hn_param(asoc, param, chunk, err_chunk);
2109
retval = SCTP_IERROR_ABORT;
2110
break;
2111
2112
case SCTP_PARAM_FWD_TSN_SUPPORT:
2113
if (sctp_prsctp_enable)
2114
break;
2115
goto fallthrough;
2116
2117
case SCTP_PARAM_RANDOM:
2118
if (!sctp_auth_enable)
2119
goto fallthrough;
2120
2121
/* SCTP-AUTH: Secion 6.1
2122
* If the random number is not 32 byte long the association
2123
* MUST be aborted. The ABORT chunk SHOULD contain the error
2124
* cause 'Protocol Violation'.
2125
*/
2126
if (SCTP_AUTH_RANDOM_LENGTH !=
2127
ntohs(param.p->length) - sizeof(sctp_paramhdr_t)) {
2128
sctp_process_inv_paramlength(asoc, param.p,
2129
chunk, err_chunk);
2130
retval = SCTP_IERROR_ABORT;
2131
}
2132
break;
2133
2134
case SCTP_PARAM_CHUNKS:
2135
if (!sctp_auth_enable)
2136
goto fallthrough;
2137
2138
/* SCTP-AUTH: Section 3.2
2139
* The CHUNKS parameter MUST be included once in the INIT or
2140
* INIT-ACK chunk if the sender wants to receive authenticated
2141
* chunks. Its maximum length is 260 bytes.
2142
*/
2143
if (260 < ntohs(param.p->length)) {
2144
sctp_process_inv_paramlength(asoc, param.p,
2145
chunk, err_chunk);
2146
retval = SCTP_IERROR_ABORT;
2147
}
2148
break;
2149
2150
case SCTP_PARAM_HMAC_ALGO:
2151
if (!sctp_auth_enable)
2152
goto fallthrough;
2153
2154
hmacs = (struct sctp_hmac_algo_param *)param.p;
2155
n_elt = (ntohs(param.p->length) - sizeof(sctp_paramhdr_t)) >> 1;
2156
2157
/* SCTP-AUTH: Section 6.1
2158
* The HMAC algorithm based on SHA-1 MUST be supported and
2159
* included in the HMAC-ALGO parameter.
2160
*/
2161
for (i = 0; i < n_elt; i++) {
2162
id = ntohs(hmacs->hmac_ids[i]);
2163
2164
if (id == SCTP_AUTH_HMAC_ID_SHA1)
2165
break;
2166
}
2167
2168
if (id != SCTP_AUTH_HMAC_ID_SHA1) {
2169
sctp_process_inv_paramlength(asoc, param.p, chunk,
2170
err_chunk);
2171
retval = SCTP_IERROR_ABORT;
2172
}
2173
break;
2174
fallthrough:
2175
default:
2176
SCTP_DEBUG_PRINTK("Unrecognized param: %d for chunk %d.\n",
2177
ntohs(param.p->type), cid);
2178
retval = sctp_process_unk_param(asoc, param, chunk, err_chunk);
2179
break;
2180
}
2181
return retval;
2182
}
2183
2184
/* Verify the INIT packet before we process it. */
2185
int sctp_verify_init(const struct sctp_association *asoc,
2186
sctp_cid_t cid,
2187
sctp_init_chunk_t *peer_init,
2188
struct sctp_chunk *chunk,
2189
struct sctp_chunk **errp)
2190
{
2191
union sctp_params param;
2192
int has_cookie = 0;
2193
int result;
2194
2195
/* Verify stream values are non-zero. */
2196
if ((0 == peer_init->init_hdr.num_outbound_streams) ||
2197
(0 == peer_init->init_hdr.num_inbound_streams) ||
2198
(0 == peer_init->init_hdr.init_tag) ||
2199
(SCTP_DEFAULT_MINWINDOW > ntohl(peer_init->init_hdr.a_rwnd))) {
2200
2201
return sctp_process_inv_mandatory(asoc, chunk, errp);
2202
}
2203
2204
/* Check for missing mandatory parameters. */
2205
sctp_walk_params(param, peer_init, init_hdr.params) {
2206
2207
if (SCTP_PARAM_STATE_COOKIE == param.p->type)
2208
has_cookie = 1;
2209
2210
} /* for (loop through all parameters) */
2211
2212
/* There is a possibility that a parameter length was bad and
2213
* in that case we would have stoped walking the parameters.
2214
* The current param.p would point at the bad one.
2215
* Current consensus on the mailing list is to generate a PROTOCOL
2216
* VIOLATION error. We build the ERROR chunk here and let the normal
2217
* error handling code build and send the packet.
2218
*/
2219
if (param.v != (void*)chunk->chunk_end)
2220
return sctp_process_inv_paramlength(asoc, param.p, chunk, errp);
2221
2222
/* The only missing mandatory param possible today is
2223
* the state cookie for an INIT-ACK chunk.
2224
*/
2225
if ((SCTP_CID_INIT_ACK == cid) && !has_cookie)
2226
return sctp_process_missing_param(asoc, SCTP_PARAM_STATE_COOKIE,
2227
chunk, errp);
2228
2229
/* Verify all the variable length parameters */
2230
sctp_walk_params(param, peer_init, init_hdr.params) {
2231
2232
result = sctp_verify_param(asoc, param, cid, chunk, errp);
2233
switch (result) {
2234
case SCTP_IERROR_ABORT:
2235
case SCTP_IERROR_NOMEM:
2236
return 0;
2237
case SCTP_IERROR_ERROR:
2238
return 1;
2239
case SCTP_IERROR_NO_ERROR:
2240
default:
2241
break;
2242
}
2243
2244
} /* for (loop through all parameters) */
2245
2246
return 1;
2247
}
2248
2249
/* Unpack the parameters in an INIT packet into an association.
2250
* Returns 0 on failure, else success.
2251
* FIXME: This is an association method.
2252
*/
2253
int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,
2254
const union sctp_addr *peer_addr,
2255
sctp_init_chunk_t *peer_init, gfp_t gfp)
2256
{
2257
union sctp_params param;
2258
struct sctp_transport *transport;
2259
struct list_head *pos, *temp;
2260
struct sctp_af *af;
2261
union sctp_addr addr;
2262
char *cookie;
2263
int src_match = 0;
2264
2265
/* We must include the address that the INIT packet came from.
2266
* This is the only address that matters for an INIT packet.
2267
* When processing a COOKIE ECHO, we retrieve the from address
2268
* of the INIT from the cookie.
2269
*/
2270
2271
/* This implementation defaults to making the first transport
2272
* added as the primary transport. The source address seems to
2273
* be a a better choice than any of the embedded addresses.
2274
*/
2275
if(!sctp_assoc_add_peer(asoc, peer_addr, gfp, SCTP_ACTIVE))
2276
goto nomem;
2277
2278
if (sctp_cmp_addr_exact(sctp_source(chunk), peer_addr))
2279
src_match = 1;
2280
2281
/* Process the initialization parameters. */
2282
sctp_walk_params(param, peer_init, init_hdr.params) {
2283
if (!src_match && (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
2284
param.p->type == SCTP_PARAM_IPV6_ADDRESS)) {
2285
af = sctp_get_af_specific(param_type2af(param.p->type));
2286
af->from_addr_param(&addr, param.addr,
2287
chunk->sctp_hdr->source, 0);
2288
if (sctp_cmp_addr_exact(sctp_source(chunk), &addr))
2289
src_match = 1;
2290
}
2291
2292
if (!sctp_process_param(asoc, param, peer_addr, gfp))
2293
goto clean_up;
2294
}
2295
2296
/* source address of chunk may not match any valid address */
2297
if (!src_match)
2298
goto clean_up;
2299
2300
/* AUTH: After processing the parameters, make sure that we
2301
* have all the required info to potentially do authentications.
2302
*/
2303
if (asoc->peer.auth_capable && (!asoc->peer.peer_random ||
2304
!asoc->peer.peer_hmacs))
2305
asoc->peer.auth_capable = 0;
2306
2307
/* In a non-backward compatible mode, if the peer claims
2308
* support for ADD-IP but not AUTH, the ADD-IP spec states
2309
* that we MUST ABORT the association. Section 6. The section
2310
* also give us an option to silently ignore the packet, which
2311
* is what we'll do here.
2312
*/
2313
if (!sctp_addip_noauth &&
2314
(asoc->peer.asconf_capable && !asoc->peer.auth_capable)) {
2315
asoc->peer.addip_disabled_mask |= (SCTP_PARAM_ADD_IP |
2316
SCTP_PARAM_DEL_IP |
2317
SCTP_PARAM_SET_PRIMARY);
2318
asoc->peer.asconf_capable = 0;
2319
goto clean_up;
2320
}
2321
2322
/* Walk list of transports, removing transports in the UNKNOWN state. */
2323
list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
2324
transport = list_entry(pos, struct sctp_transport, transports);
2325
if (transport->state == SCTP_UNKNOWN) {
2326
sctp_assoc_rm_peer(asoc, transport);
2327
}
2328
}
2329
2330
/* The fixed INIT headers are always in network byte
2331
* order.
2332
*/
2333
asoc->peer.i.init_tag =
2334
ntohl(peer_init->init_hdr.init_tag);
2335
asoc->peer.i.a_rwnd =
2336
ntohl(peer_init->init_hdr.a_rwnd);
2337
asoc->peer.i.num_outbound_streams =
2338
ntohs(peer_init->init_hdr.num_outbound_streams);
2339
asoc->peer.i.num_inbound_streams =
2340
ntohs(peer_init->init_hdr.num_inbound_streams);
2341
asoc->peer.i.initial_tsn =
2342
ntohl(peer_init->init_hdr.initial_tsn);
2343
2344
/* Apply the upper bounds for output streams based on peer's
2345
* number of inbound streams.
2346
*/
2347
if (asoc->c.sinit_num_ostreams >
2348
ntohs(peer_init->init_hdr.num_inbound_streams)) {
2349
asoc->c.sinit_num_ostreams =
2350
ntohs(peer_init->init_hdr.num_inbound_streams);
2351
}
2352
2353
if (asoc->c.sinit_max_instreams >
2354
ntohs(peer_init->init_hdr.num_outbound_streams)) {
2355
asoc->c.sinit_max_instreams =
2356
ntohs(peer_init->init_hdr.num_outbound_streams);
2357
}
2358
2359
/* Copy Initiation tag from INIT to VT_peer in cookie. */
2360
asoc->c.peer_vtag = asoc->peer.i.init_tag;
2361
2362
/* Peer Rwnd : Current calculated value of the peer's rwnd. */
2363
asoc->peer.rwnd = asoc->peer.i.a_rwnd;
2364
2365
/* Copy cookie in case we need to resend COOKIE-ECHO. */
2366
cookie = asoc->peer.cookie;
2367
if (cookie) {
2368
asoc->peer.cookie = kmemdup(cookie, asoc->peer.cookie_len, gfp);
2369
if (!asoc->peer.cookie)
2370
goto clean_up;
2371
}
2372
2373
/* RFC 2960 7.2.1 The initial value of ssthresh MAY be arbitrarily
2374
* high (for example, implementations MAY use the size of the receiver
2375
* advertised window).
2376
*/
2377
list_for_each_entry(transport, &asoc->peer.transport_addr_list,
2378
transports) {
2379
transport->ssthresh = asoc->peer.i.a_rwnd;
2380
}
2381
2382
/* Set up the TSN tracking pieces. */
2383
if (!sctp_tsnmap_init(&asoc->peer.tsn_map, SCTP_TSN_MAP_INITIAL,
2384
asoc->peer.i.initial_tsn, gfp))
2385
goto clean_up;
2386
2387
/* RFC 2960 6.5 Stream Identifier and Stream Sequence Number
2388
*
2389
* The stream sequence number in all the streams shall start
2390
* from 0 when the association is established. Also, when the
2391
* stream sequence number reaches the value 65535 the next
2392
* stream sequence number shall be set to 0.
2393
*/
2394
2395
/* Allocate storage for the negotiated streams if it is not a temporary
2396
* association.
2397
*/
2398
if (!asoc->temp) {
2399
int error;
2400
2401
asoc->ssnmap = sctp_ssnmap_new(asoc->c.sinit_max_instreams,
2402
asoc->c.sinit_num_ostreams, gfp);
2403
if (!asoc->ssnmap)
2404
goto clean_up;
2405
2406
error = sctp_assoc_set_id(asoc, gfp);
2407
if (error)
2408
goto clean_up;
2409
}
2410
2411
/* ADDIP Section 4.1 ASCONF Chunk Procedures
2412
*
2413
* When an endpoint has an ASCONF signaled change to be sent to the
2414
* remote endpoint it should do the following:
2415
* ...
2416
* A2) A serial number should be assigned to the Chunk. The serial
2417
* number should be a monotonically increasing number. All serial
2418
* numbers are defined to be initialized at the start of the
2419
* association to the same value as the Initial TSN.
2420
*/
2421
asoc->peer.addip_serial = asoc->peer.i.initial_tsn - 1;
2422
return 1;
2423
2424
clean_up:
2425
/* Release the transport structures. */
2426
list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
2427
transport = list_entry(pos, struct sctp_transport, transports);
2428
if (transport->state != SCTP_ACTIVE)
2429
sctp_assoc_rm_peer(asoc, transport);
2430
}
2431
2432
nomem:
2433
return 0;
2434
}
2435
2436
2437
/* Update asoc with the option described in param.
2438
*
2439
* RFC2960 3.3.2.1 Optional/Variable Length Parameters in INIT
2440
*
2441
* asoc is the association to update.
2442
* param is the variable length parameter to use for update.
2443
* cid tells us if this is an INIT, INIT ACK or COOKIE ECHO.
2444
* If the current packet is an INIT we want to minimize the amount of
2445
* work we do. In particular, we should not build transport
2446
* structures for the addresses.
2447
*/
2448
static int sctp_process_param(struct sctp_association *asoc,
2449
union sctp_params param,
2450
const union sctp_addr *peer_addr,
2451
gfp_t gfp)
2452
{
2453
union sctp_addr addr;
2454
int i;
2455
__u16 sat;
2456
int retval = 1;
2457
sctp_scope_t scope;
2458
time_t stale;
2459
struct sctp_af *af;
2460
union sctp_addr_param *addr_param;
2461
struct sctp_transport *t;
2462
2463
/* We maintain all INIT parameters in network byte order all the
2464
* time. This allows us to not worry about whether the parameters
2465
* came from a fresh INIT, and INIT ACK, or were stored in a cookie.
2466
*/
2467
switch (param.p->type) {
2468
case SCTP_PARAM_IPV6_ADDRESS:
2469
if (PF_INET6 != asoc->base.sk->sk_family)
2470
break;
2471
goto do_addr_param;
2472
2473
case SCTP_PARAM_IPV4_ADDRESS:
2474
/* v4 addresses are not allowed on v6-only socket */
2475
if (ipv6_only_sock(asoc->base.sk))
2476
break;
2477
do_addr_param:
2478
af = sctp_get_af_specific(param_type2af(param.p->type));
2479
af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0);
2480
scope = sctp_scope(peer_addr);
2481
if (sctp_in_scope(&addr, scope))
2482
if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_UNCONFIRMED))
2483
return 0;
2484
break;
2485
2486
case SCTP_PARAM_COOKIE_PRESERVATIVE:
2487
if (!sctp_cookie_preserve_enable)
2488
break;
2489
2490
stale = ntohl(param.life->lifespan_increment);
2491
2492
/* Suggested Cookie Life span increment's unit is msec,
2493
* (1/1000sec).
2494
*/
2495
asoc->cookie_life.tv_sec += stale / 1000;
2496
asoc->cookie_life.tv_usec += (stale % 1000) * 1000;
2497
break;
2498
2499
case SCTP_PARAM_HOST_NAME_ADDRESS:
2500
SCTP_DEBUG_PRINTK("unimplemented SCTP_HOST_NAME_ADDRESS\n");
2501
break;
2502
2503
case SCTP_PARAM_SUPPORTED_ADDRESS_TYPES:
2504
/* Turn off the default values first so we'll know which
2505
* ones are really set by the peer.
2506
*/
2507
asoc->peer.ipv4_address = 0;
2508
asoc->peer.ipv6_address = 0;
2509
2510
/* Assume that peer supports the address family
2511
* by which it sends a packet.
2512
*/
2513
if (peer_addr->sa.sa_family == AF_INET6)
2514
asoc->peer.ipv6_address = 1;
2515
else if (peer_addr->sa.sa_family == AF_INET)
2516
asoc->peer.ipv4_address = 1;
2517
2518
/* Cycle through address types; avoid divide by 0. */
2519
sat = ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
2520
if (sat)
2521
sat /= sizeof(__u16);
2522
2523
for (i = 0; i < sat; ++i) {
2524
switch (param.sat->types[i]) {
2525
case SCTP_PARAM_IPV4_ADDRESS:
2526
asoc->peer.ipv4_address = 1;
2527
break;
2528
2529
case SCTP_PARAM_IPV6_ADDRESS:
2530
if (PF_INET6 == asoc->base.sk->sk_family)
2531
asoc->peer.ipv6_address = 1;
2532
break;
2533
2534
case SCTP_PARAM_HOST_NAME_ADDRESS:
2535
asoc->peer.hostname_address = 1;
2536
break;
2537
2538
default: /* Just ignore anything else. */
2539
break;
2540
}
2541
}
2542
break;
2543
2544
case SCTP_PARAM_STATE_COOKIE:
2545
asoc->peer.cookie_len =
2546
ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
2547
asoc->peer.cookie = param.cookie->body;
2548
break;
2549
2550
case SCTP_PARAM_HEARTBEAT_INFO:
2551
/* Would be odd to receive, but it causes no problems. */
2552
break;
2553
2554
case SCTP_PARAM_UNRECOGNIZED_PARAMETERS:
2555
/* Rejected during verify stage. */
2556
break;
2557
2558
case SCTP_PARAM_ECN_CAPABLE:
2559
asoc->peer.ecn_capable = 1;
2560
break;
2561
2562
case SCTP_PARAM_ADAPTATION_LAYER_IND:
2563
asoc->peer.adaptation_ind = ntohl(param.aind->adaptation_ind);
2564
break;
2565
2566
case SCTP_PARAM_SET_PRIMARY:
2567
if (!sctp_addip_enable)
2568
goto fall_through;
2569
2570
addr_param = param.v + sizeof(sctp_addip_param_t);
2571
2572
af = sctp_get_af_specific(param_type2af(param.p->type));
2573
af->from_addr_param(&addr, addr_param,
2574
htons(asoc->peer.port), 0);
2575
2576
/* if the address is invalid, we can't process it.
2577
* XXX: see spec for what to do.
2578
*/
2579
if (!af->addr_valid(&addr, NULL, NULL))
2580
break;
2581
2582
t = sctp_assoc_lookup_paddr(asoc, &addr);
2583
if (!t)
2584
break;
2585
2586
sctp_assoc_set_primary(asoc, t);
2587
break;
2588
2589
case SCTP_PARAM_SUPPORTED_EXT:
2590
sctp_process_ext_param(asoc, param);
2591
break;
2592
2593
case SCTP_PARAM_FWD_TSN_SUPPORT:
2594
if (sctp_prsctp_enable) {
2595
asoc->peer.prsctp_capable = 1;
2596
break;
2597
}
2598
/* Fall Through */
2599
goto fall_through;
2600
2601
case SCTP_PARAM_RANDOM:
2602
if (!sctp_auth_enable)
2603
goto fall_through;
2604
2605
/* Save peer's random parameter */
2606
asoc->peer.peer_random = kmemdup(param.p,
2607
ntohs(param.p->length), gfp);
2608
if (!asoc->peer.peer_random) {
2609
retval = 0;
2610
break;
2611
}
2612
break;
2613
2614
case SCTP_PARAM_HMAC_ALGO:
2615
if (!sctp_auth_enable)
2616
goto fall_through;
2617
2618
/* Save peer's HMAC list */
2619
asoc->peer.peer_hmacs = kmemdup(param.p,
2620
ntohs(param.p->length), gfp);
2621
if (!asoc->peer.peer_hmacs) {
2622
retval = 0;
2623
break;
2624
}
2625
2626
/* Set the default HMAC the peer requested*/
2627
sctp_auth_asoc_set_default_hmac(asoc, param.hmac_algo);
2628
break;
2629
2630
case SCTP_PARAM_CHUNKS:
2631
if (!sctp_auth_enable)
2632
goto fall_through;
2633
2634
asoc->peer.peer_chunks = kmemdup(param.p,
2635
ntohs(param.p->length), gfp);
2636
if (!asoc->peer.peer_chunks)
2637
retval = 0;
2638
break;
2639
fall_through:
2640
default:
2641
/* Any unrecognized parameters should have been caught
2642
* and handled by sctp_verify_param() which should be
2643
* called prior to this routine. Simply log the error
2644
* here.
2645
*/
2646
SCTP_DEBUG_PRINTK("Ignoring param: %d for association %p.\n",
2647
ntohs(param.p->type), asoc);
2648
break;
2649
}
2650
2651
return retval;
2652
}
2653
2654
/* Select a new verification tag. */
2655
__u32 sctp_generate_tag(const struct sctp_endpoint *ep)
2656
{
2657
/* I believe that this random number generator complies with RFC1750.
2658
* A tag of 0 is reserved for special cases (e.g. INIT).
2659
*/
2660
__u32 x;
2661
2662
do {
2663
get_random_bytes(&x, sizeof(__u32));
2664
} while (x == 0);
2665
2666
return x;
2667
}
2668
2669
/* Select an initial TSN to send during startup. */
2670
__u32 sctp_generate_tsn(const struct sctp_endpoint *ep)
2671
{
2672
__u32 retval;
2673
2674
get_random_bytes(&retval, sizeof(__u32));
2675
return retval;
2676
}
2677
2678
/*
2679
* ADDIP 3.1.1 Address Configuration Change Chunk (ASCONF)
2680
* 0 1 2 3
2681
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
2682
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2683
* | Type = 0xC1 | Chunk Flags | Chunk Length |
2684
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2685
* | Serial Number |
2686
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2687
* | Address Parameter |
2688
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2689
* | ASCONF Parameter #1 |
2690
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2691
* \ \
2692
* / .... /
2693
* \ \
2694
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2695
* | ASCONF Parameter #N |
2696
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2697
*
2698
* Address Parameter and other parameter will not be wrapped in this function
2699
*/
2700
static struct sctp_chunk *sctp_make_asconf(struct sctp_association *asoc,
2701
union sctp_addr *addr,
2702
int vparam_len)
2703
{
2704
sctp_addiphdr_t asconf;
2705
struct sctp_chunk *retval;
2706
int length = sizeof(asconf) + vparam_len;
2707
union sctp_addr_param addrparam;
2708
int addrlen;
2709
struct sctp_af *af = sctp_get_af_specific(addr->v4.sin_family);
2710
2711
addrlen = af->to_addr_param(addr, &addrparam);
2712
if (!addrlen)
2713
return NULL;
2714
length += addrlen;
2715
2716
/* Create the chunk. */
2717
retval = sctp_make_chunk(asoc, SCTP_CID_ASCONF, 0, length);
2718
if (!retval)
2719
return NULL;
2720
2721
asconf.serial = htonl(asoc->addip_serial++);
2722
2723
retval->subh.addip_hdr =
2724
sctp_addto_chunk(retval, sizeof(asconf), &asconf);
2725
retval->param_hdr.v =
2726
sctp_addto_chunk(retval, addrlen, &addrparam);
2727
2728
return retval;
2729
}
2730
2731
/* ADDIP
2732
* 3.2.1 Add IP Address
2733
* 0 1 2 3
2734
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
2735
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2736
* | Type = 0xC001 | Length = Variable |
2737
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2738
* | ASCONF-Request Correlation ID |
2739
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2740
* | Address Parameter |
2741
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2742
*
2743
* 3.2.2 Delete IP Address
2744
* 0 1 2 3
2745
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
2746
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2747
* | Type = 0xC002 | Length = Variable |
2748
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2749
* | ASCONF-Request Correlation ID |
2750
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2751
* | Address Parameter |
2752
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2753
*
2754
*/
2755
struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *asoc,
2756
union sctp_addr *laddr,
2757
struct sockaddr *addrs,
2758
int addrcnt,
2759
__be16 flags)
2760
{
2761
sctp_addip_param_t param;
2762
struct sctp_chunk *retval;
2763
union sctp_addr_param addr_param;
2764
union sctp_addr *addr;
2765
void *addr_buf;
2766
struct sctp_af *af;
2767
int paramlen = sizeof(param);
2768
int addr_param_len = 0;
2769
int totallen = 0;
2770
int i;
2771
2772
/* Get total length of all the address parameters. */
2773
addr_buf = addrs;
2774
for (i = 0; i < addrcnt; i++) {
2775
addr = (union sctp_addr *)addr_buf;
2776
af = sctp_get_af_specific(addr->v4.sin_family);
2777
addr_param_len = af->to_addr_param(addr, &addr_param);
2778
2779
totallen += paramlen;
2780
totallen += addr_param_len;
2781
2782
addr_buf += af->sockaddr_len;
2783
}
2784
2785
/* Create an asconf chunk with the required length. */
2786
retval = sctp_make_asconf(asoc, laddr, totallen);
2787
if (!retval)
2788
return NULL;
2789
2790
/* Add the address parameters to the asconf chunk. */
2791
addr_buf = addrs;
2792
for (i = 0; i < addrcnt; i++) {
2793
addr = (union sctp_addr *)addr_buf;
2794
af = sctp_get_af_specific(addr->v4.sin_family);
2795
addr_param_len = af->to_addr_param(addr, &addr_param);
2796
param.param_hdr.type = flags;
2797
param.param_hdr.length = htons(paramlen + addr_param_len);
2798
param.crr_id = i;
2799
2800
sctp_addto_chunk(retval, paramlen, &param);
2801
sctp_addto_chunk(retval, addr_param_len, &addr_param);
2802
2803
addr_buf += af->sockaddr_len;
2804
}
2805
return retval;
2806
}
2807
2808
/* ADDIP
2809
* 3.2.4 Set Primary IP Address
2810
* 0 1 2 3
2811
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
2812
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2813
* | Type =0xC004 | Length = Variable |
2814
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2815
* | ASCONF-Request Correlation ID |
2816
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2817
* | Address Parameter |
2818
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2819
*
2820
* Create an ASCONF chunk with Set Primary IP address parameter.
2821
*/
2822
struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc,
2823
union sctp_addr *addr)
2824
{
2825
sctp_addip_param_t param;
2826
struct sctp_chunk *retval;
2827
int len = sizeof(param);
2828
union sctp_addr_param addrparam;
2829
int addrlen;
2830
struct sctp_af *af = sctp_get_af_specific(addr->v4.sin_family);
2831
2832
addrlen = af->to_addr_param(addr, &addrparam);
2833
if (!addrlen)
2834
return NULL;
2835
len += addrlen;
2836
2837
/* Create the chunk and make asconf header. */
2838
retval = sctp_make_asconf(asoc, addr, len);
2839
if (!retval)
2840
return NULL;
2841
2842
param.param_hdr.type = SCTP_PARAM_SET_PRIMARY;
2843
param.param_hdr.length = htons(len);
2844
param.crr_id = 0;
2845
2846
sctp_addto_chunk(retval, sizeof(param), &param);
2847
sctp_addto_chunk(retval, addrlen, &addrparam);
2848
2849
return retval;
2850
}
2851
2852
/* ADDIP 3.1.2 Address Configuration Acknowledgement Chunk (ASCONF-ACK)
2853
* 0 1 2 3
2854
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
2855
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2856
* | Type = 0x80 | Chunk Flags | Chunk Length |
2857
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2858
* | Serial Number |
2859
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2860
* | ASCONF Parameter Response#1 |
2861
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2862
* \ \
2863
* / .... /
2864
* \ \
2865
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2866
* | ASCONF Parameter Response#N |
2867
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2868
*
2869
* Create an ASCONF_ACK chunk with enough space for the parameter responses.
2870
*/
2871
static struct sctp_chunk *sctp_make_asconf_ack(const struct sctp_association *asoc,
2872
__u32 serial, int vparam_len)
2873
{
2874
sctp_addiphdr_t asconf;
2875
struct sctp_chunk *retval;
2876
int length = sizeof(asconf) + vparam_len;
2877
2878
/* Create the chunk. */
2879
retval = sctp_make_chunk(asoc, SCTP_CID_ASCONF_ACK, 0, length);
2880
if (!retval)
2881
return NULL;
2882
2883
asconf.serial = htonl(serial);
2884
2885
retval->subh.addip_hdr =
2886
sctp_addto_chunk(retval, sizeof(asconf), &asconf);
2887
2888
return retval;
2889
}
2890
2891
/* Add response parameters to an ASCONF_ACK chunk. */
2892
static void sctp_add_asconf_response(struct sctp_chunk *chunk, __be32 crr_id,
2893
__be16 err_code, sctp_addip_param_t *asconf_param)
2894
{
2895
sctp_addip_param_t ack_param;
2896
sctp_errhdr_t err_param;
2897
int asconf_param_len = 0;
2898
int err_param_len = 0;
2899
__be16 response_type;
2900
2901
if (SCTP_ERROR_NO_ERROR == err_code) {
2902
response_type = SCTP_PARAM_SUCCESS_REPORT;
2903
} else {
2904
response_type = SCTP_PARAM_ERR_CAUSE;
2905
err_param_len = sizeof(err_param);
2906
if (asconf_param)
2907
asconf_param_len =
2908
ntohs(asconf_param->param_hdr.length);
2909
}
2910
2911
/* Add Success Indication or Error Cause Indication parameter. */
2912
ack_param.param_hdr.type = response_type;
2913
ack_param.param_hdr.length = htons(sizeof(ack_param) +
2914
err_param_len +
2915
asconf_param_len);
2916
ack_param.crr_id = crr_id;
2917
sctp_addto_chunk(chunk, sizeof(ack_param), &ack_param);
2918
2919
if (SCTP_ERROR_NO_ERROR == err_code)
2920
return;
2921
2922
/* Add Error Cause parameter. */
2923
err_param.cause = err_code;
2924
err_param.length = htons(err_param_len + asconf_param_len);
2925
sctp_addto_chunk(chunk, err_param_len, &err_param);
2926
2927
/* Add the failed TLV copied from ASCONF chunk. */
2928
if (asconf_param)
2929
sctp_addto_chunk(chunk, asconf_param_len, asconf_param);
2930
}
2931
2932
/* Process a asconf parameter. */
2933
static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
2934
struct sctp_chunk *asconf,
2935
sctp_addip_param_t *asconf_param)
2936
{
2937
struct sctp_transport *peer;
2938
struct sctp_af *af;
2939
union sctp_addr addr;
2940
union sctp_addr_param *addr_param;
2941
2942
addr_param = (union sctp_addr_param *)
2943
((void *)asconf_param + sizeof(sctp_addip_param_t));
2944
2945
if (asconf_param->param_hdr.type != SCTP_PARAM_ADD_IP &&
2946
asconf_param->param_hdr.type != SCTP_PARAM_DEL_IP &&
2947
asconf_param->param_hdr.type != SCTP_PARAM_SET_PRIMARY)
2948
return SCTP_ERROR_UNKNOWN_PARAM;
2949
2950
switch (addr_param->p.type) {
2951
case SCTP_PARAM_IPV6_ADDRESS:
2952
if (!asoc->peer.ipv6_address)
2953
return SCTP_ERROR_DNS_FAILED;
2954
break;
2955
case SCTP_PARAM_IPV4_ADDRESS:
2956
if (!asoc->peer.ipv4_address)
2957
return SCTP_ERROR_DNS_FAILED;
2958
break;
2959
default:
2960
return SCTP_ERROR_DNS_FAILED;
2961
}
2962
2963
af = sctp_get_af_specific(param_type2af(addr_param->p.type));
2964
if (unlikely(!af))
2965
return SCTP_ERROR_DNS_FAILED;
2966
2967
af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0);
2968
2969
/* ADDIP 4.2.1 This parameter MUST NOT contain a broadcast
2970
* or multicast address.
2971
* (note: wildcard is permitted and requires special handling so
2972
* make sure we check for that)
2973
*/
2974
if (!af->is_any(&addr) && !af->addr_valid(&addr, NULL, asconf->skb))
2975
return SCTP_ERROR_DNS_FAILED;
2976
2977
switch (asconf_param->param_hdr.type) {
2978
case SCTP_PARAM_ADD_IP:
2979
/* Section 4.2.1:
2980
* If the address 0.0.0.0 or ::0 is provided, the source
2981
* address of the packet MUST be added.
2982
*/
2983
if (af->is_any(&addr))
2984
memcpy(&addr, &asconf->source, sizeof(addr));
2985
2986
/* ADDIP 4.3 D9) If an endpoint receives an ADD IP address
2987
* request and does not have the local resources to add this
2988
* new address to the association, it MUST return an Error
2989
* Cause TLV set to the new error code 'Operation Refused
2990
* Due to Resource Shortage'.
2991
*/
2992
2993
peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC, SCTP_UNCONFIRMED);
2994
if (!peer)
2995
return SCTP_ERROR_RSRC_LOW;
2996
2997
/* Start the heartbeat timer. */
2998
if (!mod_timer(&peer->hb_timer, sctp_transport_timeout(peer)))
2999
sctp_transport_hold(peer);
3000
break;
3001
case SCTP_PARAM_DEL_IP:
3002
/* ADDIP 4.3 D7) If a request is received to delete the
3003
* last remaining IP address of a peer endpoint, the receiver
3004
* MUST send an Error Cause TLV with the error cause set to the
3005
* new error code 'Request to Delete Last Remaining IP Address'.
3006
*/
3007
if (asoc->peer.transport_count == 1)
3008
return SCTP_ERROR_DEL_LAST_IP;
3009
3010
/* ADDIP 4.3 D8) If a request is received to delete an IP
3011
* address which is also the source address of the IP packet
3012
* which contained the ASCONF chunk, the receiver MUST reject
3013
* this request. To reject the request the receiver MUST send
3014
* an Error Cause TLV set to the new error code 'Request to
3015
* Delete Source IP Address'
3016
*/
3017
if (sctp_cmp_addr_exact(sctp_source(asconf), &addr))
3018
return SCTP_ERROR_DEL_SRC_IP;
3019
3020
/* Section 4.2.2
3021
* If the address 0.0.0.0 or ::0 is provided, all
3022
* addresses of the peer except the source address of the
3023
* packet MUST be deleted.
3024
*/
3025
if (af->is_any(&addr)) {
3026
sctp_assoc_set_primary(asoc, asconf->transport);
3027
sctp_assoc_del_nonprimary_peers(asoc,
3028
asconf->transport);
3029
} else
3030
sctp_assoc_del_peer(asoc, &addr);
3031
break;
3032
case SCTP_PARAM_SET_PRIMARY:
3033
/* ADDIP Section 4.2.4
3034
* If the address 0.0.0.0 or ::0 is provided, the receiver
3035
* MAY mark the source address of the packet as its
3036
* primary.
3037
*/
3038
if (af->is_any(&addr))
3039
memcpy(&addr.v4, sctp_source(asconf), sizeof(addr));
3040
3041
peer = sctp_assoc_lookup_paddr(asoc, &addr);
3042
if (!peer)
3043
return SCTP_ERROR_DNS_FAILED;
3044
3045
sctp_assoc_set_primary(asoc, peer);
3046
break;
3047
}
3048
3049
return SCTP_ERROR_NO_ERROR;
3050
}
3051
3052
/* Verify the ASCONF packet before we process it. */
3053
int sctp_verify_asconf(const struct sctp_association *asoc,
3054
struct sctp_paramhdr *param_hdr, void *chunk_end,
3055
struct sctp_paramhdr **errp) {
3056
sctp_addip_param_t *asconf_param;
3057
union sctp_params param;
3058
int length, plen;
3059
3060
param.v = (sctp_paramhdr_t *) param_hdr;
3061
while (param.v <= chunk_end - sizeof(sctp_paramhdr_t)) {
3062
length = ntohs(param.p->length);
3063
*errp = param.p;
3064
3065
if (param.v > chunk_end - length ||
3066
length < sizeof(sctp_paramhdr_t))
3067
return 0;
3068
3069
switch (param.p->type) {
3070
case SCTP_PARAM_ADD_IP:
3071
case SCTP_PARAM_DEL_IP:
3072
case SCTP_PARAM_SET_PRIMARY:
3073
asconf_param = (sctp_addip_param_t *)param.v;
3074
plen = ntohs(asconf_param->param_hdr.length);
3075
if (plen < sizeof(sctp_addip_param_t) +
3076
sizeof(sctp_paramhdr_t))
3077
return 0;
3078
break;
3079
case SCTP_PARAM_SUCCESS_REPORT:
3080
case SCTP_PARAM_ADAPTATION_LAYER_IND:
3081
if (length != sizeof(sctp_addip_param_t))
3082
return 0;
3083
3084
break;
3085
default:
3086
break;
3087
}
3088
3089
param.v += WORD_ROUND(length);
3090
}
3091
3092
if (param.v != chunk_end)
3093
return 0;
3094
3095
return 1;
3096
}
3097
3098
/* Process an incoming ASCONF chunk with the next expected serial no. and
3099
* return an ASCONF_ACK chunk to be sent in response.
3100
*/
3101
struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
3102
struct sctp_chunk *asconf)
3103
{
3104
sctp_addiphdr_t *hdr;
3105
union sctp_addr_param *addr_param;
3106
sctp_addip_param_t *asconf_param;
3107
struct sctp_chunk *asconf_ack;
3108
3109
__be16 err_code;
3110
int length = 0;
3111
int chunk_len;
3112
__u32 serial;
3113
int all_param_pass = 1;
3114
3115
chunk_len = ntohs(asconf->chunk_hdr->length) - sizeof(sctp_chunkhdr_t);
3116
hdr = (sctp_addiphdr_t *)asconf->skb->data;
3117
serial = ntohl(hdr->serial);
3118
3119
/* Skip the addiphdr and store a pointer to address parameter. */
3120
length = sizeof(sctp_addiphdr_t);
3121
addr_param = (union sctp_addr_param *)(asconf->skb->data + length);
3122
chunk_len -= length;
3123
3124
/* Skip the address parameter and store a pointer to the first
3125
* asconf parameter.
3126
*/
3127
length = ntohs(addr_param->p.length);
3128
asconf_param = (sctp_addip_param_t *)((void *)addr_param + length);
3129
chunk_len -= length;
3130
3131
/* create an ASCONF_ACK chunk.
3132
* Based on the definitions of parameters, we know that the size of
3133
* ASCONF_ACK parameters are less than or equal to the fourfold of ASCONF
3134
* parameters.
3135
*/
3136
asconf_ack = sctp_make_asconf_ack(asoc, serial, chunk_len * 4);
3137
if (!asconf_ack)
3138
goto done;
3139
3140
/* Process the TLVs contained within the ASCONF chunk. */
3141
while (chunk_len > 0) {
3142
err_code = sctp_process_asconf_param(asoc, asconf,
3143
asconf_param);
3144
/* ADDIP 4.1 A7)
3145
* If an error response is received for a TLV parameter,
3146
* all TLVs with no response before the failed TLV are
3147
* considered successful if not reported. All TLVs after
3148
* the failed response are considered unsuccessful unless
3149
* a specific success indication is present for the parameter.
3150
*/
3151
if (SCTP_ERROR_NO_ERROR != err_code)
3152
all_param_pass = 0;
3153
3154
if (!all_param_pass)
3155
sctp_add_asconf_response(asconf_ack,
3156
asconf_param->crr_id, err_code,
3157
asconf_param);
3158
3159
/* ADDIP 4.3 D11) When an endpoint receiving an ASCONF to add
3160
* an IP address sends an 'Out of Resource' in its response, it
3161
* MUST also fail any subsequent add or delete requests bundled
3162
* in the ASCONF.
3163
*/
3164
if (SCTP_ERROR_RSRC_LOW == err_code)
3165
goto done;
3166
3167
/* Move to the next ASCONF param. */
3168
length = ntohs(asconf_param->param_hdr.length);
3169
asconf_param = (sctp_addip_param_t *)((void *)asconf_param +
3170
length);
3171
chunk_len -= length;
3172
}
3173
3174
done:
3175
asoc->peer.addip_serial++;
3176
3177
/* If we are sending a new ASCONF_ACK hold a reference to it in assoc
3178
* after freeing the reference to old asconf ack if any.
3179
*/
3180
if (asconf_ack) {
3181
sctp_chunk_hold(asconf_ack);
3182
list_add_tail(&asconf_ack->transmitted_list,
3183
&asoc->asconf_ack_list);
3184
}
3185
3186
return asconf_ack;
3187
}
3188
3189
/* Process a asconf parameter that is successfully acked. */
3190
static void sctp_asconf_param_success(struct sctp_association *asoc,
3191
sctp_addip_param_t *asconf_param)
3192
{
3193
struct sctp_af *af;
3194
union sctp_addr addr;
3195
struct sctp_bind_addr *bp = &asoc->base.bind_addr;
3196
union sctp_addr_param *addr_param;
3197
struct sctp_transport *transport;
3198
struct sctp_sockaddr_entry *saddr;
3199
3200
addr_param = (union sctp_addr_param *)
3201
((void *)asconf_param + sizeof(sctp_addip_param_t));
3202
3203
/* We have checked the packet before, so we do not check again. */
3204
af = sctp_get_af_specific(param_type2af(addr_param->p.type));
3205
af->from_addr_param(&addr, addr_param, htons(bp->port), 0);
3206
3207
switch (asconf_param->param_hdr.type) {
3208
case SCTP_PARAM_ADD_IP:
3209
/* This is always done in BH context with a socket lock
3210
* held, so the list can not change.
3211
*/
3212
local_bh_disable();
3213
list_for_each_entry(saddr, &bp->address_list, list) {
3214
if (sctp_cmp_addr_exact(&saddr->a, &addr))
3215
saddr->state = SCTP_ADDR_SRC;
3216
}
3217
local_bh_enable();
3218
list_for_each_entry(transport, &asoc->peer.transport_addr_list,
3219
transports) {
3220
dst_release(transport->dst);
3221
transport->dst = NULL;
3222
}
3223
break;
3224
case SCTP_PARAM_DEL_IP:
3225
local_bh_disable();
3226
sctp_del_bind_addr(bp, &addr);
3227
local_bh_enable();
3228
list_for_each_entry(transport, &asoc->peer.transport_addr_list,
3229
transports) {
3230
dst_release(transport->dst);
3231
transport->dst = NULL;
3232
}
3233
break;
3234
default:
3235
break;
3236
}
3237
}
3238
3239
/* Get the corresponding ASCONF response error code from the ASCONF_ACK chunk
3240
* for the given asconf parameter. If there is no response for this parameter,
3241
* return the error code based on the third argument 'no_err'.
3242
* ADDIP 4.1
3243
* A7) If an error response is received for a TLV parameter, all TLVs with no
3244
* response before the failed TLV are considered successful if not reported.
3245
* All TLVs after the failed response are considered unsuccessful unless a
3246
* specific success indication is present for the parameter.
3247
*/
3248
static __be16 sctp_get_asconf_response(struct sctp_chunk *asconf_ack,
3249
sctp_addip_param_t *asconf_param,
3250
int no_err)
3251
{
3252
sctp_addip_param_t *asconf_ack_param;
3253
sctp_errhdr_t *err_param;
3254
int length;
3255
int asconf_ack_len;
3256
__be16 err_code;
3257
3258
if (no_err)
3259
err_code = SCTP_ERROR_NO_ERROR;
3260
else
3261
err_code = SCTP_ERROR_REQ_REFUSED;
3262
3263
asconf_ack_len = ntohs(asconf_ack->chunk_hdr->length) -
3264
sizeof(sctp_chunkhdr_t);
3265
3266
/* Skip the addiphdr from the asconf_ack chunk and store a pointer to
3267
* the first asconf_ack parameter.
3268
*/
3269
length = sizeof(sctp_addiphdr_t);
3270
asconf_ack_param = (sctp_addip_param_t *)(asconf_ack->skb->data +
3271
length);
3272
asconf_ack_len -= length;
3273
3274
while (asconf_ack_len > 0) {
3275
if (asconf_ack_param->crr_id == asconf_param->crr_id) {
3276
switch(asconf_ack_param->param_hdr.type) {
3277
case SCTP_PARAM_SUCCESS_REPORT:
3278
return SCTP_ERROR_NO_ERROR;
3279
case SCTP_PARAM_ERR_CAUSE:
3280
length = sizeof(sctp_addip_param_t);
3281
err_param = (sctp_errhdr_t *)
3282
((void *)asconf_ack_param + length);
3283
asconf_ack_len -= length;
3284
if (asconf_ack_len > 0)
3285
return err_param->cause;
3286
else
3287
return SCTP_ERROR_INV_PARAM;
3288
break;
3289
default:
3290
return SCTP_ERROR_INV_PARAM;
3291
}
3292
}
3293
3294
length = ntohs(asconf_ack_param->param_hdr.length);
3295
asconf_ack_param = (sctp_addip_param_t *)
3296
((void *)asconf_ack_param + length);
3297
asconf_ack_len -= length;
3298
}
3299
3300
return err_code;
3301
}
3302
3303
/* Process an incoming ASCONF_ACK chunk against the cached last ASCONF chunk. */
3304
int sctp_process_asconf_ack(struct sctp_association *asoc,
3305
struct sctp_chunk *asconf_ack)
3306
{
3307
struct sctp_chunk *asconf = asoc->addip_last_asconf;
3308
union sctp_addr_param *addr_param;
3309
sctp_addip_param_t *asconf_param;
3310
int length = 0;
3311
int asconf_len = asconf->skb->len;
3312
int all_param_pass = 0;
3313
int no_err = 1;
3314
int retval = 0;
3315
__be16 err_code = SCTP_ERROR_NO_ERROR;
3316
3317
/* Skip the chunkhdr and addiphdr from the last asconf sent and store
3318
* a pointer to address parameter.
3319
*/
3320
length = sizeof(sctp_addip_chunk_t);
3321
addr_param = (union sctp_addr_param *)(asconf->skb->data + length);
3322
asconf_len -= length;
3323
3324
/* Skip the address parameter in the last asconf sent and store a
3325
* pointer to the first asconf parameter.
3326
*/
3327
length = ntohs(addr_param->p.length);
3328
asconf_param = (sctp_addip_param_t *)((void *)addr_param + length);
3329
asconf_len -= length;
3330
3331
/* ADDIP 4.1
3332
* A8) If there is no response(s) to specific TLV parameter(s), and no
3333
* failures are indicated, then all request(s) are considered
3334
* successful.
3335
*/
3336
if (asconf_ack->skb->len == sizeof(sctp_addiphdr_t))
3337
all_param_pass = 1;
3338
3339
/* Process the TLVs contained in the last sent ASCONF chunk. */
3340
while (asconf_len > 0) {
3341
if (all_param_pass)
3342
err_code = SCTP_ERROR_NO_ERROR;
3343
else {
3344
err_code = sctp_get_asconf_response(asconf_ack,
3345
asconf_param,
3346
no_err);
3347
if (no_err && (SCTP_ERROR_NO_ERROR != err_code))
3348
no_err = 0;
3349
}
3350
3351
switch (err_code) {
3352
case SCTP_ERROR_NO_ERROR:
3353
sctp_asconf_param_success(asoc, asconf_param);
3354
break;
3355
3356
case SCTP_ERROR_RSRC_LOW:
3357
retval = 1;
3358
break;
3359
3360
case SCTP_ERROR_UNKNOWN_PARAM:
3361
/* Disable sending this type of asconf parameter in
3362
* future.
3363
*/
3364
asoc->peer.addip_disabled_mask |=
3365
asconf_param->param_hdr.type;
3366
break;
3367
3368
case SCTP_ERROR_REQ_REFUSED:
3369
case SCTP_ERROR_DEL_LAST_IP:
3370
case SCTP_ERROR_DEL_SRC_IP:
3371
default:
3372
break;
3373
}
3374
3375
/* Skip the processed asconf parameter and move to the next
3376
* one.
3377
*/
3378
length = ntohs(asconf_param->param_hdr.length);
3379
asconf_param = (sctp_addip_param_t *)((void *)asconf_param +
3380
length);
3381
asconf_len -= length;
3382
}
3383
3384
/* Free the cached last sent asconf chunk. */
3385
list_del_init(&asconf->transmitted_list);
3386
sctp_chunk_free(asconf);
3387
asoc->addip_last_asconf = NULL;
3388
3389
return retval;
3390
}
3391
3392
/* Make a FWD TSN chunk. */
3393
struct sctp_chunk *sctp_make_fwdtsn(const struct sctp_association *asoc,
3394
__u32 new_cum_tsn, size_t nstreams,
3395
struct sctp_fwdtsn_skip *skiplist)
3396
{
3397
struct sctp_chunk *retval = NULL;
3398
struct sctp_fwdtsn_hdr ftsn_hdr;
3399
struct sctp_fwdtsn_skip skip;
3400
size_t hint;
3401
int i;
3402
3403
hint = (nstreams + 1) * sizeof(__u32);
3404
3405
retval = sctp_make_chunk(asoc, SCTP_CID_FWD_TSN, 0, hint);
3406
3407
if (!retval)
3408
return NULL;
3409
3410
ftsn_hdr.new_cum_tsn = htonl(new_cum_tsn);
3411
retval->subh.fwdtsn_hdr =
3412
sctp_addto_chunk(retval, sizeof(ftsn_hdr), &ftsn_hdr);
3413
3414
for (i = 0; i < nstreams; i++) {
3415
skip.stream = skiplist[i].stream;
3416
skip.ssn = skiplist[i].ssn;
3417
sctp_addto_chunk(retval, sizeof(skip), &skip);
3418
}
3419
3420
return retval;
3421
}
3422
3423