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