diff options
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/associola.c | 10 | ||||
-rw-r--r-- | net/sctp/bind_addr.c | 12 | ||||
-rw-r--r-- | net/sctp/crc32c.c | 38 | ||||
-rw-r--r-- | net/sctp/debug.c | 32 | ||||
-rw-r--r-- | net/sctp/endpointola.c | 2 | ||||
-rw-r--r-- | net/sctp/input.c | 16 | ||||
-rw-r--r-- | net/sctp/inqueue.c | 34 | ||||
-rw-r--r-- | net/sctp/ipv6.c | 2 | ||||
-rw-r--r-- | net/sctp/objcnt.c | 34 | ||||
-rw-r--r-- | net/sctp/output.c | 12 | ||||
-rw-r--r-- | net/sctp/outqueue.c | 30 | ||||
-rw-r--r-- | net/sctp/primitive.c | 4 | ||||
-rw-r--r-- | net/sctp/proc.c | 4 | ||||
-rw-r--r-- | net/sctp/protocol.c | 24 | ||||
-rw-r--r-- | net/sctp/sm_make_chunk.c | 88 | ||||
-rw-r--r-- | net/sctp/sm_sideeffect.c | 68 | ||||
-rw-r--r-- | net/sctp/sm_statefuns.c | 110 | ||||
-rw-r--r-- | net/sctp/sm_statetable.c | 2 | ||||
-rw-r--r-- | net/sctp/socket.c | 114 | ||||
-rw-r--r-- | net/sctp/transport.c | 14 | ||||
-rw-r--r-- | net/sctp/tsnmap.c | 2 | ||||
-rw-r--r-- | net/sctp/ulpevent.c | 22 | ||||
-rw-r--r-- | net/sctp/ulpqueue.c | 60 |
23 files changed, 367 insertions, 367 deletions
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 5db95caed0a3..fca6f75b0a0d 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -158,14 +158,14 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a | |||
158 | * If the 'T5-shutdown-guard' timer is used, it SHOULD be set to the | 158 | * If the 'T5-shutdown-guard' timer is used, it SHOULD be set to the |
159 | * recommended value of 5 times 'RTO.Max'. | 159 | * recommended value of 5 times 'RTO.Max'. |
160 | */ | 160 | */ |
161 | asoc->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD] | 161 | asoc->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD] |
162 | = 5 * asoc->rto_max; | 162 | = 5 * asoc->rto_max; |
163 | 163 | ||
164 | asoc->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0; | 164 | asoc->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0; |
165 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = asoc->sackdelay; | 165 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = asoc->sackdelay; |
166 | asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = | 166 | asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = |
167 | sp->autoclose * HZ; | 167 | sp->autoclose * HZ; |
168 | 168 | ||
169 | /* Initilizes the timers */ | 169 | /* Initilizes the timers */ |
170 | for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) { | 170 | for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) { |
171 | init_timer(&asoc->timers[i]); | 171 | init_timer(&asoc->timers[i]); |
@@ -1334,8 +1334,8 @@ int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *asoc, | |||
1334 | asoc->ep->base.bind_addr.port, gfp); | 1334 | asoc->ep->base.bind_addr.port, gfp); |
1335 | } | 1335 | } |
1336 | 1336 | ||
1337 | /* Lookup laddr in the bind address list of an association. */ | 1337 | /* Lookup laddr in the bind address list of an association. */ |
1338 | int sctp_assoc_lookup_laddr(struct sctp_association *asoc, | 1338 | int sctp_assoc_lookup_laddr(struct sctp_association *asoc, |
1339 | const union sctp_addr *laddr) | 1339 | const union sctp_addr *laddr) |
1340 | { | 1340 | { |
1341 | int found; | 1341 | int found; |
@@ -1343,7 +1343,7 @@ int sctp_assoc_lookup_laddr(struct sctp_association *asoc, | |||
1343 | sctp_read_lock(&asoc->base.addr_lock); | 1343 | sctp_read_lock(&asoc->base.addr_lock); |
1344 | if ((asoc->base.bind_addr.port == ntohs(laddr->v4.sin_port)) && | 1344 | if ((asoc->base.bind_addr.port == ntohs(laddr->v4.sin_port)) && |
1345 | sctp_bind_addr_match(&asoc->base.bind_addr, laddr, | 1345 | sctp_bind_addr_match(&asoc->base.bind_addr, laddr, |
1346 | sctp_sk(asoc->base.sk))) { | 1346 | sctp_sk(asoc->base.sk))) { |
1347 | found = 1; | 1347 | found = 1; |
1348 | goto out; | 1348 | goto out; |
1349 | } | 1349 | } |
diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index 00994158e496..80294cbc0de6 100644 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c | |||
@@ -62,7 +62,7 @@ static void sctp_bind_addr_clean(struct sctp_bind_addr *); | |||
62 | /* Copy 'src' to 'dest' taking 'scope' into account. Omit addresses | 62 | /* Copy 'src' to 'dest' taking 'scope' into account. Omit addresses |
63 | * in 'src' which have a broader scope than 'scope'. | 63 | * in 'src' which have a broader scope than 'scope'. |
64 | */ | 64 | */ |
65 | int sctp_bind_addr_copy(struct sctp_bind_addr *dest, | 65 | int sctp_bind_addr_copy(struct sctp_bind_addr *dest, |
66 | const struct sctp_bind_addr *src, | 66 | const struct sctp_bind_addr *src, |
67 | sctp_scope_t scope, gfp_t gfp, | 67 | sctp_scope_t scope, gfp_t gfp, |
68 | int flags) | 68 | int flags) |
@@ -296,7 +296,7 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list, | |||
296 | ********************************************************************/ | 296 | ********************************************************************/ |
297 | 297 | ||
298 | /* Does this contain a specified address? Allow wildcarding. */ | 298 | /* Does this contain a specified address? Allow wildcarding. */ |
299 | int sctp_bind_addr_match(struct sctp_bind_addr *bp, | 299 | int sctp_bind_addr_match(struct sctp_bind_addr *bp, |
300 | const union sctp_addr *addr, | 300 | const union sctp_addr *addr, |
301 | struct sctp_sock *opt) | 301 | struct sctp_sock *opt) |
302 | { | 302 | { |
@@ -306,7 +306,7 @@ int sctp_bind_addr_match(struct sctp_bind_addr *bp, | |||
306 | list_for_each(pos, &bp->address_list) { | 306 | list_for_each(pos, &bp->address_list) { |
307 | laddr = list_entry(pos, struct sctp_sockaddr_entry, list); | 307 | laddr = list_entry(pos, struct sctp_sockaddr_entry, list); |
308 | if (opt->pf->cmp_addr(&laddr->a, addr, opt)) | 308 | if (opt->pf->cmp_addr(&laddr->a, addr, opt)) |
309 | return 1; | 309 | return 1; |
310 | } | 310 | } |
311 | 311 | ||
312 | return 0; | 312 | return 0; |
@@ -329,12 +329,12 @@ union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr *bp, | |||
329 | 329 | ||
330 | list_for_each(pos, &bp->address_list) { | 330 | list_for_each(pos, &bp->address_list) { |
331 | laddr = list_entry(pos, struct sctp_sockaddr_entry, list); | 331 | laddr = list_entry(pos, struct sctp_sockaddr_entry, list); |
332 | 332 | ||
333 | addr_buf = (union sctp_addr *)addrs; | 333 | addr_buf = (union sctp_addr *)addrs; |
334 | for (i = 0; i < addrcnt; i++) { | 334 | for (i = 0; i < addrcnt; i++) { |
335 | addr = (union sctp_addr *)addr_buf; | 335 | addr = (union sctp_addr *)addr_buf; |
336 | af = sctp_get_af_specific(addr->v4.sin_family); | 336 | af = sctp_get_af_specific(addr->v4.sin_family); |
337 | if (!af) | 337 | if (!af) |
338 | return NULL; | 338 | return NULL; |
339 | 339 | ||
340 | if (opt->pf->cmp_addr(&laddr->a, addr, opt)) | 340 | if (opt->pf->cmp_addr(&laddr->a, addr, opt)) |
@@ -350,7 +350,7 @@ union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr *bp, | |||
350 | } | 350 | } |
351 | 351 | ||
352 | /* Copy out addresses from the global local address list. */ | 352 | /* Copy out addresses from the global local address list. */ |
353 | static int sctp_copy_one_addr(struct sctp_bind_addr *dest, | 353 | static int sctp_copy_one_addr(struct sctp_bind_addr *dest, |
354 | union sctp_addr *addr, | 354 | union sctp_addr *addr, |
355 | sctp_scope_t scope, gfp_t gfp, | 355 | sctp_scope_t scope, gfp_t gfp, |
356 | int flags) | 356 | int flags) |
diff --git a/net/sctp/crc32c.c b/net/sctp/crc32c.c index 31f05ec8e1d3..59cf7b06d216 100644 --- a/net/sctp/crc32c.c +++ b/net/sctp/crc32c.c | |||
@@ -1,40 +1,40 @@ | |||
1 | /* SCTP kernel reference Implementation | 1 | /* SCTP kernel reference Implementation |
2 | * Copyright (c) 1999-2001 Motorola, Inc. | 2 | * Copyright (c) 1999-2001 Motorola, Inc. |
3 | * Copyright (c) 2001-2003 International Business Machines, Corp. | 3 | * Copyright (c) 2001-2003 International Business Machines, Corp. |
4 | * | 4 | * |
5 | * This file is part of the SCTP kernel reference Implementation | 5 | * This file is part of the SCTP kernel reference Implementation |
6 | * | 6 | * |
7 | * SCTP Checksum functions | 7 | * SCTP Checksum functions |
8 | * | 8 | * |
9 | * The SCTP reference implementation is free software; | 9 | * The SCTP reference implementation is free software; |
10 | * you can redistribute it and/or modify it under the terms of | 10 | * you can redistribute it and/or modify it under the terms of |
11 | * the GNU General Public License as published by | 11 | * the GNU General Public License as published by |
12 | * the Free Software Foundation; either version 2, or (at your option) | 12 | * the Free Software Foundation; either version 2, or (at your option) |
13 | * any later version. | 13 | * any later version. |
14 | * | 14 | * |
15 | * The SCTP reference implementation is distributed in the hope that it | 15 | * The SCTP reference implementation is distributed in the hope that it |
16 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied | 16 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied |
17 | * ************************ | 17 | * ************************ |
18 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 18 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
19 | * See the GNU General Public License for more details. | 19 | * See the GNU General Public License for more details. |
20 | * | 20 | * |
21 | * You should have received a copy of the GNU General Public License | 21 | * You should have received a copy of the GNU General Public License |
22 | * along with GNU CC; see the file COPYING. If not, write to | 22 | * along with GNU CC; see the file COPYING. If not, write to |
23 | * the Free Software Foundation, 59 Temple Place - Suite 330, | 23 | * the Free Software Foundation, 59 Temple Place - Suite 330, |
24 | * Boston, MA 02111-1307, USA. | 24 | * Boston, MA 02111-1307, USA. |
25 | * | 25 | * |
26 | * Please send any bug reports or fixes you make to the | 26 | * Please send any bug reports or fixes you make to the |
27 | * email address(es): | 27 | * email address(es): |
28 | * lksctp developers <lksctp-developers@lists.sourceforge.net> | 28 | * lksctp developers <lksctp-developers@lists.sourceforge.net> |
29 | * | 29 | * |
30 | * Or submit a bug report through the following website: | 30 | * Or submit a bug report through the following website: |
31 | * http://www.sf.net/projects/lksctp | 31 | * http://www.sf.net/projects/lksctp |
32 | * | 32 | * |
33 | * Written or modified by: | 33 | * Written or modified by: |
34 | * Dinakaran Joseph | 34 | * Dinakaran Joseph |
35 | * Jon Grimm <jgrimm@us.ibm.com> | 35 | * Jon Grimm <jgrimm@us.ibm.com> |
36 | * Sridhar Samudrala <sri@us.ibm.com> | 36 | * Sridhar Samudrala <sri@us.ibm.com> |
37 | * | 37 | * |
38 | * Any bugs reported given to us we will try to fix... any fixes shared will | 38 | * Any bugs reported given to us we will try to fix... any fixes shared will |
39 | * be incorporated into the next SCTP release. | 39 | * be incorporated into the next SCTP release. |
40 | */ | 40 | */ |
@@ -135,10 +135,10 @@ static const __u32 crc_c[256] = { | |||
135 | 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E, | 135 | 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E, |
136 | 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351, | 136 | 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351, |
137 | }; | 137 | }; |
138 | 138 | ||
139 | __u32 sctp_start_cksum(__u8 *buffer, __u16 length) | 139 | __u32 sctp_start_cksum(__u8 *buffer, __u16 length) |
140 | { | 140 | { |
141 | __u32 crc32 = ~(__u32) 0; | 141 | __u32 crc32 = ~(__u32) 0; |
142 | __u32 i; | 142 | __u32 i; |
143 | 143 | ||
144 | /* Optimize this routine to be SCTP specific, knowing how | 144 | /* Optimize this routine to be SCTP specific, knowing how |
@@ -147,7 +147,7 @@ __u32 sctp_start_cksum(__u8 *buffer, __u16 length) | |||
147 | 147 | ||
148 | /* Calculate CRC up to the checksum. */ | 148 | /* Calculate CRC up to the checksum. */ |
149 | for (i = 0; i < (sizeof(struct sctphdr) - sizeof(__u32)); i++) | 149 | for (i = 0; i < (sizeof(struct sctphdr) - sizeof(__u32)); i++) |
150 | CRC32C(crc32, buffer[i]); | 150 | CRC32C(crc32, buffer[i]); |
151 | 151 | ||
152 | /* Skip checksum field of the header. */ | 152 | /* Skip checksum field of the header. */ |
153 | for (i = 0; i < sizeof(__u32); i++) | 153 | for (i = 0; i < sizeof(__u32); i++) |
@@ -175,13 +175,13 @@ __u32 sctp_update_copy_cksum(__u8 *to, __u8 *from, __u16 length, __u32 crc32) | |||
175 | __u32 i; | 175 | __u32 i; |
176 | __u32 *_to = (__u32 *)to; | 176 | __u32 *_to = (__u32 *)to; |
177 | __u32 *_from = (__u32 *)from; | 177 | __u32 *_from = (__u32 *)from; |
178 | 178 | ||
179 | for (i = 0; i < (length/4); i++) { | 179 | for (i = 0; i < (length/4); i++) { |
180 | _to[i] = _from[i]; | 180 | _to[i] = _from[i]; |
181 | CRC32C(crc32, from[i*4]); | 181 | CRC32C(crc32, from[i*4]); |
182 | CRC32C(crc32, from[i*4+1]); | 182 | CRC32C(crc32, from[i*4+1]); |
183 | CRC32C(crc32, from[i*4+2]); | 183 | CRC32C(crc32, from[i*4+2]); |
184 | CRC32C(crc32, from[i*4+3]); | 184 | CRC32C(crc32, from[i*4+3]); |
185 | } | 185 | } |
186 | 186 | ||
187 | return crc32; | 187 | return crc32; |
diff --git a/net/sctp/debug.c b/net/sctp/debug.c index aa8340373af7..5f5ab28977c9 100644 --- a/net/sctp/debug.c +++ b/net/sctp/debug.c | |||
@@ -3,48 +3,48 @@ | |||
3 | * Copyright (c) 1999-2000 Cisco, Inc. | 3 | * Copyright (c) 1999-2000 Cisco, Inc. |
4 | * Copyright (c) 1999-2001 Motorola, Inc. | 4 | * Copyright (c) 1999-2001 Motorola, Inc. |
5 | * Copyright (c) 2001 Intel Corp. | 5 | * Copyright (c) 2001 Intel Corp. |
6 | * | 6 | * |
7 | * This file is part of the SCTP kernel reference Implementation | 7 | * This file is part of the SCTP kernel reference Implementation |
8 | * | 8 | * |
9 | * This file is part of the implementation of the add-IP extension, | 9 | * This file is part of the implementation of the add-IP extension, |
10 | * based on <draft-ietf-tsvwg-addip-sctp-02.txt> June 29, 2001, | 10 | * based on <draft-ietf-tsvwg-addip-sctp-02.txt> June 29, 2001, |
11 | * for the SCTP kernel reference Implementation. | 11 | * for the SCTP kernel reference Implementation. |
12 | * | 12 | * |
13 | * This file converts numerical ID value to alphabetical names for SCTP | 13 | * This file converts numerical ID value to alphabetical names for SCTP |
14 | * terms such as chunk type, parameter time, event type, etc. | 14 | * terms such as chunk type, parameter time, event type, etc. |
15 | * | 15 | * |
16 | * The SCTP reference implementation is free software; | 16 | * The SCTP reference implementation is free software; |
17 | * you can redistribute it and/or modify it under the terms of | 17 | * you can redistribute it and/or modify it under the terms of |
18 | * the GNU General Public License as published by | 18 | * the GNU General Public License as published by |
19 | * the Free Software Foundation; either version 2, or (at your option) | 19 | * the Free Software Foundation; either version 2, or (at your option) |
20 | * any later version. | 20 | * any later version. |
21 | * | 21 | * |
22 | * The SCTP reference implementation is distributed in the hope that it | 22 | * The SCTP reference implementation is distributed in the hope that it |
23 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied | 23 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied |
24 | * ************************ | 24 | * ************************ |
25 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 25 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
26 | * See the GNU General Public License for more details. | 26 | * See the GNU General Public License for more details. |
27 | * | 27 | * |
28 | * You should have received a copy of the GNU General Public License | 28 | * You should have received a copy of the GNU General Public License |
29 | * along with GNU CC; see the file COPYING. If not, write to | 29 | * along with GNU CC; see the file COPYING. If not, write to |
30 | * the Free Software Foundation, 59 Temple Place - Suite 330, | 30 | * the Free Software Foundation, 59 Temple Place - Suite 330, |
31 | * Boston, MA 02111-1307, USA. | 31 | * Boston, MA 02111-1307, USA. |
32 | * | 32 | * |
33 | * Please send any bug reports or fixes you make to the | 33 | * Please send any bug reports or fixes you make to the |
34 | * email address(es): | 34 | * email address(es): |
35 | * lksctp developers <lksctp-developers@lists.sourceforge.net> | 35 | * lksctp developers <lksctp-developers@lists.sourceforge.net> |
36 | * | 36 | * |
37 | * Or submit a bug report through the following website: | 37 | * Or submit a bug report through the following website: |
38 | * http://www.sf.net/projects/lksctp | 38 | * http://www.sf.net/projects/lksctp |
39 | * | 39 | * |
40 | * Written or modified by: | 40 | * Written or modified by: |
41 | * La Monte H.P. Yarroll <piggy@acm.org> | 41 | * La Monte H.P. Yarroll <piggy@acm.org> |
42 | * Karl Knutson <karl@athena.chicago.il.us> | 42 | * Karl Knutson <karl@athena.chicago.il.us> |
43 | * Xingang Guo <xingang.guo@intel.com> | 43 | * Xingang Guo <xingang.guo@intel.com> |
44 | * Jon Grimm <jgrimm@us.ibm.com> | 44 | * Jon Grimm <jgrimm@us.ibm.com> |
45 | * Daisy Chang <daisyc@us.ibm.com> | 45 | * Daisy Chang <daisyc@us.ibm.com> |
46 | * Sridhar Samudrala <sri@us.ibm.com> | 46 | * Sridhar Samudrala <sri@us.ibm.com> |
47 | * | 47 | * |
48 | * Any bugs reported given to us we will try to fix... any fixes shared will | 48 | * Any bugs reported given to us we will try to fix... any fixes shared will |
49 | * be incorporated into the next SCTP release. | 49 | * be incorporated into the next SCTP release. |
50 | */ | 50 | */ |
@@ -81,7 +81,7 @@ const char *sctp_cname(const sctp_subtype_t cid) | |||
81 | return "illegal chunk id"; | 81 | return "illegal chunk id"; |
82 | if (cid.chunk <= SCTP_CID_BASE_MAX) | 82 | if (cid.chunk <= SCTP_CID_BASE_MAX) |
83 | return sctp_cid_tbl[cid.chunk]; | 83 | return sctp_cid_tbl[cid.chunk]; |
84 | 84 | ||
85 | switch (cid.chunk) { | 85 | switch (cid.chunk) { |
86 | case SCTP_CID_ASCONF: | 86 | case SCTP_CID_ASCONF: |
87 | return "ASCONF"; | 87 | return "ASCONF"; |
@@ -154,7 +154,7 @@ const char *sctp_pname(const sctp_subtype_t id) | |||
154 | 154 | ||
155 | static const char *sctp_other_tbl[] = { | 155 | static const char *sctp_other_tbl[] = { |
156 | "NO_PENDING_TSN", | 156 | "NO_PENDING_TSN", |
157 | "ICMP_PROTO_UNREACH", | 157 | "ICMP_PROTO_UNREACH", |
158 | }; | 158 | }; |
159 | 159 | ||
160 | /* Lookup "other" debug name. */ | 160 | /* Lookup "other" debug name. */ |
diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index 129756908da4..286a8dbb63b7 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c | |||
@@ -369,7 +369,7 @@ static void sctp_endpoint_bh_rcv(struct work_struct *work) | |||
369 | chunk->transport->last_time_heard = jiffies; | 369 | chunk->transport->last_time_heard = jiffies; |
370 | 370 | ||
371 | error = sctp_do_sm(SCTP_EVENT_T_CHUNK, subtype, state, | 371 | error = sctp_do_sm(SCTP_EVENT_T_CHUNK, subtype, state, |
372 | ep, asoc, chunk, GFP_ATOMIC); | 372 | ep, asoc, chunk, GFP_ATOMIC); |
373 | 373 | ||
374 | if (error && chunk) | 374 | if (error && chunk) |
375 | chunk->pdiscard = 1; | 375 | chunk->pdiscard = 1; |
diff --git a/net/sctp/input.c b/net/sctp/input.c index 33111873a488..71db66873695 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c | |||
@@ -226,7 +226,7 @@ int sctp_rcv(struct sk_buff *skb) | |||
226 | nf_reset(skb); | 226 | nf_reset(skb); |
227 | 227 | ||
228 | if (sk_filter(sk, skb)) | 228 | if (sk_filter(sk, skb)) |
229 | goto discard_release; | 229 | goto discard_release; |
230 | 230 | ||
231 | /* Create an SCTP packet structure. */ | 231 | /* Create an SCTP packet structure. */ |
232 | chunk = sctp_chunkify(skb, asoc, sk); | 232 | chunk = sctp_chunkify(skb, asoc, sk); |
@@ -293,11 +293,11 @@ discard_release: | |||
293 | int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb) | 293 | int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb) |
294 | { | 294 | { |
295 | struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk; | 295 | struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk; |
296 | struct sctp_inq *inqueue = &chunk->rcvr->inqueue; | 296 | struct sctp_inq *inqueue = &chunk->rcvr->inqueue; |
297 | struct sctp_ep_common *rcvr = NULL; | 297 | struct sctp_ep_common *rcvr = NULL; |
298 | int backloged = 0; | 298 | int backloged = 0; |
299 | 299 | ||
300 | rcvr = chunk->rcvr; | 300 | rcvr = chunk->rcvr; |
301 | 301 | ||
302 | /* If the rcvr is dead then the association or endpoint | 302 | /* If the rcvr is dead then the association or endpoint |
303 | * has been deleted and we can safely drop the chunk | 303 | * has been deleted and we can safely drop the chunk |
@@ -347,7 +347,7 @@ done: | |||
347 | else | 347 | else |
348 | BUG(); | 348 | BUG(); |
349 | 349 | ||
350 | return 0; | 350 | return 0; |
351 | } | 351 | } |
352 | 352 | ||
353 | static void sctp_add_backlog(struct sock *sk, struct sk_buff *skb) | 353 | static void sctp_add_backlog(struct sock *sk, struct sk_buff *skb) |
@@ -399,7 +399,7 @@ void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc, | |||
399 | * Normally, if PMTU discovery is disabled, an ICMP Fragmentation | 399 | * Normally, if PMTU discovery is disabled, an ICMP Fragmentation |
400 | * Needed will never be sent, but if a message was sent before | 400 | * Needed will never be sent, but if a message was sent before |
401 | * PMTU discovery was disabled that was larger than the PMTU, it | 401 | * PMTU discovery was disabled that was larger than the PMTU, it |
402 | * would not be fragmented, so it must be re-transmitted fragmented. | 402 | * would not be fragmented, so it must be re-transmitted fragmented. |
403 | */ | 403 | */ |
404 | sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD); | 404 | sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD); |
405 | } | 405 | } |
@@ -416,8 +416,8 @@ void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc, | |||
416 | * | 416 | * |
417 | */ | 417 | */ |
418 | void sctp_icmp_proto_unreachable(struct sock *sk, | 418 | void sctp_icmp_proto_unreachable(struct sock *sk, |
419 | struct sctp_association *asoc, | 419 | struct sctp_association *asoc, |
420 | struct sctp_transport *t) | 420 | struct sctp_transport *t) |
421 | { | 421 | { |
422 | SCTP_DEBUG_PRINTK("%s\n", __FUNCTION__); | 422 | SCTP_DEBUG_PRINTK("%s\n", __FUNCTION__); |
423 | 423 | ||
diff --git a/net/sctp/inqueue.c b/net/sctp/inqueue.c index 71b07466e880..c30629e17781 100644 --- a/net/sctp/inqueue.c +++ b/net/sctp/inqueue.c | |||
@@ -2,43 +2,43 @@ | |||
2 | * Copyright (c) 1999-2000 Cisco, Inc. | 2 | * Copyright (c) 1999-2000 Cisco, Inc. |
3 | * Copyright (c) 1999-2001 Motorola, Inc. | 3 | * Copyright (c) 1999-2001 Motorola, Inc. |
4 | * Copyright (c) 2002 International Business Machines, Corp. | 4 | * Copyright (c) 2002 International Business Machines, Corp. |
5 | * | 5 | * |
6 | * This file is part of the SCTP kernel reference Implementation | 6 | * This file is part of the SCTP kernel reference Implementation |
7 | * | 7 | * |
8 | * These functions are the methods for accessing the SCTP inqueue. | 8 | * These functions are the methods for accessing the SCTP inqueue. |
9 | * | 9 | * |
10 | * An SCTP inqueue is a queue into which you push SCTP packets | 10 | * An SCTP inqueue is a queue into which you push SCTP packets |
11 | * (which might be bundles or fragments of chunks) and out of which you | 11 | * (which might be bundles or fragments of chunks) and out of which you |
12 | * pop SCTP whole chunks. | 12 | * pop SCTP whole chunks. |
13 | * | 13 | * |
14 | * The SCTP reference implementation is free software; | 14 | * The SCTP reference implementation is free software; |
15 | * you can redistribute it and/or modify it under the terms of | 15 | * you can redistribute it and/or modify it under the terms of |
16 | * the GNU General Public License as published by | 16 | * the GNU General Public License as published by |
17 | * the Free Software Foundation; either version 2, or (at your option) | 17 | * the Free Software Foundation; either version 2, or (at your option) |
18 | * any later version. | 18 | * any later version. |
19 | * | 19 | * |
20 | * The SCTP reference implementation is distributed in the hope that it | 20 | * The SCTP reference implementation is distributed in the hope that it |
21 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied | 21 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied |
22 | * ************************ | 22 | * ************************ |
23 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 23 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
24 | * See the GNU General Public License for more details. | 24 | * See the GNU General Public License for more details. |
25 | * | 25 | * |
26 | * You should have received a copy of the GNU General Public License | 26 | * You should have received a copy of the GNU General Public License |
27 | * along with GNU CC; see the file COPYING. If not, write to | 27 | * along with GNU CC; see the file COPYING. If not, write to |
28 | * the Free Software Foundation, 59 Temple Place - Suite 330, | 28 | * the Free Software Foundation, 59 Temple Place - Suite 330, |
29 | * Boston, MA 02111-1307, USA. | 29 | * Boston, MA 02111-1307, USA. |
30 | * | 30 | * |
31 | * Please send any bug reports or fixes you make to the | 31 | * Please send any bug reports or fixes you make to the |
32 | * email address(es): | 32 | * email address(es): |
33 | * lksctp developers <lksctp-developers@lists.sourceforge.net> | 33 | * lksctp developers <lksctp-developers@lists.sourceforge.net> |
34 | * | 34 | * |
35 | * Or submit a bug report through the following website: | 35 | * Or submit a bug report through the following website: |
36 | * http://www.sf.net/projects/lksctp | 36 | * http://www.sf.net/projects/lksctp |
37 | * | 37 | * |
38 | * Written or modified by: | 38 | * Written or modified by: |
39 | * La Monte H.P. Yarroll <piggy@acm.org> | 39 | * La Monte H.P. Yarroll <piggy@acm.org> |
40 | * Karl Knutson <karl@athena.chicago.il.us> | 40 | * Karl Knutson <karl@athena.chicago.il.us> |
41 | * | 41 | * |
42 | * Any bugs reported given to us we will try to fix... any fixes shared will | 42 | * Any bugs reported given to us we will try to fix... any fixes shared will |
43 | * be incorporated into the next SCTP release. | 43 | * be incorporated into the next SCTP release. |
44 | */ | 44 | */ |
@@ -152,8 +152,8 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue) | |||
152 | chunk->data_accepted = 0; | 152 | chunk->data_accepted = 0; |
153 | } | 153 | } |
154 | 154 | ||
155 | chunk->chunk_hdr = ch; | 155 | chunk->chunk_hdr = ch; |
156 | chunk->chunk_end = ((__u8 *)ch) + WORD_ROUND(ntohs(ch->length)); | 156 | chunk->chunk_end = ((__u8 *)ch) + WORD_ROUND(ntohs(ch->length)); |
157 | /* In the unlikely case of an IP reassembly, the skb could be | 157 | /* In the unlikely case of an IP reassembly, the skb could be |
158 | * non-linear. If so, update chunk_end so that it doesn't go past | 158 | * non-linear. If so, update chunk_end so that it doesn't go past |
159 | * the skb->tail. | 159 | * the skb->tail. |
@@ -169,11 +169,11 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue) | |||
169 | /* This is not a singleton */ | 169 | /* This is not a singleton */ |
170 | chunk->singleton = 0; | 170 | chunk->singleton = 0; |
171 | } else if (chunk->chunk_end > chunk->skb->tail) { | 171 | } else if (chunk->chunk_end > chunk->skb->tail) { |
172 | /* RFC 2960, Section 6.10 Bundling | 172 | /* RFC 2960, Section 6.10 Bundling |
173 | * | 173 | * |
174 | * Partial chunks MUST NOT be placed in an SCTP packet. | 174 | * Partial chunks MUST NOT be placed in an SCTP packet. |
175 | * If the receiver detects a partial chunk, it MUST drop | 175 | * If the receiver detects a partial chunk, it MUST drop |
176 | * the chunk. | 176 | * the chunk. |
177 | * | 177 | * |
178 | * Since the end of the chunk is past the end of our buffer | 178 | * Since the end of the chunk is past the end of our buffer |
179 | * (which contains the whole packet, we can freely discard | 179 | * (which contains the whole packet, we can freely discard |
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index ef36be073a13..01b27fb5dfc5 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -236,7 +236,7 @@ static struct dst_entry *sctp_v6_get_dst(struct sctp_association *asoc, | |||
236 | ipv6_addr_copy(&fl.fl6_dst, &daddr->v6.sin6_addr); | 236 | ipv6_addr_copy(&fl.fl6_dst, &daddr->v6.sin6_addr); |
237 | if (ipv6_addr_type(&daddr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL) | 237 | if (ipv6_addr_type(&daddr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL) |
238 | fl.oif = daddr->v6.sin6_scope_id; | 238 | fl.oif = daddr->v6.sin6_scope_id; |
239 | 239 | ||
240 | 240 | ||
241 | SCTP_DEBUG_PRINTK("%s: DST=" NIP6_FMT " ", | 241 | SCTP_DEBUG_PRINTK("%s: DST=" NIP6_FMT " ", |
242 | __FUNCTION__, NIP6(fl.fl6_dst)); | 242 | __FUNCTION__, NIP6(fl.fl6_dst)); |
diff --git a/net/sctp/objcnt.c b/net/sctp/objcnt.c index 8ff588f0d76a..fcfb9d806de1 100644 --- a/net/sctp/objcnt.c +++ b/net/sctp/objcnt.c | |||
@@ -1,39 +1,39 @@ | |||
1 | /* SCTP kernel reference Implementation | 1 | /* SCTP kernel reference Implementation |
2 | * (C) Copyright IBM Corp. 2001, 2004 | 2 | * (C) Copyright IBM Corp. 2001, 2004 |
3 | * | 3 | * |
4 | * This file is part of the SCTP kernel reference Implementation | 4 | * This file is part of the SCTP kernel reference Implementation |
5 | * | 5 | * |
6 | * Support for memory object debugging. This allows one to monitor the | 6 | * Support for memory object debugging. This allows one to monitor the |
7 | * object allocations/deallocations for types instrumented for this | 7 | * object allocations/deallocations for types instrumented for this |
8 | * via the proc fs. | 8 | * via the proc fs. |
9 | * | 9 | * |
10 | * The SCTP reference implementation is free software; | 10 | * The SCTP reference implementation is free software; |
11 | * you can redistribute it and/or modify it under the terms of | 11 | * you can redistribute it and/or modify it under the terms of |
12 | * the GNU General Public License as published by | 12 | * the GNU General Public License as published by |
13 | * the Free Software Foundation; either version 2, or (at your option) | 13 | * the Free Software Foundation; either version 2, or (at your option) |
14 | * any later version. | 14 | * any later version. |
15 | * | 15 | * |
16 | * The SCTP reference implementation is distributed in the hope that it | 16 | * The SCTP reference implementation is distributed in the hope that it |
17 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied | 17 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied |
18 | * ************************ | 18 | * ************************ |
19 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 19 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
20 | * See the GNU General Public License for more details. | 20 | * See the GNU General Public License for more details. |
21 | * | 21 | * |
22 | * You should have received a copy of the GNU General Public License | 22 | * You should have received a copy of the GNU General Public License |
23 | * along with GNU CC; see the file COPYING. If not, write to | 23 | * along with GNU CC; see the file COPYING. If not, write to |
24 | * the Free Software Foundation, 59 Temple Place - Suite 330, | 24 | * the Free Software Foundation, 59 Temple Place - Suite 330, |
25 | * Boston, MA 02111-1307, USA. | 25 | * Boston, MA 02111-1307, USA. |
26 | * | 26 | * |
27 | * Please send any bug reports or fixes you make to the | 27 | * Please send any bug reports or fixes you make to the |
28 | * email address(es): | 28 | * email address(es): |
29 | * lksctp developers <lksctp-developers@lists.sourceforge.net> | 29 | * lksctp developers <lksctp-developers@lists.sourceforge.net> |
30 | * | 30 | * |
31 | * Or submit a bug report through the following website: | 31 | * Or submit a bug report through the following website: |
32 | * http://www.sf.net/projects/lksctp | 32 | * http://www.sf.net/projects/lksctp |
33 | * | 33 | * |
34 | * Written or modified by: | 34 | * Written or modified by: |
35 | * Jon Grimm <jgrimm@us.ibm.com> | 35 | * Jon Grimm <jgrimm@us.ibm.com> |
36 | * | 36 | * |
37 | * Any bugs reported given to us we will try to fix... any fixes shared will | 37 | * Any bugs reported given to us we will try to fix... any fixes shared will |
38 | * be incorporated into the next SCTP release. | 38 | * be incorporated into the next SCTP release. |
39 | */ | 39 | */ |
@@ -121,7 +121,7 @@ done: | |||
121 | if (len > length) | 121 | if (len > length) |
122 | len = length; | 122 | len = length; |
123 | 123 | ||
124 | return len; | 124 | return len; |
125 | } | 125 | } |
126 | 126 | ||
127 | /* Initialize the objcount in the proc filesystem. */ | 127 | /* Initialize the objcount in the proc filesystem. */ |
@@ -131,7 +131,7 @@ void sctp_dbg_objcnt_init(void) | |||
131 | ent = create_proc_read_entry("sctp_dbg_objcnt", 0, proc_net_sctp, | 131 | ent = create_proc_read_entry("sctp_dbg_objcnt", 0, proc_net_sctp, |
132 | sctp_dbg_objcnt_read, NULL); | 132 | sctp_dbg_objcnt_read, NULL); |
133 | if (!ent) | 133 | if (!ent) |
134 | printk(KERN_WARNING | 134 | printk(KERN_WARNING |
135 | "sctp_dbg_objcnt: Unable to create /proc entry.\n"); | 135 | "sctp_dbg_objcnt: Unable to create /proc entry.\n"); |
136 | } | 136 | } |
137 | 137 | ||
diff --git a/net/sctp/output.c b/net/sctp/output.c index 3ef4351dd956..f875fc3ced54 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
@@ -85,8 +85,8 @@ struct sctp_packet *sctp_packet_config(struct sctp_packet *packet, | |||
85 | chunk = sctp_get_ecne_prepend(packet->transport->asoc); | 85 | chunk = sctp_get_ecne_prepend(packet->transport->asoc); |
86 | 86 | ||
87 | /* If there a is a prepend chunk stick it on the list before | 87 | /* If there a is a prepend chunk stick it on the list before |
88 | * any other chunks get appended. | 88 | * any other chunks get appended. |
89 | */ | 89 | */ |
90 | if (chunk) | 90 | if (chunk) |
91 | sctp_packet_append_chunk(packet, chunk); | 91 | sctp_packet_append_chunk(packet, chunk); |
92 | } | 92 | } |
@@ -110,8 +110,8 @@ struct sctp_packet *sctp_packet_init(struct sctp_packet *packet, | |||
110 | packet->destination_port = dport; | 110 | packet->destination_port = dport; |
111 | INIT_LIST_HEAD(&packet->chunk_list); | 111 | INIT_LIST_HEAD(&packet->chunk_list); |
112 | if (asoc) { | 112 | if (asoc) { |
113 | struct sctp_sock *sp = sctp_sk(asoc->base.sk); | 113 | struct sctp_sock *sp = sctp_sk(asoc->base.sk); |
114 | overhead = sp->pf->af->net_header_len; | 114 | overhead = sp->pf->af->net_header_len; |
115 | } else { | 115 | } else { |
116 | overhead = sizeof(struct ipv6hdr); | 116 | overhead = sizeof(struct ipv6hdr); |
117 | } | 117 | } |
@@ -442,7 +442,7 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
442 | * acknowledged or have failed. | 442 | * acknowledged or have failed. |
443 | */ | 443 | */ |
444 | if (!sctp_chunk_is_data(chunk)) | 444 | if (!sctp_chunk_is_data(chunk)) |
445 | sctp_chunk_free(chunk); | 445 | sctp_chunk_free(chunk); |
446 | } | 446 | } |
447 | 447 | ||
448 | /* Perform final transformation on checksum. */ | 448 | /* Perform final transformation on checksum. */ |
@@ -528,7 +528,7 @@ err: | |||
528 | list_for_each_entry_safe(chunk, tmp, &packet->chunk_list, list) { | 528 | list_for_each_entry_safe(chunk, tmp, &packet->chunk_list, list) { |
529 | list_del_init(&chunk->list); | 529 | list_del_init(&chunk->list); |
530 | if (!sctp_chunk_is_data(chunk)) | 530 | if (!sctp_chunk_is_data(chunk)) |
531 | sctp_chunk_free(chunk); | 531 | sctp_chunk_free(chunk); |
532 | } | 532 | } |
533 | goto out; | 533 | goto out; |
534 | nomem: | 534 | nomem: |
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index fba567a7cb64..5c2ddd10db06 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
@@ -376,7 +376,7 @@ static void sctp_insert_list(struct list_head *head, struct list_head *new) | |||
376 | } | 376 | } |
377 | } | 377 | } |
378 | if (!done) | 378 | if (!done) |
379 | list_add_tail(new, head); | 379 | list_add_tail(new, head); |
380 | } | 380 | } |
381 | 381 | ||
382 | /* Mark all the eligible packets on a transport for retransmission. */ | 382 | /* Mark all the eligible packets on a transport for retransmission. */ |
@@ -578,7 +578,7 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt, | |||
578 | break; | 578 | break; |
579 | 579 | ||
580 | case SCTP_XMIT_RWND_FULL: | 580 | case SCTP_XMIT_RWND_FULL: |
581 | /* Send this packet. */ | 581 | /* Send this packet. */ |
582 | if ((error = sctp_packet_transmit(pkt)) == 0) | 582 | if ((error = sctp_packet_transmit(pkt)) == 0) |
583 | *start_timer = 1; | 583 | *start_timer = 1; |
584 | 584 | ||
@@ -590,7 +590,7 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt, | |||
590 | break; | 590 | break; |
591 | 591 | ||
592 | case SCTP_XMIT_NAGLE_DELAY: | 592 | case SCTP_XMIT_NAGLE_DELAY: |
593 | /* Send this packet. */ | 593 | /* Send this packet. */ |
594 | if ((error = sctp_packet_transmit(pkt)) == 0) | 594 | if ((error = sctp_packet_transmit(pkt)) == 0) |
595 | *start_timer = 1; | 595 | *start_timer = 1; |
596 | 596 | ||
@@ -605,7 +605,7 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt, | |||
605 | */ | 605 | */ |
606 | list_add_tail(lchunk, &transport->transmitted); | 606 | list_add_tail(lchunk, &transport->transmitted); |
607 | 607 | ||
608 | /* Mark the chunk as ineligible for fast retransmit | 608 | /* Mark the chunk as ineligible for fast retransmit |
609 | * after it is retransmitted. | 609 | * after it is retransmitted. |
610 | */ | 610 | */ |
611 | if (chunk->fast_retransmit > 0) | 611 | if (chunk->fast_retransmit > 0) |
@@ -703,11 +703,11 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) | |||
703 | * inactive. | 703 | * inactive. |
704 | * | 704 | * |
705 | * 3.3.6 Heartbeat Acknowledgement: | 705 | * 3.3.6 Heartbeat Acknowledgement: |
706 | * ... | 706 | * ... |
707 | * A HEARTBEAT ACK is always sent to the source IP | 707 | * A HEARTBEAT ACK is always sent to the source IP |
708 | * address of the IP datagram containing the | 708 | * address of the IP datagram containing the |
709 | * HEARTBEAT chunk to which this ack is responding. | 709 | * HEARTBEAT chunk to which this ack is responding. |
710 | * ... | 710 | * ... |
711 | */ | 711 | */ |
712 | if (chunk->chunk_hdr->type != SCTP_CID_HEARTBEAT && | 712 | if (chunk->chunk_hdr->type != SCTP_CID_HEARTBEAT && |
713 | chunk->chunk_hdr->type != SCTP_CID_HEARTBEAT_ACK) | 713 | chunk->chunk_hdr->type != SCTP_CID_HEARTBEAT_ACK) |
@@ -914,7 +914,7 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) | |||
914 | BUG(); | 914 | BUG(); |
915 | } | 915 | } |
916 | 916 | ||
917 | /* BUG: We assume that the sctp_packet_transmit() | 917 | /* BUG: We assume that the sctp_packet_transmit() |
918 | * call below will succeed all the time and add the | 918 | * call below will succeed all the time and add the |
919 | * chunk to the transmitted list and restart the | 919 | * chunk to the transmitted list and restart the |
920 | * timers. | 920 | * timers. |
@@ -1266,7 +1266,7 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1266 | * first instance of the packet or a later | 1266 | * first instance of the packet or a later |
1267 | * instance). | 1267 | * instance). |
1268 | */ | 1268 | */ |
1269 | if (!tchunk->tsn_gap_acked && | 1269 | if (!tchunk->tsn_gap_acked && |
1270 | !tchunk->resent && | 1270 | !tchunk->resent && |
1271 | tchunk->rtt_in_progress) { | 1271 | tchunk->rtt_in_progress) { |
1272 | tchunk->rtt_in_progress = 0; | 1272 | tchunk->rtt_in_progress = 0; |
@@ -1275,7 +1275,7 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1275 | rtt); | 1275 | rtt); |
1276 | } | 1276 | } |
1277 | } | 1277 | } |
1278 | if (TSN_lte(tsn, sack_ctsn)) { | 1278 | if (TSN_lte(tsn, sack_ctsn)) { |
1279 | /* RFC 2960 6.3.2 Retransmission Timer Rules | 1279 | /* RFC 2960 6.3.2 Retransmission Timer Rules |
1280 | * | 1280 | * |
1281 | * R3) Whenever a SACK is received | 1281 | * R3) Whenever a SACK is received |
@@ -1590,7 +1590,7 @@ static void sctp_mark_missing(struct sctp_outq *q, | |||
1590 | SCTP_DEBUG_PRINTK("%s: transport: %p, cwnd: %d, " | 1590 | SCTP_DEBUG_PRINTK("%s: transport: %p, cwnd: %d, " |
1591 | "ssthresh: %d, flight_size: %d, pba: %d\n", | 1591 | "ssthresh: %d, flight_size: %d, pba: %d\n", |
1592 | __FUNCTION__, transport, transport->cwnd, | 1592 | __FUNCTION__, transport, transport->cwnd, |
1593 | transport->ssthresh, transport->flight_size, | 1593 | transport->ssthresh, transport->flight_size, |
1594 | transport->partial_bytes_acked); | 1594 | transport->partial_bytes_acked); |
1595 | } | 1595 | } |
1596 | } | 1596 | } |
@@ -1603,7 +1603,7 @@ static int sctp_acked(struct sctp_sackhdr *sack, __u32 tsn) | |||
1603 | __u16 gap; | 1603 | __u16 gap; |
1604 | __u32 ctsn = ntohl(sack->cum_tsn_ack); | 1604 | __u32 ctsn = ntohl(sack->cum_tsn_ack); |
1605 | 1605 | ||
1606 | if (TSN_lte(tsn, ctsn)) | 1606 | if (TSN_lte(tsn, ctsn)) |
1607 | goto pass; | 1607 | goto pass; |
1608 | 1608 | ||
1609 | /* 3.3.4 Selective Acknowledgement (SACK) (3): | 1609 | /* 3.3.4 Selective Acknowledgement (SACK) (3): |
@@ -1657,7 +1657,7 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn) | |||
1657 | 1657 | ||
1658 | /* PR-SCTP C1) Let SackCumAck be the Cumulative TSN ACK carried in the | 1658 | /* PR-SCTP C1) Let SackCumAck be the Cumulative TSN ACK carried in the |
1659 | * received SACK. | 1659 | * received SACK. |
1660 | * | 1660 | * |
1661 | * If (Advanced.Peer.Ack.Point < SackCumAck), then update | 1661 | * If (Advanced.Peer.Ack.Point < SackCumAck), then update |
1662 | * Advanced.Peer.Ack.Point to be equal to SackCumAck. | 1662 | * Advanced.Peer.Ack.Point to be equal to SackCumAck. |
1663 | */ | 1663 | */ |
@@ -1671,7 +1671,7 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn) | |||
1671 | * | 1671 | * |
1672 | * Assuming that a SACK arrived with the Cumulative TSN ACK 102 | 1672 | * Assuming that a SACK arrived with the Cumulative TSN ACK 102 |
1673 | * and the Advanced.Peer.Ack.Point is updated to this value: | 1673 | * and the Advanced.Peer.Ack.Point is updated to this value: |
1674 | * | 1674 | * |
1675 | * out-queue at the end of ==> out-queue after Adv.Ack.Point | 1675 | * out-queue at the end of ==> out-queue after Adv.Ack.Point |
1676 | * normal SACK processing local advancement | 1676 | * normal SACK processing local advancement |
1677 | * ... ... | 1677 | * ... ... |
@@ -1692,7 +1692,7 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn) | |||
1692 | 1692 | ||
1693 | /* Remove any chunks in the abandoned queue that are acked by | 1693 | /* Remove any chunks in the abandoned queue that are acked by |
1694 | * the ctsn. | 1694 | * the ctsn. |
1695 | */ | 1695 | */ |
1696 | if (TSN_lte(tsn, ctsn)) { | 1696 | if (TSN_lte(tsn, ctsn)) { |
1697 | list_del_init(lchunk); | 1697 | list_del_init(lchunk); |
1698 | if (!chunk->tsn_gap_acked) { | 1698 | if (!chunk->tsn_gap_acked) { |
@@ -1743,7 +1743,7 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn) | |||
1743 | */ | 1743 | */ |
1744 | if (asoc->adv_peer_ack_point > ctsn) | 1744 | if (asoc->adv_peer_ack_point > ctsn) |
1745 | ftsn_chunk = sctp_make_fwdtsn(asoc, asoc->adv_peer_ack_point, | 1745 | ftsn_chunk = sctp_make_fwdtsn(asoc, asoc->adv_peer_ack_point, |
1746 | nskips, &ftsn_skip_arr[0]); | 1746 | nskips, &ftsn_skip_arr[0]); |
1747 | 1747 | ||
1748 | if (ftsn_chunk) { | 1748 | if (ftsn_chunk) { |
1749 | list_add_tail(&ftsn_chunk->list, &q->control_chunk_list); | 1749 | list_add_tail(&ftsn_chunk->list, &q->control_chunk_list); |
diff --git a/net/sctp/primitive.c b/net/sctp/primitive.c index 3a7ebfcc1fdb..1b2976d34ac7 100644 --- a/net/sctp/primitive.c +++ b/net/sctp/primitive.c | |||
@@ -70,7 +70,7 @@ int sctp_primitive_ ## name(struct sctp_association *asoc, \ | |||
70 | \ | 70 | \ |
71 | error = sctp_do_sm(event_type, subtype, state, ep, asoc, \ | 71 | error = sctp_do_sm(event_type, subtype, state, ep, asoc, \ |
72 | arg, GFP_KERNEL); \ | 72 | arg, GFP_KERNEL); \ |
73 | return error; \ | 73 | return error; \ |
74 | } | 74 | } |
75 | 75 | ||
76 | /* 10.1 ULP-to-SCTP | 76 | /* 10.1 ULP-to-SCTP |
@@ -207,7 +207,7 @@ DECLARE_PRIMITIVE(REQUESTHEARTBEAT); | |||
207 | 207 | ||
208 | /* ADDIP | 208 | /* ADDIP |
209 | * 3.1.1 Address Configuration Change Chunk (ASCONF) | 209 | * 3.1.1 Address Configuration Change Chunk (ASCONF) |
210 | * | 210 | * |
211 | * This chunk is used to communicate to the remote endpoint one of the | 211 | * This chunk is used to communicate to the remote endpoint one of the |
212 | * configuration change requests that MUST be acknowledged. The | 212 | * configuration change requests that MUST be acknowledged. The |
213 | * information carried in the ASCONF Chunk uses the form of a | 213 | * information carried in the ASCONF Chunk uses the form of a |
diff --git a/net/sctp/proc.c b/net/sctp/proc.c index b3493bdbcacb..e93fc1cc430a 100644 --- a/net/sctp/proc.c +++ b/net/sctp/proc.c | |||
@@ -77,7 +77,7 @@ static struct snmp_mib sctp_snmp_list[] = { | |||
77 | 77 | ||
78 | /* Return the current value of a particular entry in the mib by adding its | 78 | /* Return the current value of a particular entry in the mib by adding its |
79 | * per cpu counters. | 79 | * per cpu counters. |
80 | */ | 80 | */ |
81 | static unsigned long | 81 | static unsigned long |
82 | fold_field(void *mib[], int nr) | 82 | fold_field(void *mib[], int nr) |
83 | { | 83 | { |
@@ -102,7 +102,7 @@ static int sctp_snmp_seq_show(struct seq_file *seq, void *v) | |||
102 | 102 | ||
103 | for (i = 0; sctp_snmp_list[i].name != NULL; i++) | 103 | for (i = 0; sctp_snmp_list[i].name != NULL; i++) |
104 | seq_printf(seq, "%-32s\t%ld\n", sctp_snmp_list[i].name, | 104 | seq_printf(seq, "%-32s\t%ld\n", sctp_snmp_list[i].name, |
105 | fold_field((void **)sctp_statistics, | 105 | fold_field((void **)sctp_statistics, |
106 | sctp_snmp_list[i].entry)); | 106 | sctp_snmp_list[i].entry)); |
107 | 107 | ||
108 | return 0; | 108 | return 0; |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 0ef48126b117..e17a823ca90f 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -102,11 +102,11 @@ static __init int sctp_proc_init(void) | |||
102 | } | 102 | } |
103 | 103 | ||
104 | if (sctp_snmp_proc_init()) | 104 | if (sctp_snmp_proc_init()) |
105 | goto out_nomem; | 105 | goto out_nomem; |
106 | if (sctp_eps_proc_init()) | 106 | if (sctp_eps_proc_init()) |
107 | goto out_nomem; | 107 | goto out_nomem; |
108 | if (sctp_assocs_proc_init()) | 108 | if (sctp_assocs_proc_init()) |
109 | goto out_nomem; | 109 | goto out_nomem; |
110 | 110 | ||
111 | return 0; | 111 | return 0; |
112 | 112 | ||
@@ -114,7 +114,7 @@ out_nomem: | |||
114 | return -ENOMEM; | 114 | return -ENOMEM; |
115 | } | 115 | } |
116 | 116 | ||
117 | /* Clean up the proc fs entry for the SCTP protocol. | 117 | /* Clean up the proc fs entry for the SCTP protocol. |
118 | * Note: Do not make this __exit as it is used in the init error | 118 | * Note: Do not make this __exit as it is used in the init error |
119 | * path. | 119 | * path. |
120 | */ | 120 | */ |
@@ -286,7 +286,7 @@ static int sctp_v4_to_addr_param(const union sctp_addr *addr, | |||
286 | 286 | ||
287 | param->v4.param_hdr.type = SCTP_PARAM_IPV4_ADDRESS; | 287 | param->v4.param_hdr.type = SCTP_PARAM_IPV4_ADDRESS; |
288 | param->v4.param_hdr.length = htons(length); | 288 | param->v4.param_hdr.length = htons(length); |
289 | param->v4.addr.s_addr = addr->v4.sin_addr.s_addr; | 289 | param->v4.addr.s_addr = addr->v4.sin_addr.s_addr; |
290 | 290 | ||
291 | return length; | 291 | return length; |
292 | } | 292 | } |
@@ -344,9 +344,9 @@ static int sctp_v4_addr_valid(union sctp_addr *addr, | |||
344 | if (IS_IPV4_UNUSABLE_ADDRESS(&addr->v4.sin_addr.s_addr)) | 344 | if (IS_IPV4_UNUSABLE_ADDRESS(&addr->v4.sin_addr.s_addr)) |
345 | return 0; | 345 | return 0; |
346 | 346 | ||
347 | /* Is this a broadcast address? */ | 347 | /* Is this a broadcast address? */ |
348 | if (skb && ((struct rtable *)skb->dst)->rt_flags & RTCF_BROADCAST) | 348 | if (skb && ((struct rtable *)skb->dst)->rt_flags & RTCF_BROADCAST) |
349 | return 0; | 349 | return 0; |
350 | 350 | ||
351 | return 1; | 351 | return 1; |
352 | } | 352 | } |
@@ -494,7 +494,7 @@ out_unlock: | |||
494 | out: | 494 | out: |
495 | if (dst) | 495 | if (dst) |
496 | SCTP_DEBUG_PRINTK("rt_dst:%u.%u.%u.%u, rt_src:%u.%u.%u.%u\n", | 496 | SCTP_DEBUG_PRINTK("rt_dst:%u.%u.%u.%u, rt_src:%u.%u.%u.%u\n", |
497 | NIPQUAD(rt->rt_dst), NIPQUAD(rt->rt_src)); | 497 | NIPQUAD(rt->rt_dst), NIPQUAD(rt->rt_src)); |
498 | else | 498 | else |
499 | SCTP_DEBUG_PRINTK("NO ROUTE\n"); | 499 | SCTP_DEBUG_PRINTK("NO ROUTE\n"); |
500 | 500 | ||
@@ -517,14 +517,14 @@ static void sctp_v4_get_saddr(struct sctp_association *asoc, | |||
517 | if (rt) { | 517 | if (rt) { |
518 | saddr->v4.sin_family = AF_INET; | 518 | saddr->v4.sin_family = AF_INET; |
519 | saddr->v4.sin_port = htons(asoc->base.bind_addr.port); | 519 | saddr->v4.sin_port = htons(asoc->base.bind_addr.port); |
520 | saddr->v4.sin_addr.s_addr = rt->rt_src; | 520 | saddr->v4.sin_addr.s_addr = rt->rt_src; |
521 | } | 521 | } |
522 | } | 522 | } |
523 | 523 | ||
524 | /* What interface did this skb arrive on? */ | 524 | /* What interface did this skb arrive on? */ |
525 | static int sctp_v4_skb_iif(const struct sk_buff *skb) | 525 | static int sctp_v4_skb_iif(const struct sk_buff *skb) |
526 | { | 526 | { |
527 | return ((struct rtable *)skb->dst)->rt_iif; | 527 | return ((struct rtable *)skb->dst)->rt_iif; |
528 | } | 528 | } |
529 | 529 | ||
530 | /* Was this packet marked by Explicit Congestion Notification? */ | 530 | /* Was this packet marked by Explicit Congestion Notification? */ |
@@ -569,7 +569,7 @@ static struct sock *sctp_v4_create_accept_sk(struct sock *sk, | |||
569 | newinet->dport = htons(asoc->peer.port); | 569 | newinet->dport = htons(asoc->peer.port); |
570 | newinet->daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr; | 570 | newinet->daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr; |
571 | newinet->pmtudisc = inet->pmtudisc; | 571 | newinet->pmtudisc = inet->pmtudisc; |
572 | newinet->id = asoc->next_tsn ^ jiffies; | 572 | newinet->id = asoc->next_tsn ^ jiffies; |
573 | 573 | ||
574 | newinet->uc_ttl = -1; | 574 | newinet->uc_ttl = -1; |
575 | newinet->mc_loop = 1; | 575 | newinet->mc_loop = 1; |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 783481860174..f7fb29d5a0c7 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
@@ -118,7 +118,7 @@ void sctp_init_cause(struct sctp_chunk *chunk, __be16 cause_code, | |||
118 | int padlen; | 118 | int padlen; |
119 | __u16 len; | 119 | __u16 len; |
120 | 120 | ||
121 | /* Cause code constants are now defined in network order. */ | 121 | /* Cause code constants are now defined in network order. */ |
122 | err.cause = cause_code; | 122 | err.cause = cause_code; |
123 | len = sizeof(sctp_errhdr_t) + paylen; | 123 | len = sizeof(sctp_errhdr_t) + paylen; |
124 | padlen = len % 4; | 124 | padlen = len % 4; |
@@ -295,11 +295,11 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, | |||
295 | */ | 295 | */ |
296 | chunksize = sizeof(initack) + addrs_len + cookie_len + unkparam_len; | 296 | chunksize = sizeof(initack) + addrs_len + cookie_len + unkparam_len; |
297 | 297 | ||
298 | /* Tell peer that we'll do ECN only if peer advertised such cap. */ | 298 | /* Tell peer that we'll do ECN only if peer advertised such cap. */ |
299 | if (asoc->peer.ecn_capable) | 299 | if (asoc->peer.ecn_capable) |
300 | chunksize += sizeof(ecap_param); | 300 | chunksize += sizeof(ecap_param); |
301 | 301 | ||
302 | /* Tell peer that we'll do PR-SCTP only if peer advertised. */ | 302 | /* Tell peer that we'll do PR-SCTP only if peer advertised. */ |
303 | if (asoc->peer.prsctp_capable) | 303 | if (asoc->peer.prsctp_capable) |
304 | chunksize += sizeof(prsctp_param); | 304 | chunksize += sizeof(prsctp_param); |
305 | 305 | ||
@@ -728,7 +728,7 @@ struct sctp_chunk *sctp_make_shutdown_complete( | |||
728 | if (retval && chunk) | 728 | if (retval && chunk) |
729 | retval->transport = chunk->transport; | 729 | retval->transport = chunk->transport; |
730 | 730 | ||
731 | return retval; | 731 | return retval; |
732 | } | 732 | } |
733 | 733 | ||
734 | /* Create an ABORT. Note that we set the T bit if we have no | 734 | /* Create an ABORT. Note that we set the T bit if we have no |
@@ -844,7 +844,7 @@ err_chunk: | |||
844 | return retval; | 844 | return retval; |
845 | } | 845 | } |
846 | 846 | ||
847 | /* Make an ABORT chunk with a PROTOCOL VIOLATION cause code. */ | 847 | /* Make an ABORT chunk with a PROTOCOL VIOLATION cause code. */ |
848 | struct sctp_chunk *sctp_make_abort_violation( | 848 | struct sctp_chunk *sctp_make_abort_violation( |
849 | const struct sctp_association *asoc, | 849 | const struct sctp_association *asoc, |
850 | const struct sctp_chunk *chunk, | 850 | const struct sctp_chunk *chunk, |
@@ -1264,8 +1264,8 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep, | |||
1264 | /* Header size is static data prior to the actual cookie, including | 1264 | /* Header size is static data prior to the actual cookie, including |
1265 | * any padding. | 1265 | * any padding. |
1266 | */ | 1266 | */ |
1267 | headersize = sizeof(sctp_paramhdr_t) + | 1267 | headersize = sizeof(sctp_paramhdr_t) + |
1268 | (sizeof(struct sctp_signed_cookie) - | 1268 | (sizeof(struct sctp_signed_cookie) - |
1269 | sizeof(struct sctp_cookie)); | 1269 | sizeof(struct sctp_cookie)); |
1270 | bodysize = sizeof(struct sctp_cookie) | 1270 | bodysize = sizeof(struct sctp_cookie) |
1271 | + ntohs(init_chunk->chunk_hdr->length) + addrs_len; | 1271 | + ntohs(init_chunk->chunk_hdr->length) + addrs_len; |
@@ -1314,7 +1314,7 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep, | |||
1314 | memcpy((__u8 *)&cookie->c.peer_init[0] + | 1314 | memcpy((__u8 *)&cookie->c.peer_init[0] + |
1315 | ntohs(init_chunk->chunk_hdr->length), raw_addrs, addrs_len); | 1315 | ntohs(init_chunk->chunk_hdr->length), raw_addrs, addrs_len); |
1316 | 1316 | ||
1317 | if (sctp_sk(ep->base.sk)->hmac) { | 1317 | if (sctp_sk(ep->base.sk)->hmac) { |
1318 | struct hash_desc desc; | 1318 | struct hash_desc desc; |
1319 | 1319 | ||
1320 | /* Sign the message. */ | 1320 | /* Sign the message. */ |
@@ -1323,8 +1323,8 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep, | |||
1323 | sg.length = bodysize; | 1323 | sg.length = bodysize; |
1324 | keylen = SCTP_SECRET_SIZE; | 1324 | keylen = SCTP_SECRET_SIZE; |
1325 | key = (char *)ep->secret_key[ep->current_key]; | 1325 | key = (char *)ep->secret_key[ep->current_key]; |
1326 | desc.tfm = sctp_sk(ep->base.sk)->hmac; | 1326 | desc.tfm = sctp_sk(ep->base.sk)->hmac; |
1327 | desc.flags = 0; | 1327 | desc.flags = 0; |
1328 | 1328 | ||
1329 | if (crypto_hash_setkey(desc.tfm, key, keylen) || | 1329 | if (crypto_hash_setkey(desc.tfm, key, keylen) || |
1330 | crypto_hash_digest(&desc, &sg, bodysize, cookie->signature)) | 1330 | crypto_hash_digest(&desc, &sg, bodysize, cookie->signature)) |
@@ -1364,7 +1364,7 @@ struct sctp_association *sctp_unpack_cookie( | |||
1364 | * any padding. | 1364 | * any padding. |
1365 | */ | 1365 | */ |
1366 | headersize = sizeof(sctp_chunkhdr_t) + | 1366 | headersize = sizeof(sctp_chunkhdr_t) + |
1367 | (sizeof(struct sctp_signed_cookie) - | 1367 | (sizeof(struct sctp_signed_cookie) - |
1368 | sizeof(struct sctp_cookie)); | 1368 | sizeof(struct sctp_cookie)); |
1369 | bodysize = ntohs(chunk->chunk_hdr->length) - headersize; | 1369 | bodysize = ntohs(chunk->chunk_hdr->length) - headersize; |
1370 | fixed_size = headersize + sizeof(struct sctp_cookie); | 1370 | fixed_size = headersize + sizeof(struct sctp_cookie); |
@@ -1592,7 +1592,7 @@ static int sctp_process_inv_paramlength(const struct sctp_association *asoc, | |||
1592 | struct sctp_chunk **errp) | 1592 | struct sctp_chunk **errp) |
1593 | { | 1593 | { |
1594 | char error[] = "The following parameter had invalid length:"; | 1594 | char error[] = "The following parameter had invalid length:"; |
1595 | size_t payload_len = WORD_ROUND(sizeof(error)) + | 1595 | size_t payload_len = WORD_ROUND(sizeof(error)) + |
1596 | sizeof(sctp_paramhdr_t); | 1596 | sizeof(sctp_paramhdr_t); |
1597 | 1597 | ||
1598 | 1598 | ||
@@ -1751,7 +1751,7 @@ static int sctp_verify_param(const struct sctp_association *asoc, | |||
1751 | case SCTP_PARAM_FWD_TSN_SUPPORT: | 1751 | case SCTP_PARAM_FWD_TSN_SUPPORT: |
1752 | if (sctp_prsctp_enable) | 1752 | if (sctp_prsctp_enable) |
1753 | break; | 1753 | break; |
1754 | /* Fall Through */ | 1754 | /* Fall Through */ |
1755 | default: | 1755 | default: |
1756 | SCTP_DEBUG_PRINTK("Unrecognized param: %d for chunk %d.\n", | 1756 | SCTP_DEBUG_PRINTK("Unrecognized param: %d for chunk %d.\n", |
1757 | ntohs(param.p->type), cid); | 1757 | ntohs(param.p->type), cid); |
@@ -1860,7 +1860,7 @@ int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid, | |||
1860 | sctp_walk_params(param, peer_init, init_hdr.params) { | 1860 | sctp_walk_params(param, peer_init, init_hdr.params) { |
1861 | 1861 | ||
1862 | if (!sctp_process_param(asoc, param, peer_addr, gfp)) | 1862 | if (!sctp_process_param(asoc, param, peer_addr, gfp)) |
1863 | goto clean_up; | 1863 | goto clean_up; |
1864 | } | 1864 | } |
1865 | 1865 | ||
1866 | /* Walk list of transports, removing transports in the UNKNOWN state. */ | 1866 | /* Walk list of transports, removing transports in the UNKNOWN state. */ |
@@ -1936,7 +1936,7 @@ int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid, | |||
1936 | */ | 1936 | */ |
1937 | 1937 | ||
1938 | /* Allocate storage for the negotiated streams if it is not a temporary | 1938 | /* Allocate storage for the negotiated streams if it is not a temporary |
1939 | * association. | 1939 | * association. |
1940 | */ | 1940 | */ |
1941 | if (!asoc->temp) { | 1941 | if (!asoc->temp) { |
1942 | int assoc_id; | 1942 | int assoc_id; |
@@ -2108,7 +2108,7 @@ static int sctp_process_param(struct sctp_association *asoc, | |||
2108 | asoc->peer.prsctp_capable = 1; | 2108 | asoc->peer.prsctp_capable = 1; |
2109 | break; | 2109 | break; |
2110 | } | 2110 | } |
2111 | /* Fall Through */ | 2111 | /* Fall Through */ |
2112 | default: | 2112 | default: |
2113 | /* Any unrecognized parameters should have been caught | 2113 | /* Any unrecognized parameters should have been caught |
2114 | * and handled by sctp_verify_param() which should be | 2114 | * and handled by sctp_verify_param() which should be |
@@ -2167,7 +2167,7 @@ __u32 sctp_generate_tsn(const struct sctp_endpoint *ep) | |||
2167 | * | ASCONF Parameter #N | | 2167 | * | ASCONF Parameter #N | |
2168 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 2168 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
2169 | * | 2169 | * |
2170 | * Address Parameter and other parameter will not be wrapped in this function | 2170 | * Address Parameter and other parameter will not be wrapped in this function |
2171 | */ | 2171 | */ |
2172 | static struct sctp_chunk *sctp_make_asconf(struct sctp_association *asoc, | 2172 | static struct sctp_chunk *sctp_make_asconf(struct sctp_association *asoc, |
2173 | union sctp_addr *addr, | 2173 | union sctp_addr *addr, |
@@ -2289,7 +2289,7 @@ struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *asoc, | |||
2289 | * | Address Parameter | | 2289 | * | Address Parameter | |
2290 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 2290 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
2291 | * | 2291 | * |
2292 | * Create an ASCONF chunk with Set Primary IP address parameter. | 2292 | * Create an ASCONF chunk with Set Primary IP address parameter. |
2293 | */ | 2293 | */ |
2294 | struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc, | 2294 | struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc, |
2295 | union sctp_addr *addr) | 2295 | union sctp_addr *addr) |
@@ -2338,7 +2338,7 @@ struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc, | |||
2338 | * | ASCONF Parameter Response#N | | 2338 | * | ASCONF Parameter Response#N | |
2339 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 2339 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
2340 | * | 2340 | * |
2341 | * Create an ASCONF_ACK chunk with enough space for the parameter responses. | 2341 | * Create an ASCONF_ACK chunk with enough space for the parameter responses. |
2342 | */ | 2342 | */ |
2343 | static struct sctp_chunk *sctp_make_asconf_ack(const struct sctp_association *asoc, | 2343 | static struct sctp_chunk *sctp_make_asconf_ack(const struct sctp_association *asoc, |
2344 | __u32 serial, int vparam_len) | 2344 | __u32 serial, int vparam_len) |
@@ -2380,7 +2380,7 @@ static void sctp_add_asconf_response(struct sctp_chunk *chunk, __be32 crr_id, | |||
2380 | ntohs(asconf_param->param_hdr.length); | 2380 | ntohs(asconf_param->param_hdr.length); |
2381 | } | 2381 | } |
2382 | 2382 | ||
2383 | /* Add Success Indication or Error Cause Indication parameter. */ | 2383 | /* Add Success Indication or Error Cause Indication parameter. */ |
2384 | ack_param.param_hdr.type = response_type; | 2384 | ack_param.param_hdr.type = response_type; |
2385 | ack_param.param_hdr.length = htons(sizeof(ack_param) + | 2385 | ack_param.param_hdr.length = htons(sizeof(ack_param) + |
2386 | err_param_len + | 2386 | err_param_len + |
@@ -2423,11 +2423,11 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc, | |||
2423 | switch (asconf_param->param_hdr.type) { | 2423 | switch (asconf_param->param_hdr.type) { |
2424 | case SCTP_PARAM_ADD_IP: | 2424 | case SCTP_PARAM_ADD_IP: |
2425 | /* ADDIP 4.3 D9) If an endpoint receives an ADD IP address | 2425 | /* ADDIP 4.3 D9) If an endpoint receives an ADD IP address |
2426 | * request and does not have the local resources to add this | 2426 | * request and does not have the local resources to add this |
2427 | * new address to the association, it MUST return an Error | 2427 | * new address to the association, it MUST return an Error |
2428 | * Cause TLV set to the new error code 'Operation Refused | 2428 | * Cause TLV set to the new error code 'Operation Refused |
2429 | * Due to Resource Shortage'. | 2429 | * Due to Resource Shortage'. |
2430 | */ | 2430 | */ |
2431 | 2431 | ||
2432 | peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC, SCTP_UNCONFIRMED); | 2432 | peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC, SCTP_UNCONFIRMED); |
2433 | if (!peer) | 2433 | if (!peer) |
@@ -2439,10 +2439,10 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc, | |||
2439 | break; | 2439 | break; |
2440 | case SCTP_PARAM_DEL_IP: | 2440 | case SCTP_PARAM_DEL_IP: |
2441 | /* ADDIP 4.3 D7) If a request is received to delete the | 2441 | /* ADDIP 4.3 D7) If a request is received to delete the |
2442 | * last remaining IP address of a peer endpoint, the receiver | 2442 | * last remaining IP address of a peer endpoint, the receiver |
2443 | * MUST send an Error Cause TLV with the error cause set to the | 2443 | * MUST send an Error Cause TLV with the error cause set to the |
2444 | * new error code 'Request to Delete Last Remaining IP Address'. | 2444 | * new error code 'Request to Delete Last Remaining IP Address'. |
2445 | */ | 2445 | */ |
2446 | pos = asoc->peer.transport_addr_list.next; | 2446 | pos = asoc->peer.transport_addr_list.next; |
2447 | if (pos->next == &asoc->peer.transport_addr_list) | 2447 | if (pos->next == &asoc->peer.transport_addr_list) |
2448 | return SCTP_ERROR_DEL_LAST_IP; | 2448 | return SCTP_ERROR_DEL_LAST_IP; |
@@ -2474,7 +2474,7 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc, | |||
2474 | return SCTP_ERROR_NO_ERROR; | 2474 | return SCTP_ERROR_NO_ERROR; |
2475 | } | 2475 | } |
2476 | 2476 | ||
2477 | /* Process an incoming ASCONF chunk with the next expected serial no. and | 2477 | /* Process an incoming ASCONF chunk with the next expected serial no. and |
2478 | * return an ASCONF_ACK chunk to be sent in response. | 2478 | * return an ASCONF_ACK chunk to be sent in response. |
2479 | */ | 2479 | */ |
2480 | struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc, | 2480 | struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc, |
@@ -2494,19 +2494,19 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc, | |||
2494 | hdr = (sctp_addiphdr_t *)asconf->skb->data; | 2494 | hdr = (sctp_addiphdr_t *)asconf->skb->data; |
2495 | serial = ntohl(hdr->serial); | 2495 | serial = ntohl(hdr->serial); |
2496 | 2496 | ||
2497 | /* Skip the addiphdr and store a pointer to address parameter. */ | 2497 | /* Skip the addiphdr and store a pointer to address parameter. */ |
2498 | length = sizeof(sctp_addiphdr_t); | 2498 | length = sizeof(sctp_addiphdr_t); |
2499 | addr_param = (union sctp_addr_param *)(asconf->skb->data + length); | 2499 | addr_param = (union sctp_addr_param *)(asconf->skb->data + length); |
2500 | chunk_len -= length; | 2500 | chunk_len -= length; |
2501 | 2501 | ||
2502 | /* Skip the address parameter and store a pointer to the first | 2502 | /* Skip the address parameter and store a pointer to the first |
2503 | * asconf paramter. | 2503 | * asconf paramter. |
2504 | */ | 2504 | */ |
2505 | length = ntohs(addr_param->v4.param_hdr.length); | 2505 | length = ntohs(addr_param->v4.param_hdr.length); |
2506 | asconf_param = (sctp_addip_param_t *)((void *)addr_param + length); | 2506 | asconf_param = (sctp_addip_param_t *)((void *)addr_param + length); |
2507 | chunk_len -= length; | 2507 | chunk_len -= length; |
2508 | 2508 | ||
2509 | /* create an ASCONF_ACK chunk. | 2509 | /* create an ASCONF_ACK chunk. |
2510 | * Based on the definitions of parameters, we know that the size of | 2510 | * Based on the definitions of parameters, we know that the size of |
2511 | * ASCONF_ACK parameters are less than or equal to the twice of ASCONF | 2511 | * ASCONF_ACK parameters are less than or equal to the twice of ASCONF |
2512 | * paramters. | 2512 | * paramters. |
@@ -2537,7 +2537,7 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc, | |||
2537 | /* ADDIP 4.3 D11) When an endpoint receiving an ASCONF to add | 2537 | /* ADDIP 4.3 D11) When an endpoint receiving an ASCONF to add |
2538 | * an IP address sends an 'Out of Resource' in its response, it | 2538 | * an IP address sends an 'Out of Resource' in its response, it |
2539 | * MUST also fail any subsequent add or delete requests bundled | 2539 | * MUST also fail any subsequent add or delete requests bundled |
2540 | * in the ASCONF. | 2540 | * in the ASCONF. |
2541 | */ | 2541 | */ |
2542 | if (SCTP_ERROR_RSRC_LOW == err_code) | 2542 | if (SCTP_ERROR_RSRC_LOW == err_code) |
2543 | goto done; | 2543 | goto done; |
@@ -2548,12 +2548,12 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc, | |||
2548 | length); | 2548 | length); |
2549 | chunk_len -= length; | 2549 | chunk_len -= length; |
2550 | } | 2550 | } |
2551 | 2551 | ||
2552 | done: | 2552 | done: |
2553 | asoc->peer.addip_serial++; | 2553 | asoc->peer.addip_serial++; |
2554 | 2554 | ||
2555 | /* If we are sending a new ASCONF_ACK hold a reference to it in assoc | 2555 | /* If we are sending a new ASCONF_ACK hold a reference to it in assoc |
2556 | * after freeing the reference to old asconf ack if any. | 2556 | * after freeing the reference to old asconf ack if any. |
2557 | */ | 2557 | */ |
2558 | if (asconf_ack) { | 2558 | if (asconf_ack) { |
2559 | if (asoc->addip_last_asconf_ack) | 2559 | if (asoc->addip_last_asconf_ack) |
@@ -2621,7 +2621,7 @@ static int sctp_asconf_param_success(struct sctp_association *asoc, | |||
2621 | 2621 | ||
2622 | /* Get the corresponding ASCONF response error code from the ASCONF_ACK chunk | 2622 | /* Get the corresponding ASCONF response error code from the ASCONF_ACK chunk |
2623 | * for the given asconf parameter. If there is no response for this parameter, | 2623 | * for the given asconf parameter. If there is no response for this parameter, |
2624 | * return the error code based on the third argument 'no_err'. | 2624 | * return the error code based on the third argument 'no_err'. |
2625 | * ADDIP 4.1 | 2625 | * ADDIP 4.1 |
2626 | * A7) If an error response is received for a TLV parameter, all TLVs with no | 2626 | * A7) If an error response is received for a TLV parameter, all TLVs with no |
2627 | * response before the failed TLV are considered successful if not reported. | 2627 | * response before the failed TLV are considered successful if not reported. |
@@ -2645,7 +2645,7 @@ static __be16 sctp_get_asconf_response(struct sctp_chunk *asconf_ack, | |||
2645 | 2645 | ||
2646 | /* Skip the addiphdr from the asconf_ack chunk and store a pointer to | 2646 | /* Skip the addiphdr from the asconf_ack chunk and store a pointer to |
2647 | * the first asconf_ack parameter. | 2647 | * the first asconf_ack parameter. |
2648 | */ | 2648 | */ |
2649 | length = sizeof(sctp_addiphdr_t); | 2649 | length = sizeof(sctp_addiphdr_t); |
2650 | asconf_ack_param = (sctp_addip_param_t *)(asconf_ack->skb->data + | 2650 | asconf_ack_param = (sctp_addip_param_t *)(asconf_ack->skb->data + |
2651 | length); | 2651 | length); |
@@ -2696,14 +2696,14 @@ int sctp_process_asconf_ack(struct sctp_association *asoc, | |||
2696 | 2696 | ||
2697 | /* Skip the chunkhdr and addiphdr from the last asconf sent and store | 2697 | /* Skip the chunkhdr and addiphdr from the last asconf sent and store |
2698 | * a pointer to address parameter. | 2698 | * a pointer to address parameter. |
2699 | */ | 2699 | */ |
2700 | length = sizeof(sctp_addip_chunk_t); | 2700 | length = sizeof(sctp_addip_chunk_t); |
2701 | addr_param = (union sctp_addr_param *)(asconf->skb->data + length); | 2701 | addr_param = (union sctp_addr_param *)(asconf->skb->data + length); |
2702 | asconf_len -= length; | 2702 | asconf_len -= length; |
2703 | 2703 | ||
2704 | /* Skip the address parameter in the last asconf sent and store a | 2704 | /* Skip the address parameter in the last asconf sent and store a |
2705 | * pointer to the first asconf paramter. | 2705 | * pointer to the first asconf paramter. |
2706 | */ | 2706 | */ |
2707 | length = ntohs(addr_param->v4.param_hdr.length); | 2707 | length = ntohs(addr_param->v4.param_hdr.length); |
2708 | asconf_param = (sctp_addip_param_t *)((void *)addr_param + length); | 2708 | asconf_param = (sctp_addip_param_t *)((void *)addr_param + length); |
2709 | asconf_len -= length; | 2709 | asconf_len -= length; |
@@ -2740,7 +2740,7 @@ int sctp_process_asconf_ack(struct sctp_association *asoc, | |||
2740 | case SCTP_ERROR_INV_PARAM: | 2740 | case SCTP_ERROR_INV_PARAM: |
2741 | /* Disable sending this type of asconf parameter in | 2741 | /* Disable sending this type of asconf parameter in |
2742 | * future. | 2742 | * future. |
2743 | */ | 2743 | */ |
2744 | asoc->peer.addip_disabled_mask |= | 2744 | asoc->peer.addip_disabled_mask |= |
2745 | asconf_param->param_hdr.type; | 2745 | asconf_param->param_hdr.type; |
2746 | break; | 2746 | break; |
@@ -2754,7 +2754,7 @@ int sctp_process_asconf_ack(struct sctp_association *asoc, | |||
2754 | 2754 | ||
2755 | /* Skip the processed asconf parameter and move to the next | 2755 | /* Skip the processed asconf parameter and move to the next |
2756 | * one. | 2756 | * one. |
2757 | */ | 2757 | */ |
2758 | length = ntohs(asconf_param->param_hdr.length); | 2758 | length = ntohs(asconf_param->param_hdr.length); |
2759 | asconf_param = (sctp_addip_param_t *)((void *)asconf_param + | 2759 | asconf_param = (sctp_addip_param_t *)((void *)asconf_param + |
2760 | length); | 2760 | length); |
@@ -2783,14 +2783,14 @@ int sctp_process_asconf_ack(struct sctp_association *asoc, | |||
2783 | return retval; | 2783 | return retval; |
2784 | } | 2784 | } |
2785 | 2785 | ||
2786 | /* Make a FWD TSN chunk. */ | 2786 | /* Make a FWD TSN chunk. */ |
2787 | struct sctp_chunk *sctp_make_fwdtsn(const struct sctp_association *asoc, | 2787 | struct sctp_chunk *sctp_make_fwdtsn(const struct sctp_association *asoc, |
2788 | __u32 new_cum_tsn, size_t nstreams, | 2788 | __u32 new_cum_tsn, size_t nstreams, |
2789 | struct sctp_fwdtsn_skip *skiplist) | 2789 | struct sctp_fwdtsn_skip *skiplist) |
2790 | { | 2790 | { |
2791 | struct sctp_chunk *retval = NULL; | 2791 | struct sctp_chunk *retval = NULL; |
2792 | struct sctp_fwdtsn_chunk *ftsn_chunk; | 2792 | struct sctp_fwdtsn_chunk *ftsn_chunk; |
2793 | struct sctp_fwdtsn_hdr ftsn_hdr; | 2793 | struct sctp_fwdtsn_hdr ftsn_hdr; |
2794 | struct sctp_fwdtsn_skip skip; | 2794 | struct sctp_fwdtsn_skip skip; |
2795 | size_t hint; | 2795 | size_t hint; |
2796 | int i; | 2796 | int i; |
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index 6db77d1329f7..135567493119 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
@@ -61,7 +61,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
61 | struct sctp_endpoint *ep, | 61 | struct sctp_endpoint *ep, |
62 | struct sctp_association *asoc, | 62 | struct sctp_association *asoc, |
63 | void *event_arg, | 63 | void *event_arg, |
64 | sctp_disposition_t status, | 64 | sctp_disposition_t status, |
65 | sctp_cmd_seq_t *commands, | 65 | sctp_cmd_seq_t *commands, |
66 | gfp_t gfp); | 66 | gfp_t gfp); |
67 | static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, | 67 | static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, |
@@ -78,7 +78,7 @@ static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, | |||
78 | ********************************************************************/ | 78 | ********************************************************************/ |
79 | 79 | ||
80 | /* A helper function for delayed processing of INET ECN CE bit. */ | 80 | /* A helper function for delayed processing of INET ECN CE bit. */ |
81 | static void sctp_do_ecn_ce_work(struct sctp_association *asoc, | 81 | static void sctp_do_ecn_ce_work(struct sctp_association *asoc, |
82 | __u32 lowest_tsn) | 82 | __u32 lowest_tsn) |
83 | { | 83 | { |
84 | /* Save the TSN away for comparison when we receive CWR */ | 84 | /* Save the TSN away for comparison when we receive CWR */ |
@@ -160,7 +160,7 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force, | |||
160 | struct sctp_transport *trans = asoc->peer.last_data_from; | 160 | struct sctp_transport *trans = asoc->peer.last_data_from; |
161 | int error = 0; | 161 | int error = 0; |
162 | 162 | ||
163 | if (force || | 163 | if (force || |
164 | (!trans && (asoc->param_flags & SPP_SACKDELAY_DISABLE)) || | 164 | (!trans && (asoc->param_flags & SPP_SACKDELAY_DISABLE)) || |
165 | (trans && (trans->param_flags & SPP_SACKDELAY_DISABLE))) | 165 | (trans && (trans->param_flags & SPP_SACKDELAY_DISABLE))) |
166 | asoc->peer.sack_needed = 1; | 166 | asoc->peer.sack_needed = 1; |
@@ -178,7 +178,7 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force, | |||
178 | * [This is actually not mentioned in Section 6, but we | 178 | * [This is actually not mentioned in Section 6, but we |
179 | * implement it here anyway. --piggy] | 179 | * implement it here anyway. --piggy] |
180 | */ | 180 | */ |
181 | if (max_tsn_seen != ctsn) | 181 | if (max_tsn_seen != ctsn) |
182 | asoc->peer.sack_needed = 1; | 182 | asoc->peer.sack_needed = 1; |
183 | 183 | ||
184 | /* From 6.2 Acknowledgement on Reception of DATA Chunks: | 184 | /* From 6.2 Acknowledgement on Reception of DATA Chunks: |
@@ -199,10 +199,10 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force, | |||
199 | * for the association. | 199 | * for the association. |
200 | */ | 200 | */ |
201 | if (trans) | 201 | if (trans) |
202 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = | 202 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = |
203 | trans->sackdelay; | 203 | trans->sackdelay; |
204 | else | 204 | else |
205 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = | 205 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = |
206 | asoc->sackdelay; | 206 | asoc->sackdelay; |
207 | 207 | ||
208 | /* Restart the SACK timer. */ | 208 | /* Restart the SACK timer. */ |
@@ -338,8 +338,8 @@ static void sctp_generate_t4_rto_event(unsigned long data) | |||
338 | 338 | ||
339 | static void sctp_generate_t5_shutdown_guard_event(unsigned long data) | 339 | static void sctp_generate_t5_shutdown_guard_event(unsigned long data) |
340 | { | 340 | { |
341 | struct sctp_association *asoc = (struct sctp_association *)data; | 341 | struct sctp_association *asoc = (struct sctp_association *)data; |
342 | sctp_generate_timeout_event(asoc, | 342 | sctp_generate_timeout_event(asoc, |
343 | SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD); | 343 | SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD); |
344 | 344 | ||
345 | } /* sctp_generate_t5_shutdown_guard_event() */ | 345 | } /* sctp_generate_t5_shutdown_guard_event() */ |
@@ -380,7 +380,7 @@ void sctp_generate_heartbeat_event(unsigned long data) | |||
380 | asoc->state, asoc->ep, asoc, | 380 | asoc->state, asoc->ep, asoc, |
381 | transport, GFP_ATOMIC); | 381 | transport, GFP_ATOMIC); |
382 | 382 | ||
383 | if (error) | 383 | if (error) |
384 | asoc->base.sk->sk_err = -error; | 384 | asoc->base.sk->sk_err = -error; |
385 | 385 | ||
386 | out_unlock: | 386 | out_unlock: |
@@ -570,7 +570,7 @@ static void sctp_cmd_hb_timers_stop(sctp_cmd_seq_t *cmds, | |||
570 | 570 | ||
571 | /* Helper function to stop any pending T3-RTX timers */ | 571 | /* Helper function to stop any pending T3-RTX timers */ |
572 | static void sctp_cmd_t3_rtx_timers_stop(sctp_cmd_seq_t *cmds, | 572 | static void sctp_cmd_t3_rtx_timers_stop(sctp_cmd_seq_t *cmds, |
573 | struct sctp_association *asoc) | 573 | struct sctp_association *asoc) |
574 | { | 574 | { |
575 | struct sctp_transport *t; | 575 | struct sctp_transport *t; |
576 | struct list_head *pos; | 576 | struct list_head *pos; |
@@ -675,7 +675,7 @@ static int sctp_cmd_process_sack(sctp_cmd_seq_t *cmds, | |||
675 | /* Helper function to set the timeout value for T2-SHUTDOWN timer and to set | 675 | /* Helper function to set the timeout value for T2-SHUTDOWN timer and to set |
676 | * the transport for a shutdown chunk. | 676 | * the transport for a shutdown chunk. |
677 | */ | 677 | */ |
678 | static void sctp_cmd_setup_t2(sctp_cmd_seq_t *cmds, | 678 | static void sctp_cmd_setup_t2(sctp_cmd_seq_t *cmds, |
679 | struct sctp_association *asoc, | 679 | struct sctp_association *asoc, |
680 | struct sctp_chunk *chunk) | 680 | struct sctp_chunk *chunk) |
681 | { | 681 | { |
@@ -688,7 +688,7 @@ static void sctp_cmd_setup_t2(sctp_cmd_seq_t *cmds, | |||
688 | } | 688 | } |
689 | 689 | ||
690 | /* Helper function to change the state of an association. */ | 690 | /* Helper function to change the state of an association. */ |
691 | static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds, | 691 | static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds, |
692 | struct sctp_association *asoc, | 692 | struct sctp_association *asoc, |
693 | sctp_state_t state) | 693 | sctp_state_t state) |
694 | { | 694 | { |
@@ -727,7 +727,7 @@ static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds, | |||
727 | sctp_state(asoc, SHUTDOWN_RECEIVED)) { | 727 | sctp_state(asoc, SHUTDOWN_RECEIVED)) { |
728 | /* Wake up any processes waiting in the asoc's wait queue in | 728 | /* Wake up any processes waiting in the asoc's wait queue in |
729 | * sctp_wait_for_connect() or sctp_wait_for_sndbuf(). | 729 | * sctp_wait_for_connect() or sctp_wait_for_sndbuf(). |
730 | */ | 730 | */ |
731 | if (waitqueue_active(&asoc->wait)) | 731 | if (waitqueue_active(&asoc->wait)) |
732 | wake_up_interruptible(&asoc->wait); | 732 | wake_up_interruptible(&asoc->wait); |
733 | 733 | ||
@@ -749,9 +749,9 @@ static void sctp_cmd_delete_tcb(sctp_cmd_seq_t *cmds, | |||
749 | struct sock *sk = asoc->base.sk; | 749 | struct sock *sk = asoc->base.sk; |
750 | 750 | ||
751 | /* If it is a non-temporary association belonging to a TCP-style | 751 | /* If it is a non-temporary association belonging to a TCP-style |
752 | * listening socket that is not closed, do not free it so that accept() | 752 | * listening socket that is not closed, do not free it so that accept() |
753 | * can pick it up later. | 753 | * can pick it up later. |
754 | */ | 754 | */ |
755 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING) && | 755 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING) && |
756 | (!asoc->temp) && (sk->sk_shutdown != SHUTDOWN_MASK)) | 756 | (!asoc->temp) && (sk->sk_shutdown != SHUTDOWN_MASK)) |
757 | return; | 757 | return; |
@@ -764,7 +764,7 @@ static void sctp_cmd_delete_tcb(sctp_cmd_seq_t *cmds, | |||
764 | * ADDIP Section 4.1 ASCONF Chunk Procedures | 764 | * ADDIP Section 4.1 ASCONF Chunk Procedures |
765 | * A4) Start a T-4 RTO timer, using the RTO value of the selected | 765 | * A4) Start a T-4 RTO timer, using the RTO value of the selected |
766 | * destination address (we use active path instead of primary path just | 766 | * destination address (we use active path instead of primary path just |
767 | * because primary path may be inactive. | 767 | * because primary path may be inactive. |
768 | */ | 768 | */ |
769 | static void sctp_cmd_setup_t4(sctp_cmd_seq_t *cmds, | 769 | static void sctp_cmd_setup_t4(sctp_cmd_seq_t *cmds, |
770 | struct sctp_association *asoc, | 770 | struct sctp_association *asoc, |
@@ -777,7 +777,7 @@ static void sctp_cmd_setup_t4(sctp_cmd_seq_t *cmds, | |||
777 | chunk->transport = t; | 777 | chunk->transport = t; |
778 | } | 778 | } |
779 | 779 | ||
780 | /* Process an incoming Operation Error Chunk. */ | 780 | /* Process an incoming Operation Error Chunk. */ |
781 | static void sctp_cmd_process_operr(sctp_cmd_seq_t *cmds, | 781 | static void sctp_cmd_process_operr(sctp_cmd_seq_t *cmds, |
782 | struct sctp_association *asoc, | 782 | struct sctp_association *asoc, |
783 | struct sctp_chunk *chunk) | 783 | struct sctp_chunk *chunk) |
@@ -816,7 +816,7 @@ static void sctp_cmd_process_operr(sctp_cmd_seq_t *cmds, | |||
816 | } | 816 | } |
817 | 817 | ||
818 | /* Process variable FWDTSN chunk information. */ | 818 | /* Process variable FWDTSN chunk information. */ |
819 | static void sctp_cmd_process_fwdtsn(struct sctp_ulpq *ulpq, | 819 | static void sctp_cmd_process_fwdtsn(struct sctp_ulpq *ulpq, |
820 | struct sctp_chunk *chunk) | 820 | struct sctp_chunk *chunk) |
821 | { | 821 | { |
822 | struct sctp_fwdtsn_skip *skip; | 822 | struct sctp_fwdtsn_skip *skip; |
@@ -828,9 +828,9 @@ static void sctp_cmd_process_fwdtsn(struct sctp_ulpq *ulpq, | |||
828 | return; | 828 | return; |
829 | } | 829 | } |
830 | 830 | ||
831 | /* Helper function to remove the association non-primary peer | 831 | /* Helper function to remove the association non-primary peer |
832 | * transports. | 832 | * transports. |
833 | */ | 833 | */ |
834 | static void sctp_cmd_del_non_primary(struct sctp_association *asoc) | 834 | static void sctp_cmd_del_non_primary(struct sctp_association *asoc) |
835 | { | 835 | { |
836 | struct sctp_transport *t; | 836 | struct sctp_transport *t; |
@@ -840,7 +840,7 @@ static void sctp_cmd_del_non_primary(struct sctp_association *asoc) | |||
840 | list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { | 840 | list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { |
841 | t = list_entry(pos, struct sctp_transport, transports); | 841 | t = list_entry(pos, struct sctp_transport, transports); |
842 | if (!sctp_cmp_addr_exact(&t->ipaddr, | 842 | if (!sctp_cmp_addr_exact(&t->ipaddr, |
843 | &asoc->peer.primary_addr)) { | 843 | &asoc->peer.primary_addr)) { |
844 | sctp_assoc_del_peer(asoc, &t->ipaddr); | 844 | sctp_assoc_del_peer(asoc, &t->ipaddr); |
845 | } | 845 | } |
846 | } | 846 | } |
@@ -915,7 +915,7 @@ int sctp_do_sm(sctp_event_t event_type, sctp_subtype_t subtype, | |||
915 | DEBUG_POST; | 915 | DEBUG_POST; |
916 | 916 | ||
917 | error = sctp_side_effects(event_type, subtype, state, | 917 | error = sctp_side_effects(event_type, subtype, state, |
918 | ep, asoc, event_arg, status, | 918 | ep, asoc, event_arg, status, |
919 | &commands, gfp); | 919 | &commands, gfp); |
920 | DEBUG_POST_SFX; | 920 | DEBUG_POST_SFX; |
921 | 921 | ||
@@ -968,7 +968,7 @@ static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, | |||
968 | error = -ENOMEM; | 968 | error = -ENOMEM; |
969 | break; | 969 | break; |
970 | 970 | ||
971 | case SCTP_DISPOSITION_DELETE_TCB: | 971 | case SCTP_DISPOSITION_DELETE_TCB: |
972 | /* This should now be a command. */ | 972 | /* This should now be a command. */ |
973 | break; | 973 | break; |
974 | 974 | ||
@@ -1021,7 +1021,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
1021 | struct sctp_endpoint *ep, | 1021 | struct sctp_endpoint *ep, |
1022 | struct sctp_association *asoc, | 1022 | struct sctp_association *asoc, |
1023 | void *event_arg, | 1023 | void *event_arg, |
1024 | sctp_disposition_t status, | 1024 | sctp_disposition_t status, |
1025 | sctp_cmd_seq_t *commands, | 1025 | sctp_cmd_seq_t *commands, |
1026 | gfp_t gfp) | 1026 | gfp_t gfp) |
1027 | { | 1027 | { |
@@ -1057,7 +1057,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
1057 | case SCTP_CMD_NEW_ASOC: | 1057 | case SCTP_CMD_NEW_ASOC: |
1058 | /* Register a new association. */ | 1058 | /* Register a new association. */ |
1059 | if (local_cork) { | 1059 | if (local_cork) { |
1060 | sctp_outq_uncork(&asoc->outqueue); | 1060 | sctp_outq_uncork(&asoc->outqueue); |
1061 | local_cork = 0; | 1061 | local_cork = 0; |
1062 | } | 1062 | } |
1063 | asoc = cmd->obj.ptr; | 1063 | asoc = cmd->obj.ptr; |
@@ -1074,7 +1074,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
1074 | sctp_outq_teardown(&asoc->outqueue); | 1074 | sctp_outq_teardown(&asoc->outqueue); |
1075 | break; | 1075 | break; |
1076 | 1076 | ||
1077 | case SCTP_CMD_DELETE_TCB: | 1077 | case SCTP_CMD_DELETE_TCB: |
1078 | if (local_cork) { | 1078 | if (local_cork) { |
1079 | sctp_outq_uncork(&asoc->outqueue); | 1079 | sctp_outq_uncork(&asoc->outqueue); |
1080 | local_cork = 0; | 1080 | local_cork = 0; |
@@ -1104,7 +1104,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
1104 | 1104 | ||
1105 | case SCTP_CMD_PROCESS_FWDTSN: | 1105 | case SCTP_CMD_PROCESS_FWDTSN: |
1106 | sctp_cmd_process_fwdtsn(&asoc->ulpq, cmd->obj.ptr); | 1106 | sctp_cmd_process_fwdtsn(&asoc->ulpq, cmd->obj.ptr); |
1107 | break; | 1107 | break; |
1108 | 1108 | ||
1109 | case SCTP_CMD_GEN_SACK: | 1109 | case SCTP_CMD_GEN_SACK: |
1110 | /* Generate a Selective ACK. | 1110 | /* Generate a Selective ACK. |
@@ -1162,12 +1162,12 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
1162 | SCTP_CHUNK(cmd->obj.ptr)); | 1162 | SCTP_CHUNK(cmd->obj.ptr)); |
1163 | 1163 | ||
1164 | /* FIXME - Eventually come up with a cleaner way to | 1164 | /* FIXME - Eventually come up with a cleaner way to |
1165 | * enabling COOKIE-ECHO + DATA bundling during | 1165 | * enabling COOKIE-ECHO + DATA bundling during |
1166 | * multihoming stale cookie scenarios, the following | 1166 | * multihoming stale cookie scenarios, the following |
1167 | * command plays with asoc->peer.retran_path to | 1167 | * command plays with asoc->peer.retran_path to |
1168 | * avoid the problem of sending the COOKIE-ECHO and | 1168 | * avoid the problem of sending the COOKIE-ECHO and |
1169 | * DATA in different paths, which could result | 1169 | * DATA in different paths, which could result |
1170 | * in the association being ABORTed if the DATA chunk | 1170 | * in the association being ABORTed if the DATA chunk |
1171 | * is processed first by the server. Checking the | 1171 | * is processed first by the server. Checking the |
1172 | * init error counter simply causes this command | 1172 | * init error counter simply causes this command |
1173 | * to be executed only during failed attempts of | 1173 | * to be executed only during failed attempts of |
@@ -1177,7 +1177,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
1177 | asoc->peer.primary_path) && | 1177 | asoc->peer.primary_path) && |
1178 | (asoc->init_err_counter > 0)) { | 1178 | (asoc->init_err_counter > 0)) { |
1179 | sctp_add_cmd_sf(commands, | 1179 | sctp_add_cmd_sf(commands, |
1180 | SCTP_CMD_FORCE_PRIM_RETRAN, | 1180 | SCTP_CMD_FORCE_PRIM_RETRAN, |
1181 | SCTP_NULL()); | 1181 | SCTP_NULL()); |
1182 | } | 1182 | } |
1183 | 1183 | ||
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index fbbc9e6a3b78..b3cad8a03736 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
@@ -189,7 +189,7 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep, | |||
189 | 0, 0, 0, GFP_ATOMIC); | 189 | 0, 0, 0, GFP_ATOMIC); |
190 | if (ev) | 190 | if (ev) |
191 | sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, | 191 | sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, |
192 | SCTP_ULPEVENT(ev)); | 192 | SCTP_ULPEVENT(ev)); |
193 | 193 | ||
194 | /* Upon reception of the SHUTDOWN COMPLETE chunk the endpoint | 194 | /* Upon reception of the SHUTDOWN COMPLETE chunk the endpoint |
195 | * will verify that it is in SHUTDOWN-ACK-SENT state, if it is | 195 | * will verify that it is in SHUTDOWN-ACK-SENT state, if it is |
@@ -228,7 +228,7 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep, | |||
228 | * Verification Tag field to Tag_A, and also provide its own | 228 | * Verification Tag field to Tag_A, and also provide its own |
229 | * Verification Tag (Tag_Z) in the Initiate Tag field. | 229 | * Verification Tag (Tag_Z) in the Initiate Tag field. |
230 | * | 230 | * |
231 | * Verification Tag: Must be 0. | 231 | * Verification Tag: Must be 0. |
232 | * | 232 | * |
233 | * Inputs | 233 | * Inputs |
234 | * (endpoint, asoc, chunk) | 234 | * (endpoint, asoc, chunk) |
@@ -256,7 +256,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep, | |||
256 | /* 6.10 Bundling | 256 | /* 6.10 Bundling |
257 | * An endpoint MUST NOT bundle INIT, INIT ACK or | 257 | * An endpoint MUST NOT bundle INIT, INIT ACK or |
258 | * SHUTDOWN COMPLETE with any other chunks. | 258 | * SHUTDOWN COMPLETE with any other chunks. |
259 | * | 259 | * |
260 | * IG Section 2.11.2 | 260 | * IG Section 2.11.2 |
261 | * Furthermore, we require that the receiver of an INIT chunk MUST | 261 | * Furthermore, we require that the receiver of an INIT chunk MUST |
262 | * enforce these rules by silently discarding an arriving packet | 262 | * enforce these rules by silently discarding an arriving packet |
@@ -282,7 +282,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep, | |||
282 | return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands); | 282 | return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands); |
283 | 283 | ||
284 | /* 3.1 A packet containing an INIT chunk MUST have a zero Verification | 284 | /* 3.1 A packet containing an INIT chunk MUST have a zero Verification |
285 | * Tag. | 285 | * Tag. |
286 | */ | 286 | */ |
287 | if (chunk->sctp_hdr->vtag != 0) | 287 | if (chunk->sctp_hdr->vtag != 0) |
288 | return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands); | 288 | return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands); |
@@ -326,7 +326,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep, | |||
326 | } | 326 | } |
327 | } | 327 | } |
328 | 328 | ||
329 | /* Grab the INIT header. */ | 329 | /* Grab the INIT header. */ |
330 | chunk->subh.init_hdr = (sctp_inithdr_t *)chunk->skb->data; | 330 | chunk->subh.init_hdr = (sctp_inithdr_t *)chunk->skb->data; |
331 | 331 | ||
332 | /* Tag the variable length parameters. */ | 332 | /* Tag the variable length parameters. */ |
@@ -594,7 +594,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep, | |||
594 | /* "Decode" the chunk. We have no optional parameters so we | 594 | /* "Decode" the chunk. We have no optional parameters so we |
595 | * are in good shape. | 595 | * are in good shape. |
596 | */ | 596 | */ |
597 | chunk->subh.cookie_hdr = | 597 | chunk->subh.cookie_hdr = |
598 | (struct sctp_signed_cookie *)chunk->skb->data; | 598 | (struct sctp_signed_cookie *)chunk->skb->data; |
599 | if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) - | 599 | if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) - |
600 | sizeof(sctp_chunkhdr_t))) | 600 | sizeof(sctp_chunkhdr_t))) |
@@ -665,7 +665,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep, | |||
665 | if (!ev) | 665 | if (!ev) |
666 | goto nomem_ev; | 666 | goto nomem_ev; |
667 | 667 | ||
668 | /* Sockets API Draft Section 5.3.1.6 | 668 | /* Sockets API Draft Section 5.3.1.6 |
669 | * When a peer sends a Adaptation Layer Indication parameter , SCTP | 669 | * When a peer sends a Adaptation Layer Indication parameter , SCTP |
670 | * delivers this notification to inform the application that of the | 670 | * delivers this notification to inform the application that of the |
671 | * peers requested adaptation layer. | 671 | * peers requested adaptation layer. |
@@ -891,7 +891,7 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep, | |||
891 | sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMER_UPDATE, | 891 | sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMER_UPDATE, |
892 | SCTP_TRANSPORT(transport)); | 892 | SCTP_TRANSPORT(transport)); |
893 | 893 | ||
894 | return SCTP_DISPOSITION_CONSUME; | 894 | return SCTP_DISPOSITION_CONSUME; |
895 | } | 895 | } |
896 | 896 | ||
897 | /* | 897 | /* |
@@ -1280,7 +1280,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init( | |||
1280 | return sctp_sf_pdiscard(ep, asoc, type, arg, commands); | 1280 | return sctp_sf_pdiscard(ep, asoc, type, arg, commands); |
1281 | 1281 | ||
1282 | /* 3.1 A packet containing an INIT chunk MUST have a zero Verification | 1282 | /* 3.1 A packet containing an INIT chunk MUST have a zero Verification |
1283 | * Tag. | 1283 | * Tag. |
1284 | */ | 1284 | */ |
1285 | if (chunk->sctp_hdr->vtag != 0) | 1285 | if (chunk->sctp_hdr->vtag != 0) |
1286 | return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands); | 1286 | return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands); |
@@ -1548,7 +1548,7 @@ sctp_disposition_t sctp_sf_do_5_2_3_initack(const struct sctp_endpoint *ep, | |||
1548 | /* Per the above section, we'll discard the chunk if we have an | 1548 | /* Per the above section, we'll discard the chunk if we have an |
1549 | * endpoint. If this is an OOTB INIT-ACK, treat it as such. | 1549 | * endpoint. If this is an OOTB INIT-ACK, treat it as such. |
1550 | */ | 1550 | */ |
1551 | if (ep == sctp_sk((sctp_get_ctl_sock()))->ep) | 1551 | if (ep == sctp_sk((sctp_get_ctl_sock()))->ep) |
1552 | return sctp_sf_ootb(ep, asoc, type, arg, commands); | 1552 | return sctp_sf_ootb(ep, asoc, type, arg, commands); |
1553 | else | 1553 | else |
1554 | return sctp_sf_discard_chunk(ep, asoc, type, arg, commands); | 1554 | return sctp_sf_discard_chunk(ep, asoc, type, arg, commands); |
@@ -1760,9 +1760,9 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep, | |||
1760 | 1760 | ||
1761 | /* Clarification from Implementor's Guide: | 1761 | /* Clarification from Implementor's Guide: |
1762 | * D) When both local and remote tags match the endpoint should | 1762 | * D) When both local and remote tags match the endpoint should |
1763 | * enter the ESTABLISHED state, if it is in the COOKIE-ECHOED state. | 1763 | * enter the ESTABLISHED state, if it is in the COOKIE-ECHOED state. |
1764 | * It should stop any cookie timer that may be running and send | 1764 | * It should stop any cookie timer that may be running and send |
1765 | * a COOKIE ACK. | 1765 | * a COOKIE ACK. |
1766 | */ | 1766 | */ |
1767 | 1767 | ||
1768 | /* Don't accidentally move back into established state. */ | 1768 | /* Don't accidentally move back into established state. */ |
@@ -1786,7 +1786,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep, | |||
1786 | SCTP_COMM_UP, 0, | 1786 | SCTP_COMM_UP, 0, |
1787 | asoc->c.sinit_num_ostreams, | 1787 | asoc->c.sinit_num_ostreams, |
1788 | asoc->c.sinit_max_instreams, | 1788 | asoc->c.sinit_max_instreams, |
1789 | GFP_ATOMIC); | 1789 | GFP_ATOMIC); |
1790 | if (!ev) | 1790 | if (!ev) |
1791 | goto nomem; | 1791 | goto nomem; |
1792 | 1792 | ||
@@ -1870,7 +1870,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep, | |||
1870 | /* "Decode" the chunk. We have no optional parameters so we | 1870 | /* "Decode" the chunk. We have no optional parameters so we |
1871 | * are in good shape. | 1871 | * are in good shape. |
1872 | */ | 1872 | */ |
1873 | chunk->subh.cookie_hdr = (struct sctp_signed_cookie *)chunk->skb->data; | 1873 | chunk->subh.cookie_hdr = (struct sctp_signed_cookie *)chunk->skb->data; |
1874 | if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) - | 1874 | if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) - |
1875 | sizeof(sctp_chunkhdr_t))) | 1875 | sizeof(sctp_chunkhdr_t))) |
1876 | goto nomem; | 1876 | goto nomem; |
@@ -1936,7 +1936,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep, | |||
1936 | default: /* Discard packet for all others. */ | 1936 | default: /* Discard packet for all others. */ |
1937 | retval = sctp_sf_pdiscard(ep, asoc, type, arg, commands); | 1937 | retval = sctp_sf_pdiscard(ep, asoc, type, arg, commands); |
1938 | break; | 1938 | break; |
1939 | }; | 1939 | }; |
1940 | 1940 | ||
1941 | /* Delete the tempory new association. */ | 1941 | /* Delete the tempory new association. */ |
1942 | sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc)); | 1942 | sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc)); |
@@ -2083,7 +2083,7 @@ sctp_disposition_t sctp_sf_cookie_echoed_err(const struct sctp_endpoint *ep, | |||
2083 | */ | 2083 | */ |
2084 | sctp_walk_errors(err, chunk->chunk_hdr) { | 2084 | sctp_walk_errors(err, chunk->chunk_hdr) { |
2085 | if (SCTP_ERROR_STALE_COOKIE == err->cause) | 2085 | if (SCTP_ERROR_STALE_COOKIE == err->cause) |
2086 | return sctp_sf_do_5_2_6_stale(ep, asoc, type, | 2086 | return sctp_sf_do_5_2_6_stale(ep, asoc, type, |
2087 | arg, commands); | 2087 | arg, commands); |
2088 | } | 2088 | } |
2089 | 2089 | ||
@@ -2185,10 +2185,10 @@ static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep, | |||
2185 | */ | 2185 | */ |
2186 | sctp_add_cmd_sf(commands, SCTP_CMD_DEL_NON_PRIMARY, SCTP_NULL()); | 2186 | sctp_add_cmd_sf(commands, SCTP_CMD_DEL_NON_PRIMARY, SCTP_NULL()); |
2187 | 2187 | ||
2188 | /* If we've sent any data bundled with COOKIE-ECHO we will need to | 2188 | /* If we've sent any data bundled with COOKIE-ECHO we will need to |
2189 | * resend | 2189 | * resend |
2190 | */ | 2190 | */ |
2191 | sctp_add_cmd_sf(commands, SCTP_CMD_RETRAN, | 2191 | sctp_add_cmd_sf(commands, SCTP_CMD_RETRAN, |
2192 | SCTP_TRANSPORT(asoc->peer.primary_path)); | 2192 | SCTP_TRANSPORT(asoc->peer.primary_path)); |
2193 | 2193 | ||
2194 | /* Cast away the const modifier, as we want to just | 2194 | /* Cast away the const modifier, as we want to just |
@@ -2274,7 +2274,7 @@ sctp_disposition_t sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep, | |||
2274 | error = ((sctp_errhdr_t *)chunk->skb->data)->cause; | 2274 | error = ((sctp_errhdr_t *)chunk->skb->data)->cause; |
2275 | 2275 | ||
2276 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET)); | 2276 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET)); |
2277 | /* ASSOC_FAILED will DELETE_TCB. */ | 2277 | /* ASSOC_FAILED will DELETE_TCB. */ |
2278 | sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, SCTP_PERR(error)); | 2278 | sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, SCTP_PERR(error)); |
2279 | SCTP_INC_STATS(SCTP_MIB_ABORTEDS); | 2279 | SCTP_INC_STATS(SCTP_MIB_ABORTEDS); |
2280 | SCTP_DEC_STATS(SCTP_MIB_CURRESTAB); | 2280 | SCTP_DEC_STATS(SCTP_MIB_CURRESTAB); |
@@ -2439,7 +2439,7 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep, | |||
2439 | ev = sctp_ulpevent_make_shutdown_event(asoc, 0, GFP_ATOMIC); | 2439 | ev = sctp_ulpevent_make_shutdown_event(asoc, 0, GFP_ATOMIC); |
2440 | if (!ev) { | 2440 | if (!ev) { |
2441 | disposition = SCTP_DISPOSITION_NOMEM; | 2441 | disposition = SCTP_DISPOSITION_NOMEM; |
2442 | goto out; | 2442 | goto out; |
2443 | } | 2443 | } |
2444 | sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev)); | 2444 | sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev)); |
2445 | 2445 | ||
@@ -2553,7 +2553,7 @@ sctp_disposition_t sctp_sf_do_ecn_cwr(const struct sctp_endpoint *ep, | |||
2553 | if (!sctp_chunk_length_valid(chunk, sizeof(sctp_ecne_chunk_t))) | 2553 | if (!sctp_chunk_length_valid(chunk, sizeof(sctp_ecne_chunk_t))) |
2554 | return sctp_sf_violation_chunklen(ep, asoc, type, arg, | 2554 | return sctp_sf_violation_chunklen(ep, asoc, type, arg, |
2555 | commands); | 2555 | commands); |
2556 | 2556 | ||
2557 | cwr = (sctp_cwrhdr_t *) chunk->skb->data; | 2557 | cwr = (sctp_cwrhdr_t *) chunk->skb->data; |
2558 | skb_pull(chunk->skb, sizeof(sctp_cwrhdr_t)); | 2558 | skb_pull(chunk->skb, sizeof(sctp_cwrhdr_t)); |
2559 | 2559 | ||
@@ -2661,7 +2661,7 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep, | |||
2661 | sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG, | 2661 | sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG, |
2662 | SCTP_NULL()); | 2662 | SCTP_NULL()); |
2663 | return sctp_sf_pdiscard(ep, asoc, type, arg, commands); | 2663 | return sctp_sf_pdiscard(ep, asoc, type, arg, commands); |
2664 | } | 2664 | } |
2665 | 2665 | ||
2666 | if (!sctp_chunk_length_valid(chunk, sizeof(sctp_data_chunk_t))) | 2666 | if (!sctp_chunk_length_valid(chunk, sizeof(sctp_data_chunk_t))) |
2667 | return sctp_sf_violation_chunklen(ep, asoc, type, arg, | 2667 | return sctp_sf_violation_chunklen(ep, asoc, type, arg, |
@@ -2743,7 +2743,7 @@ discard_noforce: | |||
2743 | return SCTP_DISPOSITION_DISCARD; | 2743 | return SCTP_DISPOSITION_DISCARD; |
2744 | consume: | 2744 | consume: |
2745 | return SCTP_DISPOSITION_CONSUME; | 2745 | return SCTP_DISPOSITION_CONSUME; |
2746 | 2746 | ||
2747 | } | 2747 | } |
2748 | 2748 | ||
2749 | /* | 2749 | /* |
@@ -2930,7 +2930,7 @@ sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep, | |||
2930 | /* Make an ABORT. The T bit will be set if the asoc | 2930 | /* Make an ABORT. The T bit will be set if the asoc |
2931 | * is NULL. | 2931 | * is NULL. |
2932 | */ | 2932 | */ |
2933 | abort = sctp_make_abort(asoc, chunk, 0); | 2933 | abort = sctp_make_abort(asoc, chunk, 0); |
2934 | if (!abort) { | 2934 | if (!abort) { |
2935 | sctp_ootb_pkt_free(packet); | 2935 | sctp_ootb_pkt_free(packet); |
2936 | return SCTP_DISPOSITION_NOMEM; | 2936 | return SCTP_DISPOSITION_NOMEM; |
@@ -2994,7 +2994,7 @@ sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep, | |||
2994 | } | 2994 | } |
2995 | 2995 | ||
2996 | sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR, | 2996 | sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR, |
2997 | SCTP_CHUNK(chunk)); | 2997 | SCTP_CHUNK(chunk)); |
2998 | } | 2998 | } |
2999 | return SCTP_DISPOSITION_CONSUME; | 2999 | return SCTP_DISPOSITION_CONSUME; |
3000 | 3000 | ||
@@ -3128,7 +3128,7 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep, | |||
3128 | */ | 3128 | */ |
3129 | if (SCTP_CID_ABORT == ch->type) | 3129 | if (SCTP_CID_ABORT == ch->type) |
3130 | return sctp_sf_pdiscard(ep, asoc, type, arg, commands); | 3130 | return sctp_sf_pdiscard(ep, asoc, type, arg, commands); |
3131 | 3131 | ||
3132 | ch = (sctp_chunkhdr_t *) ch_end; | 3132 | ch = (sctp_chunkhdr_t *) ch_end; |
3133 | } while (ch_end < skb->tail); | 3133 | } while (ch_end < skb->tail); |
3134 | 3134 | ||
@@ -3175,8 +3175,8 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep, | |||
3175 | 3175 | ||
3176 | if (packet) { | 3176 | if (packet) { |
3177 | /* Make an SHUTDOWN_COMPLETE. | 3177 | /* Make an SHUTDOWN_COMPLETE. |
3178 | * The T bit will be set if the asoc is NULL. | 3178 | * The T bit will be set if the asoc is NULL. |
3179 | */ | 3179 | */ |
3180 | shut = sctp_make_shutdown_complete(asoc, chunk); | 3180 | shut = sctp_make_shutdown_complete(asoc, chunk); |
3181 | if (!shut) { | 3181 | if (!shut) { |
3182 | sctp_ootb_pkt_free(packet); | 3182 | sctp_ootb_pkt_free(packet); |
@@ -3261,10 +3261,10 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep, | |||
3261 | 3261 | ||
3262 | /* ADDIP 4.2 C1) Compare the value of the serial number to the value | 3262 | /* ADDIP 4.2 C1) Compare the value of the serial number to the value |
3263 | * the endpoint stored in a new association variable | 3263 | * the endpoint stored in a new association variable |
3264 | * 'Peer-Serial-Number'. | 3264 | * 'Peer-Serial-Number'. |
3265 | */ | 3265 | */ |
3266 | if (serial == asoc->peer.addip_serial + 1) { | 3266 | if (serial == asoc->peer.addip_serial + 1) { |
3267 | /* ADDIP 4.2 C2) If the value found in the serial number is | 3267 | /* ADDIP 4.2 C2) If the value found in the serial number is |
3268 | * equal to the ('Peer-Serial-Number' + 1), the endpoint MUST | 3268 | * equal to the ('Peer-Serial-Number' + 1), the endpoint MUST |
3269 | * do V1-V5. | 3269 | * do V1-V5. |
3270 | */ | 3270 | */ |
@@ -3285,9 +3285,9 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep, | |||
3285 | else | 3285 | else |
3286 | return SCTP_DISPOSITION_DISCARD; | 3286 | return SCTP_DISPOSITION_DISCARD; |
3287 | } else { | 3287 | } else { |
3288 | /* ADDIP 4.2 C4) Otherwise, the ASCONF Chunk is discarded since | 3288 | /* ADDIP 4.2 C4) Otherwise, the ASCONF Chunk is discarded since |
3289 | * it must be either a stale packet or from an attacker. | 3289 | * it must be either a stale packet or from an attacker. |
3290 | */ | 3290 | */ |
3291 | return SCTP_DISPOSITION_DISCARD; | 3291 | return SCTP_DISPOSITION_DISCARD; |
3292 | } | 3292 | } |
3293 | 3293 | ||
@@ -3296,7 +3296,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep, | |||
3296 | * being responded to. | 3296 | * being responded to. |
3297 | */ | 3297 | */ |
3298 | sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(asconf_ack)); | 3298 | sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(asconf_ack)); |
3299 | 3299 | ||
3300 | return SCTP_DISPOSITION_CONSUME; | 3300 | return SCTP_DISPOSITION_CONSUME; |
3301 | } | 3301 | } |
3302 | 3302 | ||
@@ -3307,7 +3307,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep, | |||
3307 | */ | 3307 | */ |
3308 | sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep, | 3308 | sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep, |
3309 | const struct sctp_association *asoc, | 3309 | const struct sctp_association *asoc, |
3310 | const sctp_subtype_t type, void *arg, | 3310 | const sctp_subtype_t type, void *arg, |
3311 | sctp_cmd_seq_t *commands) | 3311 | sctp_cmd_seq_t *commands) |
3312 | { | 3312 | { |
3313 | struct sctp_chunk *asconf_ack = arg; | 3313 | struct sctp_chunk *asconf_ack = arg; |
@@ -3359,7 +3359,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep, | |||
3359 | SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO)); | 3359 | SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO)); |
3360 | sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL()); | 3360 | sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL()); |
3361 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, | 3361 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, |
3362 | SCTP_ERROR(ECONNABORTED)); | 3362 | SCTP_ERROR(ECONNABORTED)); |
3363 | sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, | 3363 | sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, |
3364 | SCTP_PERR(SCTP_ERROR_ASCONF_ACK)); | 3364 | SCTP_PERR(SCTP_ERROR_ASCONF_ACK)); |
3365 | SCTP_INC_STATS(SCTP_MIB_ABORTEDS); | 3365 | SCTP_INC_STATS(SCTP_MIB_ABORTEDS); |
@@ -3387,7 +3387,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep, | |||
3387 | */ | 3387 | */ |
3388 | sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL()); | 3388 | sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL()); |
3389 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, | 3389 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, |
3390 | SCTP_ERROR(ECONNABORTED)); | 3390 | SCTP_ERROR(ECONNABORTED)); |
3391 | sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, | 3391 | sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, |
3392 | SCTP_PERR(SCTP_ERROR_ASCONF_ACK)); | 3392 | SCTP_PERR(SCTP_ERROR_ASCONF_ACK)); |
3393 | SCTP_INC_STATS(SCTP_MIB_ABORTEDS); | 3393 | SCTP_INC_STATS(SCTP_MIB_ABORTEDS); |
@@ -3451,17 +3451,17 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn(const struct sctp_endpoint *ep, | |||
3451 | 3451 | ||
3452 | sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn)); | 3452 | sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn)); |
3453 | if (len > sizeof(struct sctp_fwdtsn_hdr)) | 3453 | if (len > sizeof(struct sctp_fwdtsn_hdr)) |
3454 | sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN, | 3454 | sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN, |
3455 | SCTP_CHUNK(chunk)); | 3455 | SCTP_CHUNK(chunk)); |
3456 | 3456 | ||
3457 | /* Count this as receiving DATA. */ | 3457 | /* Count this as receiving DATA. */ |
3458 | if (asoc->autoclose) { | 3458 | if (asoc->autoclose) { |
3459 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, | 3459 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, |
3460 | SCTP_TO(SCTP_EVENT_TIMEOUT_AUTOCLOSE)); | 3460 | SCTP_TO(SCTP_EVENT_TIMEOUT_AUTOCLOSE)); |
3461 | } | 3461 | } |
3462 | 3462 | ||
3463 | /* FIXME: For now send a SACK, but DATA processing may | 3463 | /* FIXME: For now send a SACK, but DATA processing may |
3464 | * send another. | 3464 | * send another. |
3465 | */ | 3465 | */ |
3466 | sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_NOFORCE()); | 3466 | sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_NOFORCE()); |
3467 | 3467 | ||
@@ -3511,9 +3511,9 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn_fast( | |||
3511 | 3511 | ||
3512 | sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn)); | 3512 | sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn)); |
3513 | if (len > sizeof(struct sctp_fwdtsn_hdr)) | 3513 | if (len > sizeof(struct sctp_fwdtsn_hdr)) |
3514 | sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN, | 3514 | sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN, |
3515 | SCTP_CHUNK(chunk)); | 3515 | SCTP_CHUNK(chunk)); |
3516 | 3516 | ||
3517 | /* Go a head and force a SACK, since we are shutting down. */ | 3517 | /* Go a head and force a SACK, since we are shutting down. */ |
3518 | gen_shutdown: | 3518 | gen_shutdown: |
3519 | /* Implementor's Guide. | 3519 | /* Implementor's Guide. |
@@ -3527,7 +3527,7 @@ gen_shutdown: | |||
3527 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, | 3527 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, |
3528 | SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); | 3528 | SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); |
3529 | 3529 | ||
3530 | return SCTP_DISPOSITION_CONSUME; | 3530 | return SCTP_DISPOSITION_CONSUME; |
3531 | } | 3531 | } |
3532 | 3532 | ||
3533 | /* | 3533 | /* |
@@ -3706,7 +3706,7 @@ sctp_disposition_t sctp_sf_violation(const struct sctp_endpoint *ep, | |||
3706 | * if it's length is set to be smaller then the size of sctp_sack_chunk_t. | 3706 | * if it's length is set to be smaller then the size of sctp_sack_chunk_t. |
3707 | * | 3707 | * |
3708 | * We inform the other end by sending an ABORT with a Protocol Violation | 3708 | * We inform the other end by sending an ABORT with a Protocol Violation |
3709 | * error code. | 3709 | * error code. |
3710 | * | 3710 | * |
3711 | * Section: Not specified | 3711 | * Section: Not specified |
3712 | * Verification Tag: Nothing to do | 3712 | * Verification Tag: Nothing to do |
@@ -3747,7 +3747,7 @@ static sctp_disposition_t sctp_sf_violation_chunklen( | |||
3747 | SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION)); | 3747 | SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION)); |
3748 | } else { | 3748 | } else { |
3749 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, | 3749 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, |
3750 | SCTP_ERROR(ECONNABORTED)); | 3750 | SCTP_ERROR(ECONNABORTED)); |
3751 | sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, | 3751 | sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, |
3752 | SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION)); | 3752 | SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION)); |
3753 | SCTP_DEC_STATS(SCTP_MIB_CURRESTAB); | 3753 | SCTP_DEC_STATS(SCTP_MIB_CURRESTAB); |
@@ -3756,7 +3756,7 @@ static sctp_disposition_t sctp_sf_violation_chunklen( | |||
3756 | sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL()); | 3756 | sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL()); |
3757 | 3757 | ||
3758 | SCTP_INC_STATS(SCTP_MIB_ABORTEDS); | 3758 | SCTP_INC_STATS(SCTP_MIB_ABORTEDS); |
3759 | 3759 | ||
3760 | return SCTP_DISPOSITION_ABORT; | 3760 | return SCTP_DISPOSITION_ABORT; |
3761 | 3761 | ||
3762 | nomem: | 3762 | nomem: |
@@ -4437,7 +4437,7 @@ sctp_disposition_t sctp_sf_do_9_2_start_shutdown( | |||
4437 | /* sctp-implguide 2.10 Issues with Heartbeating and failover | 4437 | /* sctp-implguide 2.10 Issues with Heartbeating and failover |
4438 | * | 4438 | * |
4439 | * HEARTBEAT ... is discontinued after sending either SHUTDOWN | 4439 | * HEARTBEAT ... is discontinued after sending either SHUTDOWN |
4440 | * or SHUTDOWN-ACK. | 4440 | * or SHUTDOWN-ACK. |
4441 | */ | 4441 | */ |
4442 | sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL()); | 4442 | sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL()); |
4443 | 4443 | ||
@@ -4515,7 +4515,7 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown_ack( | |||
4515 | /* sctp-implguide 2.10 Issues with Heartbeating and failover | 4515 | /* sctp-implguide 2.10 Issues with Heartbeating and failover |
4516 | * | 4516 | * |
4517 | * HEARTBEAT ... is discontinued after sending either SHUTDOWN | 4517 | * HEARTBEAT ... is discontinued after sending either SHUTDOWN |
4518 | * or SHUTDOWN-ACK. | 4518 | * or SHUTDOWN-ACK. |
4519 | */ | 4519 | */ |
4520 | sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL()); | 4520 | sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL()); |
4521 | 4521 | ||
@@ -4874,7 +4874,7 @@ sctp_disposition_t sctp_sf_t4_timer_expire( | |||
4874 | /* ADDIP 4.1 B4) Re-transmit the ASCONF Chunk last sent and if possible | 4874 | /* ADDIP 4.1 B4) Re-transmit the ASCONF Chunk last sent and if possible |
4875 | * choose an alternate destination address (please refer to RFC2960 | 4875 | * choose an alternate destination address (please refer to RFC2960 |
4876 | * [5] section 6.4.1). An endpoint MUST NOT add new parameters to this | 4876 | * [5] section 6.4.1). An endpoint MUST NOT add new parameters to this |
4877 | * chunk, it MUST be the same (including its serial number) as the last | 4877 | * chunk, it MUST be the same (including its serial number) as the last |
4878 | * ASCONF sent. | 4878 | * ASCONF sent. |
4879 | */ | 4879 | */ |
4880 | sctp_chunk_hold(asoc->addip_last_asconf); | 4880 | sctp_chunk_hold(asoc->addip_last_asconf); |
@@ -4953,7 +4953,7 @@ sctp_disposition_t sctp_sf_autoclose_timer_expire( | |||
4953 | /* sctpimpguide-05 Section 2.12.2 | 4953 | /* sctpimpguide-05 Section 2.12.2 |
4954 | * The sender of the SHUTDOWN MAY also start an overall guard timer | 4954 | * The sender of the SHUTDOWN MAY also start an overall guard timer |
4955 | * 'T5-shutdown-guard' to bound the overall time for shutdown sequence. | 4955 | * 'T5-shutdown-guard' to bound the overall time for shutdown sequence. |
4956 | */ | 4956 | */ |
4957 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START, | 4957 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START, |
4958 | SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD)); | 4958 | SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD)); |
4959 | disposition = SCTP_DISPOSITION_CONSUME; | 4959 | disposition = SCTP_DISPOSITION_CONSUME; |
@@ -5127,7 +5127,7 @@ static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc | |||
5127 | vtag = ntohl(init->init_hdr.init_tag); | 5127 | vtag = ntohl(init->init_hdr.init_tag); |
5128 | break; | 5128 | break; |
5129 | } | 5129 | } |
5130 | default: | 5130 | default: |
5131 | vtag = ntohl(chunk->sctp_hdr->vtag); | 5131 | vtag = ntohl(chunk->sctp_hdr->vtag); |
5132 | break; | 5132 | break; |
5133 | } | 5133 | } |
@@ -5176,7 +5176,7 @@ static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep, | |||
5176 | /* Override the OOTB vtag from the cookie. */ | 5176 | /* Override the OOTB vtag from the cookie. */ |
5177 | cookie = chunk->subh.cookie_hdr; | 5177 | cookie = chunk->subh.cookie_hdr; |
5178 | packet->vtag = cookie->c.peer_vtag; | 5178 | packet->vtag = cookie->c.peer_vtag; |
5179 | 5179 | ||
5180 | /* Set the skb to the belonging sock for accounting. */ | 5180 | /* Set the skb to the belonging sock for accounting. */ |
5181 | err_chunk->skb->sk = ep->base.sk; | 5181 | err_chunk->skb->sk = ep->base.sk; |
5182 | sctp_packet_append_chunk(packet, err_chunk); | 5182 | sctp_packet_append_chunk(packet, err_chunk); |
@@ -5310,7 +5310,7 @@ static int sctp_eat_data(const struct sctp_association *asoc, | |||
5310 | sctp_add_cmd_sf(commands, SCTP_CMD_PART_DELIVER, SCTP_NULL()); | 5310 | sctp_add_cmd_sf(commands, SCTP_CMD_PART_DELIVER, SCTP_NULL()); |
5311 | } | 5311 | } |
5312 | 5312 | ||
5313 | /* Spill over rwnd a little bit. Note: While allowed, this spill over | 5313 | /* Spill over rwnd a little bit. Note: While allowed, this spill over |
5314 | * seems a bit troublesome in that frag_point varies based on | 5314 | * seems a bit troublesome in that frag_point varies based on |
5315 | * PMTU. In cases, such as loopback, this might be a rather | 5315 | * PMTU. In cases, such as loopback, this might be a rather |
5316 | * large spill over. | 5316 | * large spill over. |
diff --git a/net/sctp/sm_statetable.c b/net/sctp/sm_statetable.c index 5f6cc7aa661b..5e54b17377f4 100644 --- a/net/sctp/sm_statetable.c +++ b/net/sctp/sm_statetable.c | |||
@@ -954,7 +954,7 @@ static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][S | |||
954 | TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE, | 954 | TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE, |
955 | }; | 955 | }; |
956 | 956 | ||
957 | static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, | 957 | static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, |
958 | sctp_state_t state) | 958 | sctp_state_t state) |
959 | { | 959 | { |
960 | if (state > SCTP_STATE_MAX) | 960 | if (state > SCTP_STATE_MAX) |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 388d0fb1a377..536298c2eda2 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -381,12 +381,12 @@ SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len) | |||
381 | 381 | ||
382 | /* ADDIP Section 4.1.1 Congestion Control of ASCONF Chunks | 382 | /* ADDIP Section 4.1.1 Congestion Control of ASCONF Chunks |
383 | * | 383 | * |
384 | * R1) One and only one ASCONF Chunk MAY be in transit and unacknowledged | 384 | * R1) One and only one ASCONF Chunk MAY be in transit and unacknowledged |
385 | * at any one time. If a sender, after sending an ASCONF chunk, decides | 385 | * at any one time. If a sender, after sending an ASCONF chunk, decides |
386 | * it needs to transfer another ASCONF Chunk, it MUST wait until the | 386 | * it needs to transfer another ASCONF Chunk, it MUST wait until the |
387 | * ASCONF-ACK Chunk returns from the previous ASCONF Chunk before sending a | 387 | * ASCONF-ACK Chunk returns from the previous ASCONF Chunk before sending a |
388 | * subsequent ASCONF. Note this restriction binds each side, so at any | 388 | * subsequent ASCONF. Note this restriction binds each side, so at any |
389 | * time two ASCONF may be in-transit on any given association (one sent | 389 | * time two ASCONF may be in-transit on any given association (one sent |
390 | * from each endpoint). | 390 | * from each endpoint). |
391 | */ | 391 | */ |
392 | static int sctp_send_asconf(struct sctp_association *asoc, | 392 | static int sctp_send_asconf(struct sctp_association *asoc, |
@@ -396,10 +396,10 @@ static int sctp_send_asconf(struct sctp_association *asoc, | |||
396 | 396 | ||
397 | /* If there is an outstanding ASCONF chunk, queue it for later | 397 | /* If there is an outstanding ASCONF chunk, queue it for later |
398 | * transmission. | 398 | * transmission. |
399 | */ | 399 | */ |
400 | if (asoc->addip_last_asconf) { | 400 | if (asoc->addip_last_asconf) { |
401 | list_add_tail(&chunk->list, &asoc->addip_chunk_list); | 401 | list_add_tail(&chunk->list, &asoc->addip_chunk_list); |
402 | goto out; | 402 | goto out; |
403 | } | 403 | } |
404 | 404 | ||
405 | /* Hold the chunk until an ASCONF_ACK is received. */ | 405 | /* Hold the chunk until an ASCONF_ACK is received. */ |
@@ -449,7 +449,7 @@ int sctp_bindx_add(struct sock *sk, struct sockaddr *addrs, int addrcnt) | |||
449 | goto err_bindx_add; | 449 | goto err_bindx_add; |
450 | } | 450 | } |
451 | 451 | ||
452 | retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr, | 452 | retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr, |
453 | af->sockaddr_len); | 453 | af->sockaddr_len); |
454 | 454 | ||
455 | addr_buf += af->sockaddr_len; | 455 | addr_buf += af->sockaddr_len; |
@@ -470,13 +470,13 @@ err_bindx_add: | |||
470 | * associations that are part of the endpoint indicating that a list of local | 470 | * associations that are part of the endpoint indicating that a list of local |
471 | * addresses are added to the endpoint. | 471 | * addresses are added to the endpoint. |
472 | * | 472 | * |
473 | * If any of the addresses is already in the bind address list of the | 473 | * If any of the addresses is already in the bind address list of the |
474 | * association, we do not send the chunk for that association. But it will not | 474 | * association, we do not send the chunk for that association. But it will not |
475 | * affect other associations. | 475 | * affect other associations. |
476 | * | 476 | * |
477 | * Only sctp_setsockopt_bindx() is supposed to call this function. | 477 | * Only sctp_setsockopt_bindx() is supposed to call this function. |
478 | */ | 478 | */ |
479 | static int sctp_send_asconf_add_ip(struct sock *sk, | 479 | static int sctp_send_asconf_add_ip(struct sock *sk, |
480 | struct sockaddr *addrs, | 480 | struct sockaddr *addrs, |
481 | int addrcnt) | 481 | int addrcnt) |
482 | { | 482 | { |
@@ -517,8 +517,8 @@ static int sctp_send_asconf_add_ip(struct sock *sk, | |||
517 | continue; | 517 | continue; |
518 | 518 | ||
519 | /* Check if any address in the packed array of addresses is | 519 | /* Check if any address in the packed array of addresses is |
520 | * in the bind address list of the association. If so, | 520 | * in the bind address list of the association. If so, |
521 | * do not send the asconf chunk to its peer, but continue with | 521 | * do not send the asconf chunk to its peer, but continue with |
522 | * other associations. | 522 | * other associations. |
523 | */ | 523 | */ |
524 | addr_buf = addrs; | 524 | addr_buf = addrs; |
@@ -664,7 +664,7 @@ err_bindx_rem: | |||
664 | * the associations that are part of the endpoint indicating that a list of | 664 | * the associations that are part of the endpoint indicating that a list of |
665 | * local addresses are removed from the endpoint. | 665 | * local addresses are removed from the endpoint. |
666 | * | 666 | * |
667 | * If any of the addresses is already in the bind address list of the | 667 | * If any of the addresses is already in the bind address list of the |
668 | * association, we do not send the chunk for that association. But it will not | 668 | * association, we do not send the chunk for that association. But it will not |
669 | * affect other associations. | 669 | * affect other associations. |
670 | * | 670 | * |
@@ -710,7 +710,7 @@ static int sctp_send_asconf_del_ip(struct sock *sk, | |||
710 | continue; | 710 | continue; |
711 | 711 | ||
712 | /* Check if any address in the packed array of addresses is | 712 | /* Check if any address in the packed array of addresses is |
713 | * not present in the bind address list of the association. | 713 | * not present in the bind address list of the association. |
714 | * If so, do not send the asconf chunk to its peer, but | 714 | * If so, do not send the asconf chunk to its peer, but |
715 | * continue with other associations. | 715 | * continue with other associations. |
716 | */ | 716 | */ |
@@ -898,7 +898,7 @@ SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk, | |||
898 | return -EFAULT; | 898 | return -EFAULT; |
899 | } | 899 | } |
900 | 900 | ||
901 | /* Walk through the addrs buffer and count the number of addresses. */ | 901 | /* Walk through the addrs buffer and count the number of addresses. */ |
902 | addr_buf = kaddrs; | 902 | addr_buf = kaddrs; |
903 | while (walk_size < addrs_size) { | 903 | while (walk_size < addrs_size) { |
904 | sa_addr = (struct sockaddr *)addr_buf; | 904 | sa_addr = (struct sockaddr *)addr_buf; |
@@ -906,7 +906,7 @@ SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk, | |||
906 | 906 | ||
907 | /* If the address family is not supported or if this address | 907 | /* If the address family is not supported or if this address |
908 | * causes the address buffer to overflow return EINVAL. | 908 | * causes the address buffer to overflow return EINVAL. |
909 | */ | 909 | */ |
910 | if (!af || (walk_size + af->sockaddr_len) > addrs_size) { | 910 | if (!af || (walk_size + af->sockaddr_len) > addrs_size) { |
911 | kfree(kaddrs); | 911 | kfree(kaddrs); |
912 | return -EINVAL; | 912 | return -EINVAL; |
@@ -935,7 +935,7 @@ SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk, | |||
935 | default: | 935 | default: |
936 | err = -EINVAL; | 936 | err = -EINVAL; |
937 | break; | 937 | break; |
938 | }; | 938 | }; |
939 | 939 | ||
940 | out: | 940 | out: |
941 | kfree(kaddrs); | 941 | kfree(kaddrs); |
@@ -1035,10 +1035,10 @@ static int __sctp_connect(struct sock* sk, | |||
1035 | } | 1035 | } |
1036 | } else { | 1036 | } else { |
1037 | /* | 1037 | /* |
1038 | * If an unprivileged user inherits a 1-many | 1038 | * If an unprivileged user inherits a 1-many |
1039 | * style socket with open associations on a | 1039 | * style socket with open associations on a |
1040 | * privileged port, it MAY be permitted to | 1040 | * privileged port, it MAY be permitted to |
1041 | * accept new associations, but it SHOULD NOT | 1041 | * accept new associations, but it SHOULD NOT |
1042 | * be permitted to open new associations. | 1042 | * be permitted to open new associations. |
1043 | */ | 1043 | */ |
1044 | if (ep->base.bind_addr.port < PROT_SOCK && | 1044 | if (ep->base.bind_addr.port < PROT_SOCK && |
@@ -1094,8 +1094,8 @@ static int __sctp_connect(struct sock* sk, | |||
1094 | out_free: | 1094 | out_free: |
1095 | 1095 | ||
1096 | SCTP_DEBUG_PRINTK("About to exit __sctp_connect() free asoc: %p" | 1096 | SCTP_DEBUG_PRINTK("About to exit __sctp_connect() free asoc: %p" |
1097 | " kaddrs: %p err: %d\n", | 1097 | " kaddrs: %p err: %d\n", |
1098 | asoc, kaddrs, err); | 1098 | asoc, kaddrs, err); |
1099 | if (asoc) | 1099 | if (asoc) |
1100 | sctp_association_free(asoc); | 1100 | sctp_association_free(asoc); |
1101 | return err; | 1101 | return err; |
@@ -1435,7 +1435,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
1435 | * length messages when SCTP_EOF|SCTP_ABORT is not set. | 1435 | * length messages when SCTP_EOF|SCTP_ABORT is not set. |
1436 | * If SCTP_ABORT is set, the message length could be non zero with | 1436 | * If SCTP_ABORT is set, the message length could be non zero with |
1437 | * the msg_iov set to the user abort reason. | 1437 | * the msg_iov set to the user abort reason. |
1438 | */ | 1438 | */ |
1439 | if (((sinfo_flags & SCTP_EOF) && (msg_len > 0)) || | 1439 | if (((sinfo_flags & SCTP_EOF) && (msg_len > 0)) || |
1440 | (!(sinfo_flags & (SCTP_EOF|SCTP_ABORT)) && (msg_len == 0))) { | 1440 | (!(sinfo_flags & (SCTP_EOF|SCTP_ABORT)) && (msg_len == 0))) { |
1441 | err = -EINVAL; | 1441 | err = -EINVAL; |
@@ -1599,7 +1599,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
1599 | = sinit->sinit_max_attempts; | 1599 | = sinit->sinit_max_attempts; |
1600 | } | 1600 | } |
1601 | if (sinit->sinit_max_init_timeo) { | 1601 | if (sinit->sinit_max_init_timeo) { |
1602 | asoc->max_init_timeo = | 1602 | asoc->max_init_timeo = |
1603 | msecs_to_jiffies(sinit->sinit_max_init_timeo); | 1603 | msecs_to_jiffies(sinit->sinit_max_init_timeo); |
1604 | } | 1604 | } |
1605 | } | 1605 | } |
@@ -2298,7 +2298,7 @@ static int sctp_setsockopt_delayed_ack_time(struct sock *sk, | |||
2298 | /* Get association, if assoc_id != 0 and the socket is a one | 2298 | /* Get association, if assoc_id != 0 and the socket is a one |
2299 | * to many style socket, and an association was not found, then | 2299 | * to many style socket, and an association was not found, then |
2300 | * the id was invalid. | 2300 | * the id was invalid. |
2301 | */ | 2301 | */ |
2302 | asoc = sctp_id2assoc(sk, params.assoc_id); | 2302 | asoc = sctp_id2assoc(sk, params.assoc_id); |
2303 | if (!asoc && params.assoc_id && sctp_style(sk, UDP)) | 2303 | if (!asoc && params.assoc_id && sctp_style(sk, UDP)) |
2304 | return -EINVAL; | 2304 | return -EINVAL; |
@@ -2307,22 +2307,22 @@ static int sctp_setsockopt_delayed_ack_time(struct sock *sk, | |||
2307 | if (asoc) { | 2307 | if (asoc) { |
2308 | asoc->sackdelay = | 2308 | asoc->sackdelay = |
2309 | msecs_to_jiffies(params.assoc_value); | 2309 | msecs_to_jiffies(params.assoc_value); |
2310 | asoc->param_flags = | 2310 | asoc->param_flags = |
2311 | (asoc->param_flags & ~SPP_SACKDELAY) | | 2311 | (asoc->param_flags & ~SPP_SACKDELAY) | |
2312 | SPP_SACKDELAY_ENABLE; | 2312 | SPP_SACKDELAY_ENABLE; |
2313 | } else { | 2313 | } else { |
2314 | sp->sackdelay = params.assoc_value; | 2314 | sp->sackdelay = params.assoc_value; |
2315 | sp->param_flags = | 2315 | sp->param_flags = |
2316 | (sp->param_flags & ~SPP_SACKDELAY) | | 2316 | (sp->param_flags & ~SPP_SACKDELAY) | |
2317 | SPP_SACKDELAY_ENABLE; | 2317 | SPP_SACKDELAY_ENABLE; |
2318 | } | 2318 | } |
2319 | } else { | 2319 | } else { |
2320 | if (asoc) { | 2320 | if (asoc) { |
2321 | asoc->param_flags = | 2321 | asoc->param_flags = |
2322 | (asoc->param_flags & ~SPP_SACKDELAY) | | 2322 | (asoc->param_flags & ~SPP_SACKDELAY) | |
2323 | SPP_SACKDELAY_DISABLE; | 2323 | SPP_SACKDELAY_DISABLE; |
2324 | } else { | 2324 | } else { |
2325 | sp->param_flags = | 2325 | sp->param_flags = |
2326 | (sp->param_flags & ~SPP_SACKDELAY) | | 2326 | (sp->param_flags & ~SPP_SACKDELAY) | |
2327 | SPP_SACKDELAY_DISABLE; | 2327 | SPP_SACKDELAY_DISABLE; |
2328 | } | 2328 | } |
@@ -2338,17 +2338,17 @@ static int sctp_setsockopt_delayed_ack_time(struct sock *sk, | |||
2338 | if (params.assoc_value) { | 2338 | if (params.assoc_value) { |
2339 | trans->sackdelay = | 2339 | trans->sackdelay = |
2340 | msecs_to_jiffies(params.assoc_value); | 2340 | msecs_to_jiffies(params.assoc_value); |
2341 | trans->param_flags = | 2341 | trans->param_flags = |
2342 | (trans->param_flags & ~SPP_SACKDELAY) | | 2342 | (trans->param_flags & ~SPP_SACKDELAY) | |
2343 | SPP_SACKDELAY_ENABLE; | 2343 | SPP_SACKDELAY_ENABLE; |
2344 | } else { | 2344 | } else { |
2345 | trans->param_flags = | 2345 | trans->param_flags = |
2346 | (trans->param_flags & ~SPP_SACKDELAY) | | 2346 | (trans->param_flags & ~SPP_SACKDELAY) | |
2347 | SPP_SACKDELAY_DISABLE; | 2347 | SPP_SACKDELAY_DISABLE; |
2348 | } | 2348 | } |
2349 | } | 2349 | } |
2350 | } | 2350 | } |
2351 | 2351 | ||
2352 | return 0; | 2352 | return 0; |
2353 | } | 2353 | } |
2354 | 2354 | ||
@@ -2374,13 +2374,13 @@ static int sctp_setsockopt_initmsg(struct sock *sk, char __user *optval, int opt | |||
2374 | return -EFAULT; | 2374 | return -EFAULT; |
2375 | 2375 | ||
2376 | if (sinit.sinit_num_ostreams) | 2376 | if (sinit.sinit_num_ostreams) |
2377 | sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams; | 2377 | sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams; |
2378 | if (sinit.sinit_max_instreams) | 2378 | if (sinit.sinit_max_instreams) |
2379 | sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams; | 2379 | sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams; |
2380 | if (sinit.sinit_max_attempts) | 2380 | if (sinit.sinit_max_attempts) |
2381 | sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts; | 2381 | sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts; |
2382 | if (sinit.sinit_max_init_timeo) | 2382 | if (sinit.sinit_max_init_timeo) |
2383 | sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo; | 2383 | sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo; |
2384 | 2384 | ||
2385 | return 0; | 2385 | return 0; |
2386 | } | 2386 | } |
@@ -2511,7 +2511,7 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, int opt | |||
2511 | 2511 | ||
2512 | if (asoc) { | 2512 | if (asoc) { |
2513 | if (rtoinfo.srto_initial != 0) | 2513 | if (rtoinfo.srto_initial != 0) |
2514 | asoc->rto_initial = | 2514 | asoc->rto_initial = |
2515 | msecs_to_jiffies(rtoinfo.srto_initial); | 2515 | msecs_to_jiffies(rtoinfo.srto_initial); |
2516 | if (rtoinfo.srto_max != 0) | 2516 | if (rtoinfo.srto_max != 0) |
2517 | asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max); | 2517 | asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max); |
@@ -2665,7 +2665,7 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, int optl | |||
2665 | /* Update the frag_point of the existing associations. */ | 2665 | /* Update the frag_point of the existing associations. */ |
2666 | list_for_each(pos, &(sp->ep->asocs)) { | 2666 | list_for_each(pos, &(sp->ep->asocs)) { |
2667 | asoc = list_entry(pos, struct sctp_association, asocs); | 2667 | asoc = list_entry(pos, struct sctp_association, asocs); |
2668 | asoc->frag_point = sctp_frag_point(sp, asoc->pathmtu); | 2668 | asoc->frag_point = sctp_frag_point(sp, asoc->pathmtu); |
2669 | } | 2669 | } |
2670 | 2670 | ||
2671 | return 0; | 2671 | return 0; |
@@ -2703,7 +2703,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optva | |||
2703 | return -EFAULT; | 2703 | return -EFAULT; |
2704 | 2704 | ||
2705 | asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); | 2705 | asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); |
2706 | if (!asoc) | 2706 | if (!asoc) |
2707 | return -EINVAL; | 2707 | return -EINVAL; |
2708 | 2708 | ||
2709 | if (!asoc->peer.asconf_capable) | 2709 | if (!asoc->peer.asconf_capable) |
@@ -3015,7 +3015,7 @@ SCTP_STATIC struct sock *sctp_accept(struct sock *sk, int flags, int *err) | |||
3015 | 3015 | ||
3016 | out: | 3016 | out: |
3017 | sctp_release_sock(sk); | 3017 | sctp_release_sock(sk); |
3018 | *err = error; | 3018 | *err = error; |
3019 | return newsk; | 3019 | return newsk; |
3020 | } | 3020 | } |
3021 | 3021 | ||
@@ -3087,7 +3087,7 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk) | |||
3087 | sp->assocparams.sasoc_cookie_life = sctp_valid_cookie_life; | 3087 | sp->assocparams.sasoc_cookie_life = sctp_valid_cookie_life; |
3088 | 3088 | ||
3089 | /* Initialize default event subscriptions. By default, all the | 3089 | /* Initialize default event subscriptions. By default, all the |
3090 | * options are off. | 3090 | * options are off. |
3091 | */ | 3091 | */ |
3092 | memset(&sp->subscribe, 0, sizeof(struct sctp_event_subscribe)); | 3092 | memset(&sp->subscribe, 0, sizeof(struct sctp_event_subscribe)); |
3093 | 3093 | ||
@@ -3099,8 +3099,8 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk) | |||
3099 | sp->pathmtu = 0; // allow default discovery | 3099 | sp->pathmtu = 0; // allow default discovery |
3100 | sp->sackdelay = sctp_sack_timeout; | 3100 | sp->sackdelay = sctp_sack_timeout; |
3101 | sp->param_flags = SPP_HB_ENABLE | | 3101 | sp->param_flags = SPP_HB_ENABLE | |
3102 | SPP_PMTUD_ENABLE | | 3102 | SPP_PMTUD_ENABLE | |
3103 | SPP_SACKDELAY_ENABLE; | 3103 | SPP_SACKDELAY_ENABLE; |
3104 | 3104 | ||
3105 | /* If enabled no SCTP message fragmentation will be performed. | 3105 | /* If enabled no SCTP message fragmentation will be performed. |
3106 | * Configure through SCTP_DISABLE_FRAGMENTS socket option. | 3106 | * Configure through SCTP_DISABLE_FRAGMENTS socket option. |
@@ -3680,7 +3680,7 @@ static int sctp_getsockopt_delayed_ack_time(struct sock *sk, int len, | |||
3680 | /* Get association, if assoc_id != 0 and the socket is a one | 3680 | /* Get association, if assoc_id != 0 and the socket is a one |
3681 | * to many style socket, and an association was not found, then | 3681 | * to many style socket, and an association was not found, then |
3682 | * the id was invalid. | 3682 | * the id was invalid. |
3683 | */ | 3683 | */ |
3684 | asoc = sctp_id2assoc(sk, params.assoc_id); | 3684 | asoc = sctp_id2assoc(sk, params.assoc_id); |
3685 | if (!asoc && params.assoc_id && sctp_style(sk, UDP)) | 3685 | if (!asoc && params.assoc_id && sctp_style(sk, UDP)) |
3686 | return -EINVAL; | 3686 | return -EINVAL; |
@@ -3756,7 +3756,7 @@ static int sctp_getsockopt_peer_addrs_num_old(struct sock *sk, int len, | |||
3756 | return cnt; | 3756 | return cnt; |
3757 | } | 3757 | } |
3758 | 3758 | ||
3759 | /* | 3759 | /* |
3760 | * Old API for getting list of peer addresses. Does not work for 32-bit | 3760 | * Old API for getting list of peer addresses. Does not work for 32-bit |
3761 | * programs running on a 64-bit kernel | 3761 | * programs running on a 64-bit kernel |
3762 | */ | 3762 | */ |
@@ -3833,7 +3833,7 @@ static int sctp_getsockopt_peer_addrs(struct sock *sk, int len, | |||
3833 | return -EINVAL; | 3833 | return -EINVAL; |
3834 | 3834 | ||
3835 | to = optval + offsetof(struct sctp_getaddrs,addrs); | 3835 | to = optval + offsetof(struct sctp_getaddrs,addrs); |
3836 | space_left = len - sizeof(struct sctp_getaddrs) - | 3836 | space_left = len - sizeof(struct sctp_getaddrs) - |
3837 | offsetof(struct sctp_getaddrs,addrs); | 3837 | offsetof(struct sctp_getaddrs,addrs); |
3838 | 3838 | ||
3839 | list_for_each(pos, &asoc->peer.transport_addr_list) { | 3839 | list_for_each(pos, &asoc->peer.transport_addr_list) { |
@@ -3907,7 +3907,7 @@ static int sctp_getsockopt_local_addrs_num_old(struct sock *sk, int len, | |||
3907 | addr = list_entry(pos, | 3907 | addr = list_entry(pos, |
3908 | struct sctp_sockaddr_entry, | 3908 | struct sctp_sockaddr_entry, |
3909 | list); | 3909 | list); |
3910 | if ((PF_INET == sk->sk_family) && | 3910 | if ((PF_INET == sk->sk_family) && |
3911 | (AF_INET6 == addr->a.sa.sa_family)) | 3911 | (AF_INET6 == addr->a.sa.sa_family)) |
3912 | continue; | 3912 | continue; |
3913 | cnt++; | 3913 | cnt++; |
@@ -3941,7 +3941,7 @@ static int sctp_copy_laddrs_to_user_old(struct sock *sk, __u16 port, int max_add | |||
3941 | 3941 | ||
3942 | list_for_each_safe(pos, next, &sctp_local_addr_list) { | 3942 | list_for_each_safe(pos, next, &sctp_local_addr_list) { |
3943 | addr = list_entry(pos, struct sctp_sockaddr_entry, list); | 3943 | addr = list_entry(pos, struct sctp_sockaddr_entry, list); |
3944 | if ((PF_INET == sk->sk_family) && | 3944 | if ((PF_INET == sk->sk_family) && |
3945 | (AF_INET6 == addr->a.sa.sa_family)) | 3945 | (AF_INET6 == addr->a.sa.sa_family)) |
3946 | continue; | 3946 | continue; |
3947 | memcpy(&temp, &addr->a, sizeof(temp)); | 3947 | memcpy(&temp, &addr->a, sizeof(temp)); |
@@ -3970,7 +3970,7 @@ static int sctp_copy_laddrs_to_user(struct sock *sk, __u16 port, | |||
3970 | 3970 | ||
3971 | list_for_each_safe(pos, next, &sctp_local_addr_list) { | 3971 | list_for_each_safe(pos, next, &sctp_local_addr_list) { |
3972 | addr = list_entry(pos, struct sctp_sockaddr_entry, list); | 3972 | addr = list_entry(pos, struct sctp_sockaddr_entry, list); |
3973 | if ((PF_INET == sk->sk_family) && | 3973 | if ((PF_INET == sk->sk_family) && |
3974 | (AF_INET6 == addr->a.sa.sa_family)) | 3974 | (AF_INET6 == addr->a.sa.sa_family)) |
3975 | continue; | 3975 | continue; |
3976 | memcpy(&temp, &addr->a, sizeof(temp)); | 3976 | memcpy(&temp, &addr->a, sizeof(temp)); |
@@ -4051,7 +4051,7 @@ static int sctp_getsockopt_local_addrs_old(struct sock *sk, int len, | |||
4051 | err = cnt; | 4051 | err = cnt; |
4052 | goto unlock; | 4052 | goto unlock; |
4053 | } | 4053 | } |
4054 | goto copy_getaddrs; | 4054 | goto copy_getaddrs; |
4055 | } | 4055 | } |
4056 | } | 4056 | } |
4057 | 4057 | ||
@@ -4139,7 +4139,7 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len, | |||
4139 | err = cnt; | 4139 | err = cnt; |
4140 | goto unlock; | 4140 | goto unlock; |
4141 | } | 4141 | } |
4142 | goto copy_getaddrs; | 4142 | goto copy_getaddrs; |
4143 | } | 4143 | } |
4144 | } | 4144 | } |
4145 | 4145 | ||
@@ -4196,7 +4196,7 @@ static int sctp_getsockopt_primary_addr(struct sock *sk, int len, | |||
4196 | 4196 | ||
4197 | if (!asoc->peer.primary_path) | 4197 | if (!asoc->peer.primary_path) |
4198 | return -ENOTCONN; | 4198 | return -ENOTCONN; |
4199 | 4199 | ||
4200 | memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr, | 4200 | memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr, |
4201 | asoc->peer.primary_path->af_specific->sockaddr_len); | 4201 | asoc->peer.primary_path->af_specific->sockaddr_len); |
4202 | 4202 | ||
@@ -4864,7 +4864,7 @@ SCTP_STATIC int sctp_seqpacket_listen(struct sock *sk, int backlog) | |||
4864 | if (!backlog) { | 4864 | if (!backlog) { |
4865 | if (sctp_sstate(sk, CLOSED)) | 4865 | if (sctp_sstate(sk, CLOSED)) |
4866 | return 0; | 4866 | return 0; |
4867 | 4867 | ||
4868 | sctp_unhash_endpoint(ep); | 4868 | sctp_unhash_endpoint(ep); |
4869 | sk->sk_state = SCTP_SS_CLOSED; | 4869 | sk->sk_state = SCTP_SS_CLOSED; |
4870 | } | 4870 | } |
@@ -4872,7 +4872,7 @@ SCTP_STATIC int sctp_seqpacket_listen(struct sock *sk, int backlog) | |||
4872 | /* Return if we are already listening. */ | 4872 | /* Return if we are already listening. */ |
4873 | if (sctp_sstate(sk, LISTENING)) | 4873 | if (sctp_sstate(sk, LISTENING)) |
4874 | return 0; | 4874 | return 0; |
4875 | 4875 | ||
4876 | /* | 4876 | /* |
4877 | * If a bind() or sctp_bindx() is not called prior to a listen() | 4877 | * If a bind() or sctp_bindx() is not called prior to a listen() |
4878 | * call that allows new associations to be accepted, the system | 4878 | * call that allows new associations to be accepted, the system |
@@ -4907,7 +4907,7 @@ SCTP_STATIC int sctp_stream_listen(struct sock *sk, int backlog) | |||
4907 | if (!backlog) { | 4907 | if (!backlog) { |
4908 | if (sctp_sstate(sk, CLOSED)) | 4908 | if (sctp_sstate(sk, CLOSED)) |
4909 | return 0; | 4909 | return 0; |
4910 | 4910 | ||
4911 | sctp_unhash_endpoint(ep); | 4911 | sctp_unhash_endpoint(ep); |
4912 | sk->sk_state = SCTP_SS_CLOSED; | 4912 | sk->sk_state = SCTP_SS_CLOSED; |
4913 | } | 4913 | } |
@@ -5010,7 +5010,7 @@ unsigned int sctp_poll(struct file *file, struct socket *sock, poll_table *wait) | |||
5010 | */ | 5010 | */ |
5011 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) | 5011 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) |
5012 | return (!list_empty(&sp->ep->asocs)) ? | 5012 | return (!list_empty(&sp->ep->asocs)) ? |
5013 | (POLLIN | POLLRDNORM) : 0; | 5013 | (POLLIN | POLLRDNORM) : 0; |
5014 | 5014 | ||
5015 | mask = 0; | 5015 | mask = 0; |
5016 | 5016 | ||
@@ -5430,7 +5430,7 @@ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p, | |||
5430 | DEFINE_WAIT(wait); | 5430 | DEFINE_WAIT(wait); |
5431 | 5431 | ||
5432 | SCTP_DEBUG_PRINTK("wait_for_sndbuf: asoc=%p, timeo=%ld, msg_len=%zu\n", | 5432 | SCTP_DEBUG_PRINTK("wait_for_sndbuf: asoc=%p, timeo=%ld, msg_len=%zu\n", |
5433 | asoc, (long)(*timeo_p), msg_len); | 5433 | asoc, (long)(*timeo_p), msg_len); |
5434 | 5434 | ||
5435 | /* Increment the association's refcnt. */ | 5435 | /* Increment the association's refcnt. */ |
5436 | sctp_association_hold(asoc); | 5436 | sctp_association_hold(asoc); |
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index 3e5936a5f671..a596f5308cb1 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c | |||
@@ -130,9 +130,9 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, | |||
130 | struct sctp_transport *sctp_transport_new(const union sctp_addr *addr, | 130 | struct sctp_transport *sctp_transport_new(const union sctp_addr *addr, |
131 | gfp_t gfp) | 131 | gfp_t gfp) |
132 | { | 132 | { |
133 | struct sctp_transport *transport; | 133 | struct sctp_transport *transport; |
134 | 134 | ||
135 | transport = t_new(struct sctp_transport, gfp); | 135 | transport = t_new(struct sctp_transport, gfp); |
136 | if (!transport) | 136 | if (!transport) |
137 | goto fail; | 137 | goto fail; |
138 | 138 | ||
@@ -185,7 +185,7 @@ static void sctp_transport_destroy(struct sctp_transport *transport) | |||
185 | if (transport->asoc) | 185 | if (transport->asoc) |
186 | sctp_association_put(transport->asoc); | 186 | sctp_association_put(transport->asoc); |
187 | 187 | ||
188 | sctp_packet_free(&transport->packet); | 188 | sctp_packet_free(&transport->packet); |
189 | 189 | ||
190 | dst_release(transport->dst); | 190 | dst_release(transport->dst); |
191 | kfree(transport); | 191 | kfree(transport); |
@@ -268,7 +268,7 @@ void sctp_transport_route(struct sctp_transport *transport, | |||
268 | 268 | ||
269 | /* Initialize sk->sk_rcv_saddr, if the transport is the | 269 | /* Initialize sk->sk_rcv_saddr, if the transport is the |
270 | * association's active path for getsockname(). | 270 | * association's active path for getsockname(). |
271 | */ | 271 | */ |
272 | if (asoc && (transport == asoc->peer.active_path)) | 272 | if (asoc && (transport == asoc->peer.active_path)) |
273 | opt->pf->af->to_sk_saddr(&transport->saddr, | 273 | opt->pf->af->to_sk_saddr(&transport->saddr, |
274 | asoc->base.sk); | 274 | asoc->base.sk); |
@@ -459,8 +459,8 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport, | |||
459 | * destination address(es) to which the missing DATA chunks | 459 | * destination address(es) to which the missing DATA chunks |
460 | * were last sent, according to the formula described in | 460 | * were last sent, according to the formula described in |
461 | * Section 7.2.3. | 461 | * Section 7.2.3. |
462 | * | 462 | * |
463 | * RFC 2960 7.2.3, sctpimpguide Upon detection of packet | 463 | * RFC 2960 7.2.3, sctpimpguide Upon detection of packet |
464 | * losses from SACK (see Section 7.2.4), An endpoint | 464 | * losses from SACK (see Section 7.2.4), An endpoint |
465 | * should do the following: | 465 | * should do the following: |
466 | * ssthresh = max(cwnd/2, 4*MTU) | 466 | * ssthresh = max(cwnd/2, 4*MTU) |
@@ -488,7 +488,7 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport, | |||
488 | if ((jiffies - transport->last_time_ecne_reduced) > | 488 | if ((jiffies - transport->last_time_ecne_reduced) > |
489 | transport->rtt) { | 489 | transport->rtt) { |
490 | transport->ssthresh = max(transport->cwnd/2, | 490 | transport->ssthresh = max(transport->cwnd/2, |
491 | 4*transport->asoc->pathmtu); | 491 | 4*transport->asoc->pathmtu); |
492 | transport->cwnd = transport->ssthresh; | 492 | transport->cwnd = transport->ssthresh; |
493 | transport->last_time_ecne_reduced = jiffies; | 493 | transport->last_time_ecne_reduced = jiffies; |
494 | } | 494 | } |
diff --git a/net/sctp/tsnmap.c b/net/sctp/tsnmap.c index 42d9498c64fa..d3192a1babcc 100644 --- a/net/sctp/tsnmap.c +++ b/net/sctp/tsnmap.c | |||
@@ -277,7 +277,7 @@ static void sctp_tsnmap_update(struct sctp_tsnmap *map) | |||
277 | /* Now tsn_map must have been all '1's, | 277 | /* Now tsn_map must have been all '1's, |
278 | * so we swap the map and check the overflow table | 278 | * so we swap the map and check the overflow table |
279 | */ | 279 | */ |
280 | __u8 *tmp = map->tsn_map; | 280 | __u8 *tmp = map->tsn_map; |
281 | memset(tmp, 0, map->len); | 281 | memset(tmp, 0, map->len); |
282 | map->tsn_map = map->overflow_map; | 282 | map->tsn_map = map->overflow_map; |
283 | map->overflow_map = tmp; | 283 | map->overflow_map = tmp; |
diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c index 445e07a7ac4b..2e11bc8d5d35 100644 --- a/net/sctp/ulpevent.c +++ b/net/sctp/ulpevent.c | |||
@@ -749,7 +749,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_pdapi( | |||
749 | */ | 749 | */ |
750 | pd->pdapi_length = sizeof(struct sctp_pdapi_event); | 750 | pd->pdapi_length = sizeof(struct sctp_pdapi_event); |
751 | 751 | ||
752 | /* pdapi_indication: 32 bits (unsigned integer) | 752 | /* pdapi_indication: 32 bits (unsigned integer) |
753 | * | 753 | * |
754 | * This field holds the indication being sent to the application. | 754 | * This field holds the indication being sent to the application. |
755 | */ | 755 | */ |
@@ -790,13 +790,13 @@ void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event, | |||
790 | return; | 790 | return; |
791 | 791 | ||
792 | /* Sockets API Extensions for SCTP | 792 | /* Sockets API Extensions for SCTP |
793 | * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV) | 793 | * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV) |
794 | * | 794 | * |
795 | * sinfo_stream: 16 bits (unsigned integer) | 795 | * sinfo_stream: 16 bits (unsigned integer) |
796 | * | 796 | * |
797 | * For recvmsg() the SCTP stack places the message's stream number in | 797 | * For recvmsg() the SCTP stack places the message's stream number in |
798 | * this value. | 798 | * this value. |
799 | */ | 799 | */ |
800 | sinfo.sinfo_stream = event->stream; | 800 | sinfo.sinfo_stream = event->stream; |
801 | /* sinfo_ssn: 16 bits (unsigned integer) | 801 | /* sinfo_ssn: 16 bits (unsigned integer) |
802 | * | 802 | * |
@@ -828,7 +828,7 @@ void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event, | |||
828 | sinfo.sinfo_flags = event->flags; | 828 | sinfo.sinfo_flags = event->flags; |
829 | /* sinfo_tsn: 32 bit (unsigned integer) | 829 | /* sinfo_tsn: 32 bit (unsigned integer) |
830 | * | 830 | * |
831 | * For the receiving side, this field holds a TSN that was | 831 | * For the receiving side, this field holds a TSN that was |
832 | * assigned to one of the SCTP Data Chunks. | 832 | * assigned to one of the SCTP Data Chunks. |
833 | */ | 833 | */ |
834 | sinfo.sinfo_tsn = event->tsn; | 834 | sinfo.sinfo_tsn = event->tsn; |
@@ -879,7 +879,7 @@ static void sctp_ulpevent_receive_data(struct sctp_ulpevent *event, | |||
879 | * fragment of the real event. However, we still need to do rwnd | 879 | * fragment of the real event. However, we still need to do rwnd |
880 | * accounting. | 880 | * accounting. |
881 | * In general, the skb passed from IP can have only 1 level of | 881 | * In general, the skb passed from IP can have only 1 level of |
882 | * fragments. But we allow multiple levels of fragments. | 882 | * fragments. But we allow multiple levels of fragments. |
883 | */ | 883 | */ |
884 | for (frag = skb_shinfo(skb)->frag_list; frag; frag = frag->next) { | 884 | for (frag = skb_shinfo(skb)->frag_list; frag; frag = frag->next) { |
885 | sctp_ulpevent_receive_data(sctp_skb2event(frag), asoc); | 885 | sctp_ulpevent_receive_data(sctp_skb2event(frag), asoc); |
@@ -888,7 +888,7 @@ static void sctp_ulpevent_receive_data(struct sctp_ulpevent *event, | |||
888 | 888 | ||
889 | /* Do accounting for bytes just read by user and release the references to | 889 | /* Do accounting for bytes just read by user and release the references to |
890 | * the association. | 890 | * the association. |
891 | */ | 891 | */ |
892 | static void sctp_ulpevent_release_data(struct sctp_ulpevent *event) | 892 | static void sctp_ulpevent_release_data(struct sctp_ulpevent *event) |
893 | { | 893 | { |
894 | struct sk_buff *skb, *frag; | 894 | struct sk_buff *skb, *frag; |
diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c index e1d144275f97..f4759a9bdaee 100644 --- a/net/sctp/ulpqueue.c +++ b/net/sctp/ulpqueue.c | |||
@@ -191,7 +191,7 @@ int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event) | |||
191 | queue = &sk->sk_receive_queue; | 191 | queue = &sk->sk_receive_queue; |
192 | } else if (ulpq->pd_mode) { | 192 | } else if (ulpq->pd_mode) { |
193 | if (event->msg_flags & MSG_NOTIFICATION) | 193 | if (event->msg_flags & MSG_NOTIFICATION) |
194 | queue = &sctp_sk(sk)->pd_lobby; | 194 | queue = &sctp_sk(sk)->pd_lobby; |
195 | else { | 195 | else { |
196 | clear_pd = event->msg_flags & MSG_EOR; | 196 | clear_pd = event->msg_flags & MSG_EOR; |
197 | queue = &sk->sk_receive_queue; | 197 | queue = &sk->sk_receive_queue; |
@@ -298,32 +298,32 @@ static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *qu | |||
298 | */ | 298 | */ |
299 | if (last) | 299 | if (last) |
300 | last->next = pos; | 300 | last->next = pos; |
301 | else { | 301 | else { |
302 | if (skb_cloned(f_frag)) { | 302 | if (skb_cloned(f_frag)) { |
303 | /* This is a cloned skb, we can't just modify | 303 | /* This is a cloned skb, we can't just modify |
304 | * the frag_list. We need a new skb to do that. | 304 | * the frag_list. We need a new skb to do that. |
305 | * Instead of calling skb_unshare(), we'll do it | 305 | * Instead of calling skb_unshare(), we'll do it |
306 | * ourselves since we need to delay the free. | 306 | * ourselves since we need to delay the free. |
307 | */ | 307 | */ |
308 | new = skb_copy(f_frag, GFP_ATOMIC); | 308 | new = skb_copy(f_frag, GFP_ATOMIC); |
309 | if (!new) | 309 | if (!new) |
310 | return NULL; /* try again later */ | 310 | return NULL; /* try again later */ |
311 | 311 | ||
312 | sctp_skb_set_owner_r(new, f_frag->sk); | 312 | sctp_skb_set_owner_r(new, f_frag->sk); |
313 | 313 | ||
314 | skb_shinfo(new)->frag_list = pos; | 314 | skb_shinfo(new)->frag_list = pos; |
315 | } else | 315 | } else |
316 | skb_shinfo(f_frag)->frag_list = pos; | 316 | skb_shinfo(f_frag)->frag_list = pos; |
317 | } | 317 | } |
318 | 318 | ||
319 | /* Remove the first fragment from the reassembly queue. */ | 319 | /* Remove the first fragment from the reassembly queue. */ |
320 | __skb_unlink(f_frag, queue); | 320 | __skb_unlink(f_frag, queue); |
321 | 321 | ||
322 | /* if we did unshare, then free the old skb and re-assign */ | 322 | /* if we did unshare, then free the old skb and re-assign */ |
323 | if (new) { | 323 | if (new) { |
324 | kfree_skb(f_frag); | 324 | kfree_skb(f_frag); |
325 | f_frag = new; | 325 | f_frag = new; |
326 | } | 326 | } |
327 | 327 | ||
328 | while (pos) { | 328 | while (pos) { |
329 | 329 | ||
@@ -335,7 +335,7 @@ static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *qu | |||
335 | 335 | ||
336 | /* Remove the fragment from the reassembly queue. */ | 336 | /* Remove the fragment from the reassembly queue. */ |
337 | __skb_unlink(pos, queue); | 337 | __skb_unlink(pos, queue); |
338 | 338 | ||
339 | /* Break if we have reached the last fragment. */ | 339 | /* Break if we have reached the last fragment. */ |
340 | if (pos == l_frag) | 340 | if (pos == l_frag) |
341 | break; | 341 | break; |
@@ -624,7 +624,7 @@ static inline void sctp_ulpq_store_ordered(struct sctp_ulpq *ulpq, | |||
624 | 624 | ||
625 | sid = event->stream; | 625 | sid = event->stream; |
626 | ssn = event->ssn; | 626 | ssn = event->ssn; |
627 | 627 | ||
628 | cevent = (struct sctp_ulpevent *) pos->cb; | 628 | cevent = (struct sctp_ulpevent *) pos->cb; |
629 | csid = cevent->stream; | 629 | csid = cevent->stream; |
630 | cssn = cevent->ssn; | 630 | cssn = cevent->ssn; |
@@ -718,11 +718,11 @@ static inline void sctp_ulpq_reap_ordered(struct sctp_ulpq *ulpq) | |||
718 | if (cssn != sctp_ssn_peek(in, csid)) | 718 | if (cssn != sctp_ssn_peek(in, csid)) |
719 | break; | 719 | break; |
720 | 720 | ||
721 | /* Found it, so mark in the ssnmap. */ | 721 | /* Found it, so mark in the ssnmap. */ |
722 | sctp_ssn_next(in, csid); | 722 | sctp_ssn_next(in, csid); |
723 | 723 | ||
724 | __skb_unlink(pos, &ulpq->lobby); | 724 | __skb_unlink(pos, &ulpq->lobby); |
725 | if (!event) { | 725 | if (!event) { |
726 | /* Create a temporary list to collect chunks on. */ | 726 | /* Create a temporary list to collect chunks on. */ |
727 | event = sctp_skb2event(pos); | 727 | event = sctp_skb2event(pos); |
728 | __skb_queue_tail(&temp, sctp_event2skb(event)); | 728 | __skb_queue_tail(&temp, sctp_event2skb(event)); |
@@ -755,7 +755,7 @@ void sctp_ulpq_skip(struct sctp_ulpq *ulpq, __u16 sid, __u16 ssn) | |||
755 | sctp_ssn_skip(in, sid, ssn); | 755 | sctp_ssn_skip(in, sid, ssn); |
756 | 756 | ||
757 | /* Go find any other chunks that were waiting for | 757 | /* Go find any other chunks that were waiting for |
758 | * ordering and deliver them if needed. | 758 | * ordering and deliver them if needed. |
759 | */ | 759 | */ |
760 | sctp_ulpq_reap_ordered(ulpq); | 760 | sctp_ulpq_reap_ordered(ulpq); |
761 | return; | 761 | return; |
@@ -849,7 +849,7 @@ void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, | |||
849 | if (chunk) { | 849 | if (chunk) { |
850 | needed = ntohs(chunk->chunk_hdr->length); | 850 | needed = ntohs(chunk->chunk_hdr->length); |
851 | needed -= sizeof(sctp_data_chunk_t); | 851 | needed -= sizeof(sctp_data_chunk_t); |
852 | } else | 852 | } else |
853 | needed = SCTP_DEFAULT_MAXWINDOW; | 853 | needed = SCTP_DEFAULT_MAXWINDOW; |
854 | 854 | ||
855 | freed = 0; | 855 | freed = 0; |
@@ -866,7 +866,7 @@ void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, | |||
866 | tsn = ntohl(chunk->subh.data_hdr->tsn); | 866 | tsn = ntohl(chunk->subh.data_hdr->tsn); |
867 | sctp_tsnmap_mark(&asoc->peer.tsn_map, tsn); | 867 | sctp_tsnmap_mark(&asoc->peer.tsn_map, tsn); |
868 | sctp_ulpq_tail_data(ulpq, chunk, gfp); | 868 | sctp_ulpq_tail_data(ulpq, chunk, gfp); |
869 | 869 | ||
870 | sctp_ulpq_partial_delivery(ulpq, chunk, gfp); | 870 | sctp_ulpq_partial_delivery(ulpq, chunk, gfp); |
871 | } | 871 | } |
872 | 872 | ||