OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [tags/] [linux-2.6/] [linux-2.6.24_or32_unified_v2.3/] [net/] [sctp/] [output.c] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/* SCTP kernel reference Implementation
2
 * (C) Copyright IBM Corp. 2001, 2004
3
 * Copyright (c) 1999-2000 Cisco, Inc.
4
 * Copyright (c) 1999-2001 Motorola, Inc.
5
 *
6
 * This file is part of the SCTP kernel reference Implementation
7
 *
8
 * These functions handle output processing.
9
 *
10
 * The SCTP reference implementation is free software;
11
 * you can redistribute it and/or modify it under the terms of
12
 * the GNU General Public License as published by
13
 * the Free Software Foundation; either version 2, or (at your option)
14
 * any later version.
15
 *
16
 * The SCTP reference implementation is distributed in the hope that it
17
 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
18
 *                 ************************
19
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20
 * See the GNU General Public License for more details.
21
 *
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
24
 * the Free Software Foundation, 59 Temple Place - Suite 330,
25
 * Boston, MA 02111-1307, USA.
26
 *
27
 * Please send any bug reports or fixes you make to the
28
 * email address(es):
29
 *    lksctp developers <lksctp-developers@lists.sourceforge.net>
30
 *
31
 * Or submit a bug report through the following website:
32
 *    http://www.sf.net/projects/lksctp
33
 *
34
 * Written or modified by:
35
 *    La Monte H.P. Yarroll <piggy@acm.org>
36
 *    Karl Knutson          <karl@athena.chicago.il.us>
37
 *    Jon Grimm             <jgrimm@austin.ibm.com>
38
 *    Sridhar Samudrala     <sri@us.ibm.com>
39
 *
40
 * Any bugs reported given to us we will try to fix... any fixes shared will
41
 * be incorporated into the next SCTP release.
42
 */
43
 
44
#include <linux/types.h>
45
#include <linux/kernel.h>
46
#include <linux/wait.h>
47
#include <linux/time.h>
48
#include <linux/ip.h>
49
#include <linux/ipv6.h>
50
#include <linux/init.h>
51
#include <net/inet_ecn.h>
52
#include <net/icmp.h>
53
 
54
#ifndef TEST_FRAME
55
#include <net/tcp.h>
56
#endif /* TEST_FRAME (not defined) */
57
 
58
#include <linux/socket.h> /* for sa_family_t */
59
#include <net/sock.h>
60
 
61
#include <net/sctp/sctp.h>
62
#include <net/sctp/sm.h>
63
 
64
/* Forward declarations for private helpers. */
65
static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet,
66
                                           struct sctp_chunk *chunk);
67
 
68
/* Config a packet.
69
 * This appears to be a followup set of initializations.
70
 */
71
struct sctp_packet *sctp_packet_config(struct sctp_packet *packet,
72
                                       __u32 vtag, int ecn_capable)
73
{
74
        struct sctp_chunk *chunk = NULL;
75
 
76
        SCTP_DEBUG_PRINTK("%s: packet:%p vtag:0x%x\n", __FUNCTION__,
77
                          packet, vtag);
78
 
79
        packet->vtag = vtag;
80
        packet->has_cookie_echo = 0;
81
        packet->has_sack = 0;
82
        packet->has_auth = 0;
83
        packet->has_data = 0;
84
        packet->ipfragok = 0;
85
        packet->auth = NULL;
86
 
87
        if (ecn_capable && sctp_packet_empty(packet)) {
88
                chunk = sctp_get_ecne_prepend(packet->transport->asoc);
89
 
90
                /* If there a is a prepend chunk stick it on the list before
91
                 * any other chunks get appended.
92
                 */
93
                if (chunk)
94
                        sctp_packet_append_chunk(packet, chunk);
95
        }
96
 
97
        return packet;
98
}
99
 
100
/* Initialize the packet structure. */
101
struct sctp_packet *sctp_packet_init(struct sctp_packet *packet,
102
                                     struct sctp_transport *transport,
103
                                     __u16 sport, __u16 dport)
