linux/net/sctp/ulpqueue.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 * Copyright (c) 2001 Intel Corp.
   6 * Copyright (c) 2001 Nokia, Inc.
   7 * Copyright (c) 2001 La Monte H.P. Yarroll
   8 *
   9 * This abstraction carries sctp events to the ULP (sockets).
  10 *
  11 * This SCTP implementation is free software;
  12 * you can redistribute it and/or modify it under the terms of
  13 * the GNU General Public License as published by
  14 * the Free Software Foundation; either version 2, or (at your option)
  15 * any later version.
  16 *
  17 * This SCTP implementation is distributed in the hope that it
  18 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
  19 *                 ************************
  20 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  21 * See the GNU General Public License for more details.
  22 *
  23 * You should have received a copy of the GNU General Public License
  24 * along with GNU CC; see the file COPYING.  If not, see
  25 * <http://www.gnu.org/licenses/>.
  26 *
  27 * Please send any bug reports or fixes you make to the
  28 * email address(es):
  29 *    lksctp developers <linux-sctp@vger.kernel.org>
  30 *
  31 * Written or modified by:
  32 *    Jon Grimm             <jgrimm@us.ibm.com>
  33 *    La Monte H.P. Yarroll <piggy@acm.org>
  34 *    Sridhar Samudrala     <sri@us.ibm.com>
  35 */
  36
  37#include <linux/slab.h>
  38#include <linux/types.h>
  39#include <linux/skbuff.h>
  40#include <net/sock.h>
  41#include <net/busy_poll.h>
  42#include <net/sctp/structs.h>
  43#include <net/sctp/sctp.h>
  44#include <net/sctp/sm.h>
  45
  46/* Forward declarations for internal helpers.  */
  47static struct sctp_ulpevent *sctp_ulpq_reasm(struct sctp_ulpq *ulpq,
  48                                              struct sctp_ulpevent *);
  49static struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *,
  50                                              struct sctp_ulpevent *);
  51static void sctp_ulpq_reasm_drain(struct sctp_ulpq *ulpq);
  52
  53/* 1st Level Abstractions */
  54
  55/* Initialize a ULP queue from a block of memory.  */
  56struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *ulpq,
  57                                 struct sctp_association *asoc)
  58{
  59        memset(ulpq, 0, sizeof(struct sctp_ulpq));
  60
  61        ulpq->asoc = asoc;
  62        skb_queue_head_init(&ulpq->reasm);
  63        skb_queue_head_init(&ulpq->lobby);
  64        ulpq->pd_mode  = 0;
  65
  66        return ulpq;
  67}
  68
  69
  70/* Flush the reassembly and ordering queues.  */
  71void sctp_ulpq_flush(struct sctp_ulpq *ulpq)
  72{
  73        struct sk_buff *skb;
  74        struct sctp_ulpevent *event;
  75
  76        while ((skb = __skb_dequeue(&ulpq->lobby)) != NULL) {
  77                event = sctp_skb2event(skb);
  78                sctp_ulpevent_free(event);
  79        }
  80
  81        while ((skb = __skb_dequeue(&ulpq->reasm)) != NULL) {
  82                event = sctp_skb2event(skb);
  83                sctp_ulpevent_free(event);
  84        }
  85
  86}
  87
  88/* Dispose of a ulpqueue.  */
  89void sctp_ulpq_free(struct sctp_ulpq *ulpq)
  90{
  91        sctp_ulpq_flush(ulpq);
  92}
  93
  94/* Process an incoming DATA chunk.  */
  95int sctp_ulpq_tail_data(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk,
  96                        gfp_t gfp)
  97{
  98        struct sk_buff_head temp;
  99        struct sctp_ulpevent *event;
 100        int event_eor = 0;
 101
 102        /* Create an event from the incoming chunk. */
 103        event = sctp_ulpevent_make_rcvmsg(chunk->asoc, chunk, gfp);
 104        if (!event)
 105                return -ENOMEM;
 106
 107        /* Do reassembly if needed.  */
 108        event = sctp_ulpq_reasm(ulpq, event);
 109
 110        /* Do ordering if needed.  */
 111        if ((event) && (event->msg_flags & MSG_EOR)) {
 112                /* Create a temporary list to collect chunks on.  */
 113                skb_queue_head_init(&temp);
 114                __skb_queue_tail(&temp, sctp_event2skb(event));
 115
 116                event = sctp_ulpq_order(ulpq, event);
 117        }
 118
 119        /* Send event to the ULP.  'event' is the sctp_ulpevent for
 120         * very first SKB on the 'temp' list.
 121         */
 122        if (event) {
 123                event_eor = (event->msg_flags & MSG_EOR) ? 1 : 0;
 124                sctp_ulpq_tail_event(ulpq, event);
 125        }
 126
 127        return event_eor;
 128}
 129
 130/* Add a new event for propagation to the ULP.  */
 131/* Clear the partial delivery mode for this socket.   Note: This
 132 * assumes that no association is currently in partial delivery mode.
 133 */
 134int sctp_clear_pd(struct sock *sk, struct sctp_association *asoc)
 135{
 136        struct sctp_sock *sp = sctp_sk(sk);
 137
 138        if (atomic_dec_and_test(&sp->pd_mode)) {
 139                /* This means there are no other associations in PD, so
 140                 * we can go ahead and clear out the lobby in one shot
 141                 */
 142                if (!skb_queue_empty(&sp->pd_lobby)) {
 143                        struct list_head *list;
 144                        skb_queue_splice_tail_init(&sp->pd_lobby,
 145                                                   &sk->sk_receive_queue);
 146                        list = (struct list_head *)&sctp_sk(sk)->pd_lobby;
 147                        INIT_LIST_HEAD(list);
 148                        return 1;
 149                }
 150        } else {
 151                /* There are other associations in PD, so we only need to
 152                 * pull stuff out of the lobby that belongs to the
 153                 * associations that is exiting PD (all of its notifications
 154                 * are posted here).
 155                 */
 156                if (!skb_queue_empty(&sp->pd_lobby) && asoc) {
 157                        struct sk_buff *skb, *tmp;
 158                        struct sctp_ulpevent *event;
 159
 160                        sctp_skb_for_each(skb, &sp->pd_lobby, tmp) {
 161                                event = sctp_skb2event(skb);
 162                                if (event->asoc == asoc) {
 163                                        __skb_unlink(skb, &sp->pd_lobby);
 164                                        __skb_queue_tail(&sk->sk_receive_queue,
 165                                                         skb);
 166                                }
 167                        }
 168                }
 169        }
 170
 171        return 0;
 172}
 173
 174/* Set the pd_mode on the socket and ulpq */
 175static void sctp_ulpq_set_pd(struct sctp_ulpq *ulpq)
 176{
 177        struct sctp_sock *sp = sctp_sk(ulpq->asoc->base.sk);
 178
 179        atomic_inc(&sp->pd_mode);
 180        ulpq->pd_mode = 1;
 181}
 182
 183/* Clear the pd_mode and restart any pending messages waiting for delivery. */
 184static int sctp_ulpq_clear_pd(struct sctp_ulpq *ulpq)
 185{
 186        ulpq->pd_mode = 0;
 187        sctp_ulpq_reasm_drain(ulpq);
 188        return sctp_clear_pd(ulpq->asoc->base.sk, ulpq->asoc);
 189}
 190
 191/* If the SKB of 'event' is on a list, it is the first such member
 192 * of that list.
 193 */
 194int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event)
 195{
 196        struct sock *sk = ulpq->asoc->base.sk;
 197        struct sctp_sock *sp = sctp_sk(sk);
 198        struct sk_buff_head *queue, *skb_list;
 199        struct sk_buff *skb = sctp_event2skb(event);
 200        int clear_pd = 0;
 201
 202        skb_list = (struct sk_buff_head *) skb->prev;
 203
 204        /* If the socket is just going to throw this away, do not
 205         * even try to deliver it.
 206         */
 207        if (sk->sk_shutdown & RCV_SHUTDOWN &&
 208            (sk->sk_shutdown & SEND_SHUTDOWN ||
 209             !sctp_ulpevent_is_notification(event)))
 210                goto out_free;
 211
 212        if (!sctp_ulpevent_is_notification(event)) {
 213                sk_mark_napi_id(sk, skb);
 214                sk_incoming_cpu_update(sk);
 215        }
 216        /* Check if the user wishes to receive this event.  */
 217        if (!sctp_ulpevent_is_enabled(event, &sp->subscribe))
 218                goto out_free;
 219
 220        /* If we are in partial delivery mode, post to the lobby until
 221         * partial delivery is cleared, unless, of course _this_ is
 222         * the association the cause of the partial delivery.
 223         */
 224
 225        if (atomic_read(&sp->pd_mode) == 0) {
 226                queue = &sk->sk_receive_queue;
 227        } else {
 228                if (ulpq->pd_mode) {
 229                        /* If the association is in partial delivery, we
 230                         * need to finish delivering the partially processed
 231                         * packet before passing any other data.  This is
 232                         * because we don't truly support stream interleaving.
 233                         */
 234                        if ((event->msg_flags & MSG_NOTIFICATION) ||
 235                            (SCTP_DATA_NOT_FRAG ==
 236                                    (event->msg_flags & SCTP_DATA_FRAG_MASK)))
 237                                queue = &sp->pd_lobby;
 238                        else {
 239                                clear_pd = event->msg_flags & MSG_EOR;
 240                                queue = &sk->sk_receive_queue;
 241                        }
 242                } else {
 243                        /*
 244                         * If fragment interleave is enabled, we
 245                         * can queue this to the receive queue instead
 246                         * of the lobby.
 247                         */
 248                        if (sp->frag_interleave)
 249                                queue = &sk->sk_receive_queue;
 250                        else
 251                                queue = &sp->pd_lobby;
 252                }
 253        }
 254
 255        /* If we are harvesting multiple skbs they will be
 256         * collected on a list.
 257         */
 258        if (skb_list)
 259                skb_queue_splice_tail_init(skb_list, queue);
 260        else
 261                __skb_queue_tail(queue, skb);
 262
 263        /* Did we just complete partial delivery and need to get
 264         * rolling again?  Move pending data to the receive
 265         * queue.
 266         */
 267        if (clear_pd)
 268                sctp_ulpq_clear_pd(ulpq);
 269
 270        if (queue == &sk->sk_receive_queue && !sp->data_ready_signalled) {
 271                sp->data_ready_signalled = 1;
 272                sk->sk_data_ready(sk);
 273        }
 274        return 1;
 275
 276out_free:
 277        if (skb_list)
 278                sctp_queue_purge_ulpevents(skb_list);
 279        else
 280                sctp_ulpevent_free(event);
 281
 282        return 0;
 283}
 284
 285/* 2nd Level Abstractions */
 286
 287/* Helper function to store chunks that need to be reassembled.  */
 288static void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq,
 289                                         struct sctp_ulpevent *event)
 290{
 291        struct sk_buff *pos;
 292        struct sctp_ulpevent *cevent;
 293        __u32 tsn, ctsn;
 294
 295        tsn = event->tsn;
 296
 297        /* See if it belongs at the end. */
 298        pos = skb_peek_tail(&ulpq->reasm);
 299        if (!pos) {
 300                __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event));
 301                return;
 302        }
 303
 304        /* Short circuit just dropping it at the end. */
 305        cevent = sctp_skb2event(pos);
 306        ctsn = cevent->tsn;
 307        if (TSN_lt(ctsn, tsn)) {
 308                __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event));
 309                return;
 310        }
 311
 312        /* Find the right place in this list. We store them by TSN.  */
 313        skb_queue_walk(&ulpq->reasm, pos) {
 314                cevent = sctp_skb2event(pos);
 315                ctsn = cevent->tsn;
 316
 317                if (TSN_lt(tsn, ctsn))
 318                        break;
 319        }
 320
 321        /* Insert before pos. */
 322        __skb_queue_before(&ulpq->reasm, pos, sctp_event2skb(event));
 323
 324}
 325
 326/* Helper function to return an event corresponding to the reassembled
 327 * datagram.
 328 * This routine creates a re-assembled skb given the first and last skb's
 329 * as stored in the reassembly queue. The skb's may be non-linear if the sctp
 330 * payload was fragmented on the way and ip had to reassemble them.
 331 * We add the rest of skb's to the first skb's fraglist.
 332 */
 333static struct sctp_ulpevent *sctp_make_reassembled_event(struct net *net,
 334        struct sk_buff_head *queue, struct sk_buff *f_frag,
 335        struct sk_buff *l_frag)
 336{
 337        struct sk_buff *pos;
 338        struct sk_buff *new = NULL;
 339        struct sctp_ulpevent *event;
 340        struct sk_buff *pnext, *last;
 341        struct sk_buff *list = skb_shinfo(f_frag)->frag_list;
 342
 343        /* Store the pointer to the 2nd skb */
 344        if (f_frag == l_frag)
 345                pos = NULL;
 346        else
 347                pos = f_frag->next;
 348
 349        /* Get the last skb in the f_frag's frag_list if present. */
 350        for (last = list; list; last = list, list = list->next)
 351                ;
 352
 353        /* Add the list of remaining fragments to the first fragments
 354         * frag_list.
 355         */
 356        if (last)
 357                last->next = pos;
 358        else {
 359                if (skb_cloned(f_frag)) {
 360                        /* This is a cloned skb, we can't just modify
 361                         * the frag_list.  We need a new skb to do that.
 362                         * Instead of calling skb_unshare(), we'll do it
 363                         * ourselves since we need to delay the free.
 364                         */
 365                        new = skb_copy(f_frag, GFP_ATOMIC);
 366                        if (!new)
 367                                return NULL;    /* try again later */
 368
 369                        sctp_skb_set_owner_r(new, f_frag->sk);
 370
 371                        skb_shinfo(new)->frag_list = pos;
 372                } else
 373                        skb_shinfo(f_frag)->frag_list = pos;
 374        }
 375
 376        /* Remove the first fragment from the reassembly queue.  */
 377        __skb_unlink(f_frag, queue);
 378
 379        /* if we did unshare, then free the old skb and re-assign */
 380        if (new) {
 381                kfree_skb(f_frag);
 382                f_frag = new;
 383        }
 384
 385        while (pos) {
 386
 387                pnext = pos->next;
 388
 389                /* Update the len and data_len fields of the first fragment. */
 390                f_frag->len += pos->len;
 391                f_frag->data_len += pos->len;
 392
 393                /* Remove the fragment from the reassembly queue.  */
 394                __skb_unlink(pos, queue);
 395
 396                /* Break if we have reached the last fragment.  */
 397                if (pos == l_frag)
 398                        break;
 399                pos->next = pnext;
 400                pos = pnext;
 401        }
 402
 403        event = sctp_skb2event(f_frag);
 404        SCTP_INC_STATS(net, SCTP_MIB_REASMUSRMSGS);
 405
 406        return event;
 407}
 408
 409
 410/* Helper function to check if an incoming chunk has filled up the last
 411 * missing fragment in a SCTP datagram and return the corresponding event.
 412 */
 413static struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ulpq)
 414{
 415        struct sk_buff *pos;
 416        struct sctp_ulpevent *cevent;
 417        struct sk_buff *first_frag = NULL;
 418        __u32 ctsn, next_tsn;
 419        struct sctp_ulpevent *retval = NULL;
 420        struct sk_buff *pd_first = NULL;
 421        struct sk_buff *pd_last = NULL;
 422        size_t pd_len = 0;
 423        struct sctp_association *asoc;
 424        u32 pd_point;
 425
 426        /* Initialized to 0 just to avoid compiler warning message.  Will
 427         * never be used with this value. It is referenced only after it
 428         * is set when we find the first fragment of a message.
 429         */
 430        next_tsn = 0;
 431
 432        /* The chunks are held in the reasm queue sorted by TSN.
 433         * Walk through the queue sequentially and look for a sequence of
 434         * fragmented chunks that complete a datagram.
 435         * 'first_frag' and next_tsn are reset when we find a chunk which
 436         * is the first fragment of a datagram. Once these 2 fields are set
 437         * we expect to find the remaining middle fragments and the last
 438         * fragment in order. If not, first_frag is reset to NULL and we
 439         * start the next pass when we find another first fragment.
 440         *
 441         * There is a potential to do partial delivery if user sets
 442         * SCTP_PARTIAL_DELIVERY_POINT option. Lets count some things here
 443         * to see if can do PD.
 444         */
 445        skb_queue_walk(&ulpq->reasm, pos) {
 446                cevent = sctp_skb2event(pos);
 447                ctsn = cevent->tsn;
 448
 449                switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) {
 450                case SCTP_DATA_FIRST_FRAG:
 451                        /* If this "FIRST_FRAG" is the first
 452                         * element in the queue, then count it towards
 453                         * possible PD.
 454                         */
 455                        if (pos == ulpq->reasm.next) {
 456                            pd_first = pos;
 457                            pd_last = pos;
 458                            pd_len = pos->len;
 459                        } else {
 460                            pd_first = NULL;
 461                            pd_last = NULL;
 462                            pd_len = 0;
 463                        }
 464
 465                        first_frag = pos;
 466                        next_tsn = ctsn + 1;
 467                        break;
 468
 469                case SCTP_DATA_MIDDLE_FRAG:
 470                        if ((first_frag) && (ctsn == next_tsn)) {
 471                                next_tsn++;
 472                                if (pd_first) {
 473                                    pd_last = pos;
 474                                    pd_len += pos->len;
 475                                }
 476                        } else
 477                                first_frag = NULL;
 478                        break;
 479
 480                case SCTP_DATA_LAST_FRAG:
 481                        if (first_frag && (ctsn == next_tsn))
 482                                goto found;
 483                        else
 484                                first_frag = NULL;
 485                        break;
 486                }
 487        }
 488
 489        asoc = ulpq->asoc;
 490        if (pd_first) {
 491                /* Make sure we can enter partial deliver.
 492                 * We can trigger partial delivery only if framgent
 493                 * interleave is set, or the socket is not already
 494                 * in  partial delivery.
 495                 */
 496                if (!sctp_sk(asoc->base.sk)->frag_interleave &&
 497                    atomic_read(&sctp_sk(asoc->base.sk)->pd_mode))
 498                        goto done;
 499
 500                cevent = sctp_skb2event(pd_first);
 501                pd_point = sctp_sk(asoc->base.sk)->pd_point;
 502                if (pd_point && pd_point <= pd_len) {
 503                        retval = sctp_make_reassembled_event(sock_net(asoc->base.sk),
 504                                                             &ulpq->reasm,
 505                                                             pd_first,
 506                                                             pd_last);
 507                        if (retval)
 508                                sctp_ulpq_set_pd(ulpq);
 509                }
 510        }
 511done:
 512        return retval;
 513found:
 514        retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk),
 515                                             &ulpq->reasm, first_frag, pos);
 516        if (retval)
 517                retval->msg_flags |= MSG_EOR;
 518        goto done;
 519}
 520
 521/* Retrieve the next set of fragments of a partial message. */
 522static struct sctp_ulpevent *sctp_ulpq_retrieve_partial(struct sctp_ulpq *ulpq)
 523{
 524        struct sk_buff *pos, *last_frag, *first_frag;
 525        struct sctp_ulpevent *cevent;
 526        __u32 ctsn, next_tsn;
 527        int is_last;
 528        struct sctp_ulpevent *retval;
 529
 530        /* The chunks are held in the reasm queue sorted by TSN.
 531         * Walk through the queue sequentially and look for the first
 532         * sequence of fragmented chunks.
 533         */
 534
 535        if (skb_queue_empty(&ulpq->reasm))
 536                return NULL;
 537
 538        last_frag = first_frag = NULL;
 539        retval = NULL;
 540        next_tsn = 0;
 541        is_last = 0;
 542
 543        skb_queue_walk(&ulpq->reasm, pos) {
 544                cevent = sctp_skb2event(pos);
 545                ctsn = cevent->tsn;
 546
 547                switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) {
 548                case SCTP_DATA_FIRST_FRAG:
 549                        if (!first_frag)
 550                                return NULL;
 551                        goto done;
 552                case SCTP_DATA_MIDDLE_FRAG:
 553                        if (!first_frag) {
 554                                first_frag = pos;
 555                                next_tsn = ctsn + 1;
 556                                last_frag = pos;
 557                        } else if (next_tsn == ctsn) {
 558                                next_tsn++;
 559                                last_frag = pos;
 560                        } else
 561                                goto done;
 562                        break;
 563                case SCTP_DATA_LAST_FRAG:
 564                        if (!first_frag)
 565                                first_frag = pos;
 566                        else if (ctsn != next_tsn)
 567                                goto done;
 568                        last_frag = pos;
 569                        is_last = 1;
 570                        goto done;
 571                default:
 572                        return NULL;
 573                }
 574        }
 575
 576        /* We have the reassembled event. There is no need to look
 577         * further.
 578         */
 579done:
 580        retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk),
 581                                        &ulpq->reasm, first_frag, last_frag);
 582        if (retval && is_last)
 583                retval->msg_flags |= MSG_EOR;
 584
 585        return retval;
 586}
 587
 588
 589/* Helper function to reassemble chunks.  Hold chunks on the reasm queue that
 590 * need reassembling.
 591 */
 592static struct sctp_ulpevent *sctp_ulpq_reasm(struct sctp_ulpq *ulpq,
 593                                                struct sctp_ulpevent *event)
 594{
 595        struct sctp_ulpevent *retval = NULL;
 596
 597        /* Check if this is part of a fragmented message.  */
 598        if (SCTP_DATA_NOT_FRAG == (event->msg_flags & SCTP_DATA_FRAG_MASK)) {
 599                event->msg_flags |= MSG_EOR;
 600                return event;
 601        }
 602
 603        sctp_ulpq_store_reasm(ulpq, event);
 604        if (!ulpq->pd_mode)
 605                retval = sctp_ulpq_retrieve_reassembled(ulpq);
 606        else {
 607                __u32 ctsn, ctsnap;
 608
 609                /* Do not even bother unless this is the next tsn to
 610                 * be delivered.
 611                 */
 612                ctsn = event->tsn;
 613                ctsnap = sctp_tsnmap_get_ctsn(&ulpq->asoc->peer.tsn_map);
 614                if (TSN_lte(ctsn, ctsnap))
 615                        retval = sctp_ulpq_retrieve_partial(ulpq);
 616        }
 617
 618        return retval;
 619}
 620
 621/* Retrieve the first part (sequential fragments) for partial delivery.  */
 622static struct sctp_ulpevent *sctp_ulpq_retrieve_first(struct sctp_ulpq *ulpq)
 623{
 624        struct sk_buff *pos, *last_frag, *first_frag;
 625        struct sctp_ulpevent *cevent;
 626        __u32 ctsn, next_tsn;
 627        struct sctp_ulpevent *retval;
 628
 629        /* The chunks are held in the reasm queue sorted by TSN.
 630         * Walk through the queue sequentially and look for a sequence of
 631         * fragmented chunks that start a datagram.
 632         */
 633
 634        if (skb_queue_empty(&ulpq->reasm))
 635                return NULL;
 636
 637        last_frag = first_frag = NULL;
 638        retval = NULL;
 639        next_tsn = 0;
 640
 641        skb_queue_walk(&ulpq->reasm, pos) {
 642                cevent = sctp_skb2event(pos);
 643                ctsn = cevent->tsn;
 644
 645                switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) {
 646                case SCTP_DATA_FIRST_FRAG:
 647                        if (!first_frag) {
 648                                first_frag = pos;
 649                                next_tsn = ctsn + 1;
 650                                last_frag = pos;
 651                        } else
 652                                goto done;
 653                        break;
 654
 655                case SCTP_DATA_MIDDLE_FRAG:
 656                        if (!first_frag)
 657                                return NULL;
 658                        if (ctsn == next_tsn) {
 659                                next_tsn++;
 660                                last_frag = pos;
 661                        } else
 662                                goto done;
 663                        break;
 664
 665                case SCTP_DATA_LAST_FRAG:
 666                        if (!first_frag)
 667                                return NULL;
 668                        else
 669                                goto done;
 670                        break;
 671
 672                default:
 673                        return NULL;
 674                }
 675        }
 676
 677        /* We have the reassembled event. There is no need to look
 678         * further.
 679         */
 680done:
 681        retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk),
 682                                        &ulpq->reasm, first_frag, last_frag);
 683        return retval;
 684}
 685
 686/*
 687 * Flush out stale fragments from the reassembly queue when processing
 688 * a Forward TSN.
 689 *
 690 * RFC 3758, Section 3.6
 691 *
 692 * After receiving and processing a FORWARD TSN, the data receiver MUST
 693 * take cautions in updating its re-assembly queue.  The receiver MUST
 694 * remove any partially reassembled message, which is still missing one
 695 * or more TSNs earlier than or equal to the new cumulative TSN point.
 696 * In the event that the receiver has invoked the partial delivery API,
 697 * a notification SHOULD also be generated to inform the upper layer API
 698 * that the message being partially delivered will NOT be completed.
 699 */
 700void sctp_ulpq_reasm_flushtsn(struct sctp_ulpq *ulpq, __u32 fwd_tsn)
 701{
 702        struct sk_buff *pos, *tmp;
 703        struct sctp_ulpevent *event;
 704        __u32 tsn;
 705
 706        if (skb_queue_empty(&ulpq->reasm))
 707                return;
 708
 709        skb_queue_walk_safe(&ulpq->reasm, pos, tmp) {
 710                event = sctp_skb2event(pos);
 711                tsn = event->tsn;
 712
 713                /* Since the entire message must be abandoned by the
 714                 * sender (item A3 in Section 3.5, RFC 3758), we can
 715                 * free all fragments on the list that are less then
 716                 * or equal to ctsn_point
 717                 */
 718                if (TSN_lte(tsn, fwd_tsn)) {
 719                        __skb_unlink(pos, &ulpq->reasm);
 720                        sctp_ulpevent_free(event);
 721                } else
 722                        break;
 723        }
 724}
 725
 726/*
 727 * Drain the reassembly queue.  If we just cleared parted delivery, it
 728 * is possible that the reassembly queue will contain already reassembled
 729 * messages.  Retrieve any such messages and give them to the user.
 730 */
 731static void sctp_ulpq_reasm_drain(struct sctp_ulpq *ulpq)
 732{
 733        struct sctp_ulpevent *event = NULL;
 734        struct sk_buff_head temp;
 735
 736        if (skb_queue_empty(&ulpq->reasm))
 737                return;
 738
 739        while ((event = sctp_ulpq_retrieve_reassembled(ulpq)) != NULL) {
 740                /* Do ordering if needed.  */
 741                if ((event) && (event->msg_flags & MSG_EOR)) {
 742                        skb_queue_head_init(&temp);
 743                        __skb_queue_tail(&temp, sctp_event2skb(event));
 744
 745                        event = sctp_ulpq_order(ulpq, event);
 746                }
 747
 748                /* Send event to the ULP.  'event' is the
 749                 * sctp_ulpevent for  very first SKB on the  temp' list.
 750                 */
 751                if (event)
 752                        sctp_ulpq_tail_event(ulpq, event);
 753        }
 754}
 755
 756
 757/* Helper function to gather skbs that have possibly become
 758 * ordered by an an incoming chunk.
 759 */
 760static void sctp_ulpq_retrieve_ordered(struct sctp_ulpq *ulpq,
 761                                              struct sctp_ulpevent *event)
 762{
 763        struct sk_buff_head *event_list;
 764        struct sk_buff *pos, *tmp;
 765        struct sctp_ulpevent *cevent;
 766        struct sctp_stream *in;
 767        __u16 sid, csid, cssn;
 768
 769        sid = event->stream;
 770        in  = &ulpq->asoc->ssnmap->in;
 771
 772        event_list = (struct sk_buff_head *) sctp_event2skb(event)->prev;
 773
 774        /* We are holding the chunks by stream, by SSN.  */
 775        sctp_skb_for_each(pos, &ulpq->lobby, tmp) {
 776                cevent = (struct sctp_ulpevent *) pos->cb;
 777                csid = cevent->stream;
 778                cssn = cevent->ssn;
 779
 780                /* Have we gone too far?  */
 781                if (csid > sid)
 782                        break;
 783
 784                /* Have we not gone far enough?  */
 785                if (csid < sid)
 786                        continue;
 787
 788                if (cssn != sctp_ssn_peek(in, sid))
 789                        break;
 790
 791                /* Found it, so mark in the ssnmap. */
 792                sctp_ssn_next(in, sid);
 793
 794                __skb_unlink(pos, &ulpq->lobby);
 795
 796                /* Attach all gathered skbs to the event.  */
 797                __skb_queue_tail(event_list, pos);
 798        }
 799}
 800
 801/* Helper function to store chunks needing ordering.  */
 802static void sctp_ulpq_store_ordered(struct sctp_ulpq *ulpq,
 803                                           struct sctp_ulpevent *event)
 804{
 805        struct sk_buff *pos;
 806        struct sctp_ulpevent *cevent;
 807        __u16 sid, csid;
 808        __u16 ssn, cssn;
 809
 810        pos = skb_peek_tail(&ulpq->lobby);
 811        if (!pos) {
 812                __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
 813                return;
 814        }
 815
 816        sid = event->stream;
 817        ssn = event->ssn;
 818
 819        cevent = (struct sctp_ulpevent *) pos->cb;
 820        csid = cevent->stream;
 821        cssn = cevent->ssn;
 822        if (sid > csid) {
 823                __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
 824                return;
 825        }
 826
 827        if ((sid == csid) && SSN_lt(cssn, ssn)) {
 828                __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
 829                return;
 830        }
 831
 832        /* Find the right place in this list.  We store them by
 833         * stream ID and then by SSN.
 834         */
 835        skb_queue_walk(&ulpq->lobby, pos) {
 836                cevent = (struct sctp_ulpevent *) pos->cb;
 837                csid = cevent->stream;
 838                cssn = cevent->ssn;
 839
 840                if (csid > sid)
 841                        break;
 842                if (csid == sid && SSN_lt(ssn, cssn))
 843                        break;
 844        }
 845
 846
 847        /* Insert before pos. */
 848        __skb_queue_before(&ulpq->lobby, pos, sctp_event2skb(event));
 849}
 850
 851static struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *ulpq,
 852                                             struct sctp_ulpevent *event)
 853{
 854        __u16 sid, ssn;
 855        struct sctp_stream *in;
 856
 857        /* Check if this message needs ordering.  */
 858        if (SCTP_DATA_UNORDERED & event->msg_flags)
 859                return event;
 860
 861        /* Note: The stream ID must be verified before this routine.  */
 862        sid = event->stream;
 863        ssn = event->ssn;
 864        in  = &ulpq->asoc->ssnmap->in;
 865
 866        /* Is this the expected SSN for this stream ID?  */
 867        if (ssn != sctp_ssn_peek(in, sid)) {
 868                /* We've received something out of order, so find where it
 869                 * needs to be placed.  We order by stream and then by SSN.
 870                 */
 871                sctp_ulpq_store_ordered(ulpq, event);
 872                return NULL;
 873        }
 874
 875        /* Mark that the next chunk has been found.  */
 876        sctp_ssn_next(in, sid);
 877
 878        /* Go find any other chunks that were waiting for
 879         * ordering.
 880         */
 881        sctp_ulpq_retrieve_ordered(ulpq, event);
 882
 883        return event;
 884}
 885
 886/* Helper function to gather skbs that have possibly become
 887 * ordered by forward tsn skipping their dependencies.
 888 */
 889static void sctp_ulpq_reap_ordered(struct sctp_ulpq *ulpq, __u16 sid)
 890{
 891        struct sk_buff *pos, *tmp;
 892        struct sctp_ulpevent *cevent;
 893        struct sctp_ulpevent *event;
 894        struct sctp_stream *in;
 895        struct sk_buff_head temp;
 896        struct sk_buff_head *lobby = &ulpq->lobby;
 897        __u16 csid, cssn;
 898
 899        in  = &ulpq->asoc->ssnmap->in;
 900
 901        /* We are holding the chunks by stream, by SSN.  */
 902        skb_queue_head_init(&temp);
 903        event = NULL;
 904        sctp_skb_for_each(pos, lobby, tmp) {
 905                cevent = (struct sctp_ulpevent *) pos->cb;
 906                csid = cevent->stream;
 907                cssn = cevent->ssn;
 908
 909                /* Have we gone too far?  */
 910                if (csid > sid)
 911                        break;
 912
 913                /* Have we not gone far enough?  */
 914                if (csid < sid)
 915                        continue;
 916
 917                /* see if this ssn has been marked by skipping */
 918                if (!SSN_lt(cssn, sctp_ssn_peek(in, csid)))
 919                        break;
 920
 921                __skb_unlink(pos, lobby);
 922                if (!event)
 923                        /* Create a temporary list to collect chunks on.  */
 924                        event = sctp_skb2event(pos);
 925
 926                /* Attach all gathered skbs to the event.  */
 927                __skb_queue_tail(&temp, pos);
 928        }
 929
 930        /* If we didn't reap any data, see if the next expected SSN
 931         * is next on the queue and if so, use that.
 932         */
 933        if (event == NULL && pos != (struct sk_buff *)lobby) {
 934                cevent = (struct sctp_ulpevent *) pos->cb;
 935                csid = cevent->stream;
 936                cssn = cevent->ssn;
 937
 938                if (csid == sid && cssn == sctp_ssn_peek(in, csid)) {
 939                        sctp_ssn_next(in, csid);
 940                        __skb_unlink(pos, lobby);
 941                        __skb_queue_tail(&temp, pos);
 942                        event = sctp_skb2event(pos);
 943                }
 944        }
 945
 946        /* Send event to the ULP.  'event' is the sctp_ulpevent for
 947         * very first SKB on the 'temp' list.
 948         */
 949        if (event) {
 950                /* see if we have more ordered that we can deliver */
 951                sctp_ulpq_retrieve_ordered(ulpq, event);
 952                sctp_ulpq_tail_event(ulpq, event);
 953        }
 954}
 955
 956/* Skip over an SSN. This is used during the processing of
 957 * Forwared TSN chunk to skip over the abandoned ordered data
 958 */
 959void sctp_ulpq_skip(struct sctp_ulpq *ulpq, __u16 sid, __u16 ssn)
 960{
 961        struct sctp_stream *in;
 962
 963        /* Note: The stream ID must be verified before this routine.  */
 964        in  = &ulpq->asoc->ssnmap->in;
 965
 966        /* Is this an old SSN?  If so ignore. */
 967        if (SSN_lt(ssn, sctp_ssn_peek(in, sid)))
 968                return;
 969
 970        /* Mark that we are no longer expecting this SSN or lower. */
 971        sctp_ssn_skip(in, sid, ssn);
 972
 973        /* Go find any other chunks that were waiting for
 974         * ordering and deliver them if needed.
 975         */
 976        sctp_ulpq_reap_ordered(ulpq, sid);
 977}
 978
 979static __u16 sctp_ulpq_renege_list(struct sctp_ulpq *ulpq,
 980                struct sk_buff_head *list, __u16 needed)
 981{
 982        __u16 freed = 0;
 983        __u32 tsn, last_tsn;
 984        struct sk_buff *skb, *flist, *last;
 985        struct sctp_ulpevent *event;
 986        struct sctp_tsnmap *tsnmap;
 987
 988        tsnmap = &ulpq->asoc->peer.tsn_map;
 989
 990        while ((skb = skb_peek_tail(list)) != NULL) {
 991                event = sctp_skb2event(skb);
 992                tsn = event->tsn;
 993
 994                /* Don't renege below the Cumulative TSN ACK Point. */
 995                if (TSN_lte(tsn, sctp_tsnmap_get_ctsn(tsnmap)))
 996                        break;
 997
 998                /* Events in ordering queue may have multiple fragments
 999                 * corresponding to additional TSNs.  Sum the total
1000                 * freed space; find the last TSN.
1001                 */
1002                freed += skb_headlen(skb);
1003                flist = skb_shinfo(skb)->frag_list;
1004                for (last = flist; flist; flist = flist->next) {
1005                        last = flist;
1006                        freed += skb_headlen(last);
1007                }
1008                if (last)
1009                        last_tsn = sctp_skb2event(last)->tsn;
1010                else
1011                        last_tsn = tsn;
1012
1013                /* Unlink the event, then renege all applicable TSNs. */
1014                __skb_unlink(skb, list);
1015                sctp_ulpevent_free(event);
1016                while (TSN_lte(tsn, last_tsn)) {
1017                        sctp_tsnmap_renege(tsnmap, tsn);
1018                        tsn++;
1019                }
1020                if (freed >= needed)
1021                        return freed;
1022        }
1023
1024        return freed;
1025}
1026
1027/* Renege 'needed' bytes from the ordering queue. */
1028static __u16 sctp_ulpq_renege_order(struct sctp_ulpq *ulpq, __u16 needed)
1029{
1030        return sctp_ulpq_renege_list(ulpq, &ulpq->lobby, needed);
1031}
1032
1033/* Renege 'needed' bytes from the reassembly queue. */
1034static __u16 sctp_ulpq_renege_frags(struct sctp_ulpq *ulpq, __u16 needed)
1035{
1036        return sctp_ulpq_renege_list(ulpq, &ulpq->reasm, needed);
1037}
1038
1039/* Partial deliver the first message as there is pressure on rwnd. */
1040void sctp_ulpq_partial_delivery(struct sctp_ulpq *ulpq,
1041                                gfp_t gfp)
1042{
1043        struct sctp_ulpevent *event;
1044        struct sctp_association *asoc;
1045        struct sctp_sock *sp;
1046        __u32 ctsn;
1047        struct sk_buff *skb;
1048
1049        asoc = ulpq->asoc;
1050        sp = sctp_sk(asoc->base.sk);
1051
1052        /* If the association is already in Partial Delivery mode
1053         * we have nothing to do.
1054         */
1055        if (ulpq->pd_mode)
1056                return;
1057
1058        /* Data must be at or below the Cumulative TSN ACK Point to
1059         * start partial delivery.
1060         */
1061        skb = skb_peek(&asoc->ulpq.reasm);
1062        if (skb != NULL) {
1063                ctsn = sctp_skb2event(skb)->tsn;
1064                if (!TSN_lte(ctsn, sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map)))
1065                        return;
1066        }
1067
1068        /* If the user enabled fragment interleave socket option,
1069         * multiple associations can enter partial delivery.
1070         * Otherwise, we can only enter partial delivery if the
1071         * socket is not in partial deliver mode.
1072         */
1073        if (sp->frag_interleave || atomic_read(&sp->pd_mode) == 0) {
1074                /* Is partial delivery possible?  */
1075                event = sctp_ulpq_retrieve_first(ulpq);
1076                /* Send event to the ULP.   */
1077                if (event) {
1078                        sctp_ulpq_tail_event(ulpq, event);
1079                        sctp_ulpq_set_pd(ulpq);
1080                        return;
1081                }
1082        }
1083}
1084
1085/* Renege some packets to make room for an incoming chunk.  */
1086void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk,
1087                      gfp_t gfp)
1088{
1089        struct sctp_association *asoc;
1090        __u16 needed, freed;
1091
1092        asoc = ulpq->asoc;
1093
1094        if (chunk) {
1095                needed = ntohs(chunk->chunk_hdr->length);
1096                needed -= sizeof(sctp_data_chunk_t);
1097        } else
1098                needed = SCTP_DEFAULT_MAXWINDOW;
1099
1100        freed = 0;
1101
1102        if (skb_queue_empty(&asoc->base.sk->sk_receive_queue)) {
1103                freed = sctp_ulpq_renege_order(ulpq, needed);
1104                if (freed < needed) {
1105                        freed += sctp_ulpq_renege_frags(ulpq, needed - freed);
1106                }
1107        }
1108        /* If able to free enough room, accept this chunk. */
1109        if (chunk && (freed >= needed)) {
1110                int retval;
1111                retval = sctp_ulpq_tail_data(ulpq, chunk, gfp);
1112                /*
1113                 * Enter partial delivery if chunk has not been
1114                 * delivered; otherwise, drain the reassembly queue.
1115                 */
1116                if (retval <= 0)
1117                        sctp_ulpq_partial_delivery(ulpq, gfp);
1118                else if (retval == 1)
1119                        sctp_ulpq_reasm_drain(ulpq);
1120        }
1121
1122        sk_mem_reclaim(asoc->base.sk);
1123}
1124
1125
1126
1127/* Notify the application if an association is aborted and in
1128 * partial delivery mode.  Send up any pending received messages.
1129 */
1130void sctp_ulpq_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp)
1131{
1132        struct sctp_ulpevent *ev = NULL;
1133        struct sock *sk;
1134        struct sctp_sock *sp;
1135
1136        if (!ulpq->pd_mode)
1137                return;
1138
1139        sk = ulpq->asoc->base.sk;
1140        sp = sctp_sk(sk);
1141        if (sctp_ulpevent_type_enabled(SCTP_PARTIAL_DELIVERY_EVENT,
1142                                       &sctp_sk(sk)->subscribe))
1143                ev = sctp_ulpevent_make_pdapi(ulpq->asoc,
1144                                              SCTP_PARTIAL_DELIVERY_ABORTED,
1145                                              gfp);
1146        if (ev)
1147                __skb_queue_tail(&sk->sk_receive_queue, sctp_event2skb(ev));
1148
1149        /* If there is data waiting, send it up the socket now. */
1150        if ((sctp_ulpq_clear_pd(ulpq) || ev) && !sp->data_ready_signalled) {
1151                sp->data_ready_signalled = 1;
1152                sk->sk_data_ready(sk);
1153        }
1154}
1155