linux/net/sctp/output.c
<<
>>
Prefs
   1/* 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. */
  65static 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 */
  71struct 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. */
 101struct 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.  */
 136void 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 */
 158sctp_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. */
 191static 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. */
 224static 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 */
 257sctp_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
 311append:
 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;
 349finish:
 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 */
 358int 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
 589out:
 590        packet->size = packet->overhead;
 591        return err;
 592no_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; */
 604err:
 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;
 615nomem:
 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.  */
 625static 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
 746finish:
 747        return retval;
 748}
 749