104
{
105
        struct sctp_association *asoc = transport->asoc;
106
        size_t overhead;
107
 
108
        SCTP_DEBUG_PRINTK("%s: packet:%p transport:%p\n", __FUNCTION__,
109
                          packet, transport);
110
 
111
        packet->transport = transport;
112
        packet->source_port = sport;
113
        packet->destination_port = dport;
114
        INIT_LIST_HEAD(&packet->chunk_list);
115
        if (asoc) {
116
                struct sctp_sock *sp = sctp_sk(asoc->base.sk);
117
                overhead = sp->pf->af->net_header_len;
118
        } else {
119
                overhead = sizeof(struct ipv6hdr);
120
        }
121
        overhead += sizeof(struct sctphdr);
122
        packet->overhead = overhead;
123
        packet->size = overhead;
124
        packet->vtag = 0;
125
        packet->has_cookie_echo = 0;
126
        packet->has_sack = 0;
127
        packet->has_auth = 0;
128
        packet->has_data = 0;
129
        packet->ipfragok = 0;
130
        packet->malloced = 0;
131
        packet->auth = NULL;
132
        return packet;
133
}
134
 
135
/* Free a packet.  */
136
void sctp_packet_free(struct sctp_packet *packet)
137
{
138
        struct sctp_chunk *chunk, *tmp;
139
 
140
        SCTP_DEBUG_PRINTK("%s: packet:%p\n", __FUNCTION__, packet);
141
 
142
        list_for_each_entry_safe(chunk, tmp, &packet->chunk_list, list) {
143
                list_del_init(&chunk->list);
144
                sctp_chunk_free(chunk);
145
        }
146
 
147
        if (packet->malloced)
148
                kfree(packet);
149
}
150
 
151
/* This routine tries to append the chunk to the offered packet. If adding
152
 * the chunk causes the packet to exceed the path MTU and COOKIE_ECHO chunk
153
 * is not present in the packet, it transmits the input packet.
154
 * Data can be bundled with a packet containing a COOKIE_ECHO chunk as long
155
 * as it can fit in the packet, but any more data that does not fit in this
156
 * packet can be sent only after receiving the COOKIE_ACK.
157
 */
158
sctp_xmit_t sctp_packet_transmit_chunk(struct sctp_packet *packet,
159
                                       struct sctp_chunk *chunk)
160
{
161
        sctp_xmit_t retval;
162
        int error = 0;
163
 
164
        SCTP_DEBUG_PRINTK("%s: packet:%p chunk:%p\n", __FUNCTION__,
165
                          packet, chunk);
166
 
167
        switch ((retval = (sctp_packet_append_chunk(packet, chunk)))) {
168
        case SCTP_XMIT_PMTU_FULL:
169
                if (!packet->has_cookie_echo) {
170
                        error = sctp_packet_transmit(packet);
171
                        if (error < 0)
172
                                chunk->skb->sk->sk_err = -error;
173
 
174
                        /* If we have an empty packet, then we can NOT ever
175
                         * return PMTU_FULL.
176
                         */
177
                        retval = sctp_packet_append_chunk(packet, chunk);
178
                }
179
                break;
180
 
181
        case SCTP_XMIT_RWND_FULL:
182
        case SCTP_XMIT_OK:
183
        case SCTP_XMIT_NAGLE_DELAY:
184
                break;
185
        }
186
 
187
        return retval;
188
}
189
 
190
/* Try to bundle an auth chunk into the packet. */
191
static sctp_xmit_t sctp_packet_bundle_auth(struct sctp_packet *pkt,
192
                                           struct sctp_chunk *chunk)
193
{
194
        struct sctp_association *asoc = pkt->transport->asoc;
195
        struct sctp_chunk *auth;
196
        sctp_xmit_t retval = SCTP_XMIT_OK;
197
 
198
        /* if we don't have an association, we can't do authentication */
199
        if (!asoc)
200
                return retval;
201
 
202
        /* See if this is an auth chunk we are bundling or if
203
         * auth is already bundled.
204
         */
205
        if (chunk->chunk_hdr->type == SCTP_CID_AUTH || pkt->auth)
206
                return retval;
207
 
208
        /* if the peer did not request this chunk to be authenticated,
209
         * don't do it
210
         */
211
        if (!chunk->auth)
212
                return retval;
213
 
214
        auth = sctp_make_auth(asoc);
215
        if (!auth)
216
                return retval;
217
 
218
        retval = sctp_packet_append_chunk(pkt, auth);
219
 
220
        return retval;
221
}
222
 
223
/* Try to bundle a SACK with the packet. */
224
static sctp_xmit_t sctp_packet_bundle_sack(struct sctp_packet *pkt,
225
                                           struct sctp_chunk *chunk)
226
{
227
        sctp_xmit_t retval = SCTP_XMIT_OK;
228
 
229
        /* If sending DATA and haven't aleady bundled a SACK, try to
230
         * bundle one in to the packet.
231
         */
232
        if (sctp_chunk_is_data(chunk) && !pkt->has_sack &&
233
            !pkt->has_cookie_echo) {
234
                struct sctp_association *asoc;
235
                asoc = pkt->transport->asoc;
236
 
237
                if (asoc->a_rwnd > asoc->rwnd) {
238
                        struct sctp_chunk *sack;
239
                        asoc->a_rwnd = asoc->rwnd;
240
                        sack = sctp_make_sack(asoc);
241
                        if (sack) {
242
                                struct timer_list *timer;
243
                                retval = sctp_packet_append_chunk(pkt, sack);
244
                                asoc->peer.sack_needed = 0;
245
                                timer = &asoc->timers[SCTP_EVENT_TIMEOUT_SACK];
246
                                if (timer_pending(timer) && del_timer(timer))
247
                                        sctp_association_put(asoc);
248
                        }
249
                }
250
        }
251
        return retval;
252
}
253
 
254
/* Append a chunk to the offered packet reporting back any inability to do
255
 * so.
256
 */
257
sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *packet,
258
                                     struct sctp_chunk *chunk)
259
{
260
        sctp_xmit_t retval = SCTP_XMIT_OK;
261
        __u16 chunk_len = WORD_ROUND(ntohs(chunk->chunk_hdr->length));
262
        size_t psize;
263
        size_t pmtu;
264
        int too_big;
265
 
266
        SCTP_DEBUG_PRINTK("%s: packet:%p chunk:%p\n", __FUNCTION__, packet,
267
                          chunk);
268
 
269
        /* Try to bundle AUTH chunk */
270
        retval = sctp_packet_bundle_auth(packet, chunk);
271
        if (retval != SCTP_XMIT_OK)
272
                goto finish;
273
 
274
        /* Try to bundle SACK chunk */
275
        retval = sctp_packet_bundle_sack(packet, chunk);
276
        if (retval != SCTP_XMIT_OK)
277
                goto finish;
278
 
279
        psize = packet->size;
280
        pmtu  = ((packet->transport->asoc) ?
281
                 (packet->transport->asoc->pathmtu) :
282
                 (packet->transport->pathmtu));
283
 
284
        too_big = (psize + chunk_len > pmtu);
285
 
286
        /* Decide if we need to fragment or resubmit later. */
287
        if (too_big) {
288
                /* It's OK to fragmet at IP level if any one of the following
289
                 * is true:
290
                 *      1. The packet is empty (meaning this chunk is greater
291
                 *         the MTU)
292
                 *      2. The chunk we are adding is a control chunk
293
                 *      3. The packet doesn't have any data in it yet and data
294
                 *      requires authentication.
295
                 */
296
                if (sctp_packet_empty(packet) || !sctp_chunk_is_data(chunk) ||
297
                    (!packet->has_data && chunk->auth)) {
298
                        /* We no longer do re-fragmentation.
299
                         * Just fragment at the IP layer, if we
300
                         * actually hit this condition
301
                         */
302
                        packet->ipfragok = 1;
303
                        goto append;
304
 
305
                } else {
306
                        retval = SCTP_XMIT_PMTU_FULL;
307
                        goto finish;
308
                }
309
        }
310
 
311
append:
312
        /* We believe that this chunk is OK to add to the packet (as
313
         * long as we have the cwnd for it).
314
         */
315
 
316
        /* DATA is a special case since we must examine both rwnd and cwnd
317
         * before we send DATA.
318
         */
319
        switch (chunk->chunk_hdr->type) {
320
            case SCTP_CID_DATA:
321
                retval = sctp_packet_append_data(packet, chunk);
322
                /* Disallow SACK bundling after DATA. */
323
                packet->has_sack = 1;
324
                /* Disallow AUTH bundling after DATA */
325
                packet->has_auth = 1;
326
                /* Let it be knows that packet has DATA in it */
327
                packet->has_data = 1;
328
                if (SCTP_XMIT_OK != retval)
329
                        goto finish;
330
                break;
331
            case SCTP_CID_COOKIE_ECHO:
332
                packet->has_cookie_echo = 1;
333
                break;
334
 
335
            case SCTP_CID_SACK:
336
                packet->has_sack = 1;
337
                break;
338
 
339
            case SCTP_CID_AUTH:
340
                packet->has_auth = 1;
341
                packet->auth = chunk;
342
                break;
343
        }
344
 
345
        /* It is OK to send this chunk.  */
346
        list_add_tail(&chunk->list, &packet->chunk_list);
347
        packet->size += chunk_len;
348
        chunk->transport = packet->transport;
349
finish:
350
        return retval;
351
}
352
 
353
/* All packets are sent to the network through this function from
354
 * sctp_outq_tail().
355
 *
356
 * The return value is a normal kernel error return value.
357
 */
358
int sctp_packet_transmit(struct sctp_packet *packet)
359
{
360
        struct sctp_transport *tp = packet->transport;
361
        struct sctp_association *asoc = tp->asoc;
362
        struct sctphdr *sh;
363
        __u32 crc32 = 0;
364
        struct sk_buff *nskb;
365
        struct sctp_chunk *chunk, *tmp;
366
        struct sock *sk;
367
        int err = 0;
368
        int padding;            /* How much padding do we need?  */
369
        __u8 has_data = 0;
370
        struct dst_entry *dst = tp->dst;
371
        unsigned char *auth = NULL;     /* pointer to auth in skb data */
372
        __u32 cksum_buf_len = sizeof(struct sctphdr);
373
 
374
        SCTP_DEBUG_PRINTK("%s: packet:%p\n", __FUNCTION__, packet);
375
 
376
        /* Do NOT generate a chunkless packet. */
377
        if (list_empty(&packet->chunk_list))
378
                return err;
379
 
380
        /* Set up convenience variables... */
381
        chunk = list_entry(packet->chunk_list.next, struct sctp_chunk, list);
382
        sk = chunk->skb->sk;
383
 
384
        /* Allocate the new skb.  */
385
        nskb = alloc_skb(packet->size + LL_MAX_HEADER, GFP_ATOMIC);
386
        if (!nskb)
387
                goto nomem;
388
 
389
        /* Make sure the outbound skb has enough header room reserved. */
390
        skb_reserve(nskb, packet->overhead + LL_MAX_HEADER);
391
 
392
        /* Set the owning socket so that we know where to get the
393
         * destination IP address.
394
         */
395
        skb_set_owner_w(nskb, sk);
396
 
397
        /* The 'obsolete' field of dst is set to 2 when a dst is freed. */
398
        if (!dst || (dst->obsolete > 1)) {
399
                dst_release(dst);
400
                sctp_transport_route(tp, NULL, sctp_sk(sk));
401
                if (asoc && (asoc->param_flags & SPP_PMTUD_ENABLE)) {
402
                        sctp_assoc_sync_pmtu(asoc);
403
                }
404
        }
405
        nskb->dst = dst_clone(tp->dst);
406
        if (!nskb->dst)
407
                goto no_route;
408
        dst = nskb->dst;
409
 
410
        /* Build the SCTP header.  */
411
        sh = (struct sctphdr *)skb_push(nskb, sizeof(struct sctphdr));
412
        sh->source = htons(packet->source_port);
413
        sh->dest   = htons(packet->destination_port);
414
 
415
        /* From 6.8 Adler-32 Checksum Calculation:
416
         * After the packet is constructed (containing the SCTP common
417
         * header and one or more control or DATA chunks), the
418
         * transmitter shall:
419
         *
420
         * 1) Fill in the proper Verification Tag in the SCTP common
421
         *    header and initialize the checksum field to 0's.
422
         */
423
        sh->vtag     = htonl(packet->vtag);
424
        sh->checksum = 0;
425
 
426
        /**
427
         * 6.10 Bundling
428
         *
429
         *    An endpoint bundles chunks by simply including multiple
430
         *    chunks in one outbound SCTP packet.  ...
431
         */
432
 
433
        /**
434
         * 3.2  Chunk Field Descriptions
435
         *
436
         * The total length of a chunk (including Type, Length and
437
         * Value fields) MUST be a multiple of 4 bytes.  If the length
438
         * of the chunk is not a multiple of 4 bytes, the sender MUST
439
         * pad the chunk with all zero bytes and this padding is not
440
         * included in the chunk length field.  The sender should
441
         * never pad with more than 3 bytes.
442
         *
443
         * [This whole comment explains WORD_ROUND() below.]
444
         */
445
        SCTP_DEBUG_PRINTK("***sctp_transmit_packet***\n");
446
        list_for_each_entry_safe(chunk, tmp, &packet->chunk_list, list) {
447
                list_del_init(&chunk->list);
448
                if (sctp_chunk_is_data(chunk)) {
449
 
450
                        if (!chunk->has_tsn) {
451
                                sctp_chunk_assign_ssn(chunk);
452
                                sctp_chunk_assign_tsn(chunk);
453
 
454
                        /* 6.3.1 C4) When data is in flight and when allowed
455
                         * by rule C5, a new RTT measurement MUST be made each
456
                         * round trip.  Furthermore, new RTT measurements
457
                         * SHOULD be made no more than once per round-trip
458
                         * for a given destination transport address.
459
                         */
460
 
461
                                if (!tp->rto_pending) {
462
                                        chunk->rtt_in_progress = 1;
463
                                        tp->rto_pending = 1;
464
                                }
465
                        } else
466
                                chunk->resent = 1;
467
 
468
                        chunk->sent_at = jiffies;
469
                        has_data = 1;
470
                }
471
 
472
                padding = WORD_ROUND(chunk->skb->len) - chunk->skb->len;
473
                if (padding)
474
                        memset(skb_put(chunk->skb, padding), 0, padding);
475
 
476
                /* if this is the auth chunk that we are adding,
477
                 * store pointer where it will be added and put
478
                 * the auth into the packet.
479
                 */
480
                if (chunk == packet->auth)
481
                        auth = skb_tail_pointer(nskb);
482
 
483
                cksum_buf_len += chunk->skb->len;
484
                memcpy(skb_put(nskb, chunk->skb->len),
485
                               chunk->skb->data, chunk->skb->len);
486
 
487
                SCTP_DEBUG_PRINTK("%s %p[%s] %s 0x%x, %s %d, %s %d, %s %d\n",
488
                                  "*** Chunk", chunk,
489
                                  sctp_cname(SCTP_ST_CHUNK(
490
                                          chunk->chunk_hdr->type)),
491
                                  chunk->has_tsn ? "TSN" : "No TSN",
492
                                  chunk->has_tsn ?
493
                                  ntohl(chunk->subh.data_hdr->tsn) : 0,
494
                                  "length", ntohs(chunk->chunk_hdr->length),
495
                                  "chunk->skb->len", chunk->skb->len,
496
                                  "rtt_in_progress", chunk->rtt_in_progress);
497
 
498
                /*
499
                 * If this is a control chunk, this is our last
500
                 * reference. Free data chunks after they've been
501
                 * acknowledged or have failed.
502
                 */
503
                if (!sctp_chunk_is_data(chunk))
504
                        sctp_chunk_free(chunk);
505
        }
506
 
507
        /* SCTP-AUTH, Section 6.2
508
         *    The sender MUST calculate the MAC as described in RFC2104 [2]
509
         *    using the hash function H as described by the MAC Identifier and
510
         *    the shared association key K based on the endpoint pair shared key
511
         *    described by the shared key identifier.  The 'data' used for the
512
         *    computation of the AUTH-chunk is given by the AUTH chunk with its
513
         *    HMAC field set to zero (as shown in Figure 6) followed by all
514
         *    chunks that are placed after the AUTH chunk in the SCTP packet.
515
         */
516
        if (auth)
517
                sctp_auth_calculate_hmac(asoc, nskb,
518
                                        (struct sctp_auth_chunk *)auth,
519
                                        GFP_ATOMIC);
520
 
521
        /* 2) Calculate the Adler-32 checksum of the whole packet,
522
         *    including the SCTP common header and all the
523
         *    chunks.
524
         *
525
         * Note: Adler-32 is no longer applicable, as has been replaced
526
         * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>.
527
         */
528
        if (!(dst->dev->features & NETIF_F_NO_CSUM)) {
529
                crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len);
530
                crc32 = sctp_end_cksum(crc32);
531
        }
532
 
533
        /* 3) Put the resultant value into the checksum field in the
534
         *    common header, and leave the rest of the bits unchanged.
535
         */
536
        sh->checksum = htonl(crc32);
537
 
538
        /* IP layer ECN support
539
         * From RFC 2481
540
         *  "The ECN-Capable Transport (ECT) bit would be set by the
541
         *   data sender to indicate that the end-points of the
542
         *   transport protocol are ECN-capable."
543
         *
544
         * Now setting the ECT bit all the time, as it should not cause
545
         * any problems protocol-wise even if our peer ignores it.
546
         *
547
         * Note: The works for IPv6 layer checks this bit too later
548
         * in transmission.  See IP6_ECN_flow_xmit().
549
         */
550
        INET_ECN_xmit(nskb->sk);
551
 
552
        /* Set up the IP options.  */
553
        /* BUG: not implemented
554
         * For v4 this all lives somewhere in sk->sk_opt...
555
         */
556
 
557
        /* Dump that on IP!  */
558
        if (asoc && asoc->peer.last_sent_to != tp) {
559
                /* Considering the multiple CPU scenario, this is a
560
                 * "correcter" place for last_sent_to.  --xguo
561
                 */
562
                asoc->peer.last_sent_to = tp;
563
        }
564
 
565
        if (has_data) {
566
                struct timer_list *timer;
567
                unsigned long timeout;
568
 
569
                tp->last_time_used = jiffies;
570
 
571
                /* Restart the AUTOCLOSE timer when sending data. */
572
                if (sctp_state(asoc, ESTABLISHED) && asoc->autoclose) {
573
                        timer = &asoc->timers[SCTP_EVENT_TIMEOUT_AUTOCLOSE];
574
                        timeout = asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE];
575
 
576
                        if (!mod_timer(timer, jiffies + timeout))
577
                                sctp_association_hold(asoc);
578
                }
579
        }
580
 
581
        SCTP_DEBUG_PRINTK("***sctp_transmit_packet*** skb len %d\n",
582
                          nskb->len);
583
 
584
        if (tp->param_flags & SPP_PMTUD_ENABLE)
585
                (*tp->af_specific->sctp_xmit)(nskb, tp, packet->ipfragok);
586
        else
587
                (*tp->af_specific->sctp_xmit)(nskb, tp, 1);
588
 
589
out:
590
        packet->size = packet->overhead;
591
        return err;
592
no_route:
593
        kfree_skb(nskb);
594
        IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES);
595
 
596
        /* FIXME: Returning the 'err' will effect all the associations
597
         * associated with a socket, although only one of the paths of the
598
         * association is unreachable.
599
         * The real failure of a transport or association can be passed on
600
         * to the user via notifications. So setting this error may not be
601
         * required.
602
         */
603
         /* err = -EHOSTUNREACH; */
604
err:
605
        /* Control chunks are unreliable so just drop them.  DATA chunks
606
         * will get resent or dropped later.
607
         */
608
 
609
        list_for_each_entry_safe(chunk, tmp, &packet->chunk_list, list) {
610
                list_del_init(&chunk->list);
611
                if (!sctp_chunk_is_data(chunk))
612
                        sctp_chunk_free(chunk);
613
        }
614
        goto out;
615
nomem:
616
        err = -ENOMEM;
617
        goto err;
618
}
619
 
620
/********************************************************************
621
 * 2nd Level Abstractions
622
 ********************************************************************/
623
 
624
/* This private function handles the specifics of appending DATA chunks.  */
625
static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet,
626
                                           struct sctp_chunk *chunk)
627
{
628
        sctp_xmit_t retval = SCTP_XMIT_OK;
629
        size_t datasize, rwnd, inflight;
630
        struct sctp_transport *transport = packet->transport;
631
        __u32 max_burst_bytes;
632
        struct sctp_association *asoc = transport->asoc;
633
        struct sctp_sock *sp = sctp_sk(asoc->base.sk);
634
        struct sctp_outq *q = &asoc->outqueue;
635
 
636
        /* RFC 2960 6.1  Transmission of DATA Chunks
637
         *
638
         * A) At any given time, the data sender MUST NOT transmit new data to
639
         * any destination transport address if its peer's rwnd indicates
640
         * that the peer has no buffer space (i.e. rwnd is 0, see Section
641
         * 6.2.1).  However, regardless of the value of rwnd (including if it
642
         * is 0), the data sender can always have one DATA chunk in flight to
643
         * the receiver if allowed by cwnd (see rule B below).  This rule
644
         * allows the sender to probe for a change in rwnd that the sender
645
         * missed due to the SACK having been lost in transit from the data
646
         * receiver to the data sender.
647
         */
648
 
649
        rwnd = asoc->peer.rwnd;
650
        inflight = asoc->outqueue.outstanding_bytes;
651
 
652
        datasize = sctp_data_size(chunk);
653
 
654
        if (datasize > rwnd) {
655
                if (inflight > 0) {
656
                        /* We have (at least) one data chunk in flight,
657
                         * so we can't fall back to rule 6.1 B).
658
                         */
659
                        retval = SCTP_XMIT_RWND_FULL;
660
                        goto finish;
661
                }
662
        }
663
 
664
        /* sctpimpguide-05 2.14.2
665
         * D) When the time comes for the sender to
666
         * transmit new DATA chunks, the protocol parameter Max.Burst MUST
667
         * first be applied to limit how many new DATA chunks may be sent.
668
         * The limit is applied by adjusting cwnd as follows:
669
         *      if ((flightsize + Max.Burst * MTU) < cwnd)
670
         *              cwnd = flightsize + Max.Burst * MTU
671
         */
672
        max_burst_bytes = asoc->max_burst * asoc->pathmtu;
673
        if ((transport->flight_size + max_burst_bytes) < transport->cwnd) {
674
                transport->cwnd = transport->flight_size + max_burst_bytes;
675
                SCTP_DEBUG_PRINTK("%s: cwnd limited by max_burst: "
676
                                  "transport: %p, cwnd: %d, "
677
                                  "ssthresh: %d, flight_size: %d, "
678
                                  "pba: %d\n",
679
                                  __FUNCTION__, transport,
680
                                  transport->cwnd,
681
                                  transport->ssthresh,
682
                                  transport->flight_size,
683
                                  transport->partial_bytes_acked);
684
        }
685
 
686
        /* RFC 2960 6.1  Transmission of DATA Chunks
687
         *
688
         * B) At any given time, the sender MUST NOT transmit new data
689
         * to a given transport address if it has cwnd or more bytes
690
         * of data outstanding to that transport address.
691
         */
692
        /* RFC 7.2.4 & the Implementers Guide 2.8.
693
         *
694
         * 3) ...
695
         *    When a Fast Retransmit is being performed the sender SHOULD
696
         *    ignore the value of cwnd and SHOULD NOT delay retransmission.
697
         */
698
        if (chunk->fast_retransmit <= 0)
699
                if (transport->flight_size >= transport->cwnd) {
700
                        retval = SCTP_XMIT_RWND_FULL;
701
                        goto finish;
702
                }
703
 
704
        /* Nagle's algorithm to solve small-packet problem:
705
         * Inhibit the sending of new chunks when new outgoing data arrives
706
         * if any previously transmitted data on the connection remains
707
         * unacknowledged.
708
         */
709
        if (!sp->nodelay && sctp_packet_empty(packet) &&
710
            q->outstanding_bytes && sctp_state(asoc, ESTABLISHED)) {
711
                unsigned len = datasize + q->out_qlen;
712
 
713
                /* Check whether this chunk and all the rest of pending
714
                 * data will fit or delay in hopes of bundling a full
715
                 * sized packet.
716
                 */
717
                if (len < asoc->frag_point) {
718
                        retval = SCTP_XMIT_NAGLE_DELAY;
719
                        goto finish;
720
                }
721
        }
722
 
723
        /* Keep track of how many bytes are in flight over this transport. */
724
        transport->flight_size += datasize;
725
 
726
        /* Keep track of how many bytes are in flight to the receiver. */
727
        asoc->outqueue.outstanding_bytes += datasize;
728
 
729
        /* Update our view of the receiver's rwnd. Include sk_buff overhead
730
         * while updating peer.rwnd so that it reduces the chances of a
731
         * receiver running out of receive buffer space even when receive
732
         * window is still open. This can happen when a sender is sending
733
         * sending small messages.
734
         */
735
        datasize += sizeof(struct sk_buff);
736
        if (datasize < rwnd)
737
                rwnd -= datasize;
738
        else
739
                rwnd = 0;
740
 
741
        asoc->peer.rwnd = rwnd;
742
        /* Has been accepted for transmission. */
743
        if (!asoc->peer.prsctp_capable)
744
                chunk->msg->can_abandon = 0;
745
 
746
finish:
747
        return retval;
748
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.