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 * 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 * The SCTP reference 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 * The SCTP reference 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, write to 25 * the Free Software Foundation, 59 Temple Place - Suite 330, 26 * Boston, MA 02111-1307, USA. 27 * 28 * Please send any bug reports or fixes you make to the 29 * email address(es): 30 * lksctp developers <lksctp-developers@lists.sourceforge.net> 31 * 32 * Or submit a bug report through the following website: 33 * http://www.sf.net/projects/lksctp 34 * 35 * Written or modified by: 36 * Jon Grimm <jgrimm@us.ibm.com> 37 * La Monte H.P. Yarroll <piggy@acm.org> 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/skbuff.h> 46 #include <net/sock.h> 47 #include <net/sctp/structs.h> 48 #include <net/sctp/sctp.h> 49 #include <net/sctp/sm.h> 50 51 /* Forward declarations for internal helpers. */ 52 static struct sctp_ulpevent * sctp_ulpq_reasm(struct sctp_ulpq *ulpq, 53 struct sctp_ulpevent *); 54 static struct sctp_ulpevent * sctp_ulpq_order(struct sctp_ulpq *, 55 struct sctp_ulpevent *); 56 57 /* 1st Level Abstractions */ 58 59 /* Initialize a ULP queue from a block of memory. */ 60 struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *ulpq, 61 struct sctp_association *asoc) 62 { 63 memset(ulpq, 0, sizeof(struct sctp_ulpq)); 64 65 ulpq->asoc = asoc; 66 skb_queue_head_init(&ulpq->reasm); 67 skb_queue_head_init(&ulpq->lobby); 68 ulpq->pd_mode = 0; 69 ulpq->malloced = 0; 70 71 return ulpq; 72 } 73 74 75 /* Flush the reassembly and ordering queues. */ 76 static void sctp_ulpq_flush(struct sctp_ulpq *ulpq) 77 { 78 struct sk_buff *skb; 79 struct sctp_ulpevent *event; 80 81 while ((skb = __skb_dequeue(&ulpq->lobby)) != NULL) { 82 event = sctp_skb2event(skb); 83 sctp_ulpevent_free(event); 84 } 85 86 while ((skb = __skb_dequeue(&ulpq->reasm)) != NULL) { 87 event = sctp_skb2event(skb); 88 sctp_ulpevent_free(event); 89 } 90 91 } 92 93 /* Dispose of a ulpqueue. */ 94 void sctp_ulpq_free(struct sctp_ulpq *ulpq) 95 { 96 sctp_ulpq_flush(ulpq); 97 if (ulpq->malloced) 98 kfree(ulpq); 99 } 100 101 /* Process an incoming DATA chunk. */ 102 int sctp_ulpq_tail_data(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, 103 gfp_t gfp) 104 { 105 struct sk_buff_head temp; 106 sctp_data_chunk_t *hdr; 107 struct sctp_ulpevent *event; 108 109 hdr = (sctp_data_chunk_t *) chunk->chunk_hdr; 110 111 /* Create an event from the incoming chunk. */ 112 event = sctp_ulpevent_make_rcvmsg(chunk->asoc, chunk, gfp); 113 if (!event) 114 return -ENOMEM; 115 116 /* Do reassembly if needed. */ 117 event = sctp_ulpq_reasm(ulpq, event); 118 119 /* Do ordering if needed. */ 120 if ((event) && (event->msg_flags & MSG_EOR)){ 121 /* Create a temporary list to collect chunks on. */ 122 skb_queue_head_init(&temp); 123 __skb_queue_tail(&temp, sctp_event2skb(event)); 124 125 event = sctp_ulpq_order(ulpq, event); 126 } 127 128 /* Send event to the ULP. 'event' is the sctp_ulpevent for 129 * very first SKB on the 'temp' list. 130 */ 131 if (event) 132 sctp_ulpq_tail_event(ulpq, event); 133 134 return 0; 135 } 136 137 /* Add a new event for propagation to the ULP. */ 138 /* Clear the partial delivery mode for this socket. Note: This 139 * assumes that no association is currently in partial delivery mode. 140 */ 141 int sctp_clear_pd(struct sock *sk) 142 { 143 struct sctp_sock *sp = sctp_sk(sk); 144 145 sp->pd_mode = 0; 146 if (!skb_queue_empty(&sp->pd_lobby)) { 147 struct list_head *list; 148 sctp_skb_list_tail(&sp->pd_lobby, &sk->sk_receive_queue); 149 list = (struct list_head *)&sctp_sk(sk)->pd_lobby; 150 INIT_LIST_HEAD(list); 151 return 1; 152 } 153 return 0; 154 } 155 156 /* Clear the pd_mode and restart any pending messages waiting for delivery. */ 157 static int sctp_ulpq_clear_pd(struct sctp_ulpq *ulpq) 158 { 159 ulpq->pd_mode = 0; 160 return sctp_clear_pd(ulpq->asoc->base.sk); 161 } 162 163 /* If the SKB of 'event' is on a list, it is the first such member 164 * of that list. 165 */ 166 int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event) 167 { 168 struct sock *sk = ulpq->asoc->base.sk; 169 struct sk_buff_head *queue, *skb_list; 170 struct sk_buff *skb = sctp_event2skb(event); 171 int clear_pd = 0; 172 173 skb_list = (struct sk_buff_head *) skb->prev; 174 175 /* If the socket is just going to throw this away, do not 176 * even try to deliver it. 177 */ 178 if (sock_flag(sk, SOCK_DEAD) || (sk->sk_shutdown & RCV_SHUTDOWN)) 179 goto out_free; 180 181 /* Check if the user wishes to receive this event. */ 182 if (!sctp_ulpevent_is_enabled(event, &sctp_sk(sk)->subscribe)) 183 goto out_free; 184 185 /* If we are in partial delivery mode, post to the lobby until 186 * partial delivery is cleared, unless, of course _this_ is 187 * the association the cause of the partial delivery. 188 */ 189 190 if (!sctp_sk(sk)->pd_mode) { 191 queue = &sk->sk_receive_queue; 192 } else if (ulpq->pd_mode) { 193 if (event->msg_flags & MSG_NOTIFICATION) 194 queue = &sctp_sk(sk)->pd_lobby; 195 else { 196 clear_pd = event->msg_flags & MSG_EOR; 197 queue = &sk->sk_receive_queue; 198 } 199 } else 200 queue = &sctp_sk(sk)->pd_lobby; 201 202 203 /* If we are harvesting multiple skbs they will be 204 * collected on a list. 205 */ 206 if (skb_list) 207 sctp_skb_list_tail(skb_list, queue); 208 else 209 __skb_queue_tail(queue, skb); 210 211 /* Did we just complete partial delivery and need to get 212 * rolling again? Move pending data to the receive 213 * queue. 214 */ 215 if (clear_pd) 216 sctp_ulpq_clear_pd(ulpq); 217 218 if (queue == &sk->sk_receive_queue) 219 sk->sk_data_ready(sk, 0); 220 return 1; 221 222 out_free: 223 if (skb_list) 224 sctp_queue_purge_ulpevents(skb_list); 225 else 226 sctp_ulpevent_free(event); 227 228 return 0; 229 } 230 231 /* 2nd Level Abstractions */ 232 233 /* Helper function to store chunks that need to be reassembled. */ 234 static inline void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq, 235 struct sctp_ulpevent *event) 236 { 237 struct sk_buff *pos; 238 struct sctp_ulpevent *cevent; 239 __u32 tsn, ctsn; 240 241 tsn = event->tsn; 242 243 /* See if it belongs at the end. */ 244 pos = skb_peek_tail(&ulpq->reasm); 245 if (!pos) { 246 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); 247 return; 248 } 249 250 /* Short circuit just dropping it at the end. */ 251 cevent = sctp_skb2event(pos); 252 ctsn = cevent->tsn; 253 if (TSN_lt(ctsn, tsn)) { 254 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); 255 return; 256 } 257 258 /* Find the right place in this list. We store them by TSN. */ 259 skb_queue_walk(&ulpq->reasm, pos) { 260 cevent = sctp_skb2event(pos); 261 ctsn = cevent->tsn; 262 263 if (TSN_lt(tsn, ctsn)) 264 break; 265 } 266 267 /* Insert before pos. */ 268 __skb_insert(sctp_event2skb(event), pos->prev, pos, &ulpq->reasm); 269 270 } 271 272 /* Helper function to return an event corresponding to the reassembled 273 * datagram. 274 * This routine creates a re-assembled skb given the first and last skb's 275 * as stored in the reassembly queue. The skb's may be non-linear if the sctp 276 * payload was fragmented on the way and ip had to reassemble them. 277 * We add the rest of skb's to the first skb's fraglist. 278 */ 279 static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *queue, struct sk_buff *f_frag, struct sk_buff *l_frag) 280 { 281 struct sk_buff *pos; 282 struct sk_buff *new = NULL; 283 struct sctp_ulpevent *event; 284 struct sk_buff *pnext, *last; 285 struct sk_buff *list = skb_shinfo(f_frag)->frag_list; 286 287 /* Store the pointer to the 2nd skb */ 288 if (f_frag == l_frag) 289 pos = NULL; 290 else 291 pos = f_frag->next; 292 293 /* Get the last skb in the f_frag's frag_list if present. */ 294 for (last = list; list; last = list, list = list->next); 295 296 /* Add the list of remaining fragments to the first fragments 297 * frag_list. 298 */ 299 if (last) 300 last->next = pos; 301 else { 302 if (skb_cloned(f_frag)) { 303 /* This is a cloned skb, we can't just modify 304 * the frag_list. We need a new skb to do that. 305 * Instead of calling skb_unshare(), we'll do it 306 * ourselves since we need to delay the free. 307 */ 308 new = skb_copy(f_frag, GFP_ATOMIC); 309 if (!new) 310 return NULL; /* try again later */ 311 312 new->sk = f_frag->sk; 313 314 skb_shinfo(new)->frag_list = pos; 315 } else 316 skb_shinfo(f_frag)->frag_list = pos; 317 } 318 319 /* Remove the first fragment from the reassembly queue. */ 320 __skb_unlink(f_frag, queue); 321 322 /* if we did unshare, then free the old skb and re-assign */ 323 if (new) { 324 kfree_skb(f_frag); 325 f_frag = new; 326 } 327 328 while (pos) { 329 330 pnext = pos->next; 331 332 /* Update the len and data_len fields of the first fragment. */ 333 f_frag->len += pos->len; 334 f_frag->data_len += pos->len; 335 336 /* Remove the fragment from the reassembly queue. */ 337 __skb_unlink(pos, queue); 338 339 /* Break if we have reached the last fragment. */ 340 if (pos == l_frag) 341 break; 342 pos->next = pnext; 343 pos = pnext; 344 }; 345 346 event = sctp_skb2event(f_frag); 347 SCTP_INC_STATS(SCTP_MIB_REASMUSRMSGS); 348 349 return event; 350 } 351 352 353 /* Helper function to check if an incoming chunk has filled up the last 354 * missing fragment in a SCTP datagram and return the corresponding event. 355 */ 356 static inline struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ulpq) 357 { 358 struct sk_buff *pos; 359 struct sctp_ulpevent *cevent; 360 struct sk_buff *first_frag = NULL; 361 __u32 ctsn, next_tsn; 362 struct sctp_ulpevent *retval = NULL; 363 364 /* Initialized to 0 just to avoid compiler warning message. Will 365 * never be used with this value. It is referenced only after it 366 * is set when we find the first fragment of a message. 367 */ 368 next_tsn = 0; 369 370 /* The chunks are held in the reasm queue sorted by TSN. 371 * Walk through the queue sequentially and look for a sequence of 372 * fragmented chunks that complete a datagram. 373 * 'first_frag' and next_tsn are reset when we find a chunk which 374 * is the first fragment of a datagram. Once these 2 fields are set 375 * we expect to find the remaining middle fragments and the last 376 * fragment in order. If not, first_frag is reset to NULL and we 377 * start the next pass when we find another first fragment. 378 */ 379 skb_queue_walk(&ulpq->reasm, pos) { 380 cevent = sctp_skb2event(pos); 381 ctsn = cevent->tsn; 382 383 switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) { 384 case SCTP_DATA_FIRST_FRAG: 385 first_frag = pos; 386 next_tsn = ctsn + 1; 387 break; 388 389 case SCTP_DATA_MIDDLE_FRAG: 390 if ((first_frag) && (ctsn == next_tsn)) 391 next_tsn++; 392 else 393 first_frag = NULL; 394 break; 395 396 case SCTP_DATA_LAST_FRAG: 397 if (first_frag && (ctsn == next_tsn)) 398 goto found; 399 else 400 first_frag = NULL; 401 break; 402 }; 403 404 } 405 done: 406 return retval; 407 found: 408 retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, pos); 409 if (retval) 410 retval->msg_flags |= MSG_EOR; 411 goto done; 412 } 413 414 /* Retrieve the next set of fragments of a partial message. */ 415 static inline struct sctp_ulpevent *sctp_ulpq_retrieve_partial(struct sctp_ulpq *ulpq) 416 { 417 struct sk_buff *pos, *last_frag, *first_frag; 418 struct sctp_ulpevent *cevent; 419 __u32 ctsn, next_tsn; 420 int is_last; 421 struct sctp_ulpevent *retval; 422 423 /* The chunks are held in the reasm queue sorted by TSN. 424 * Walk through the queue sequentially and look for the first 425 * sequence of fragmented chunks. 426 */ 427 428 if (skb_queue_empty(&ulpq->reasm)) 429 return NULL; 430 431 last_frag = first_frag = NULL; 432 retval = NULL; 433 next_tsn = 0; 434 is_last = 0; 435 436 skb_queue_walk(&ulpq->reasm, pos) { 437 cevent = sctp_skb2event(pos); 438 ctsn = cevent->tsn; 439 440 switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) { 441 case SCTP_DATA_MIDDLE_FRAG: 442 if (!first_frag) { 443 first_frag = pos; 444 next_tsn = ctsn + 1; 445 last_frag = pos; 446 } else if (next_tsn == ctsn) 447 next_tsn++; 448 else 449 goto done; 450 break; 451 case SCTP_DATA_LAST_FRAG: 452 if (!first_frag) 453 first_frag = pos; 454 else if (ctsn != next_tsn) 455 goto done; 456 last_frag = pos; 457 is_last = 1; 458 goto done; 459 default: 460 return NULL; 461 }; 462 } 463 464 /* We have the reassembled event. There is no need to look 465 * further. 466 */ 467 done: 468 retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, last_frag); 469 if (retval && is_last) 470 retval->msg_flags |= MSG_EOR; 471 472 return retval; 473 } 474 475 476 /* Helper function to reassemble chunks. Hold chunks on the reasm queue that 477 * need reassembling. 478 */ 479 static struct sctp_ulpevent *sctp_ulpq_reasm(struct sctp_ulpq *ulpq, 480 struct sctp_ulpevent *event) 481 { 482 struct sctp_ulpevent *retval = NULL; 483 484 /* Check if this is part of a fragmented message. */ 485 if (SCTP_DATA_NOT_FRAG == (event->msg_flags & SCTP_DATA_FRAG_MASK)) { 486 event->msg_flags |= MSG_EOR; 487 return event; 488 } 489 490 sctp_ulpq_store_reasm(ulpq, event); 491 if (!ulpq->pd_mode) 492 retval = sctp_ulpq_retrieve_reassembled(ulpq); 493 else { 494 __u32 ctsn, ctsnap; 495 496 /* Do not even bother unless this is the next tsn to 497 * be delivered. 498 */ 499 ctsn = event->tsn; 500 ctsnap = sctp_tsnmap_get_ctsn(&ulpq->asoc->peer.tsn_map); 501 if (TSN_lte(ctsn, ctsnap)) 502 retval = sctp_ulpq_retrieve_partial(ulpq); 503 } 504 505 return retval; 506 } 507 508 /* Retrieve the first part (sequential fragments) for partial delivery. */ 509 static inline struct sctp_ulpevent *sctp_ulpq_retrieve_first(struct sctp_ulpq *ulpq) 510 { 511 struct sk_buff *pos, *last_frag, *first_frag; 512 struct sctp_ulpevent *cevent; 513 __u32 ctsn, next_tsn; 514 struct sctp_ulpevent *retval; 515 516 /* The chunks are held in the reasm queue sorted by TSN. 517 * Walk through the queue sequentially and look for a sequence of 518 * fragmented chunks that start a datagram. 519 */ 520 521 if (skb_queue_empty(&ulpq->reasm)) 522 return NULL; 523 524 last_frag = first_frag = NULL; 525 retval = NULL; 526 next_tsn = 0; 527 528 skb_queue_walk(&ulpq->reasm, pos) { 529 cevent = sctp_skb2event(pos); 530 ctsn = cevent->tsn; 531 532 switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) { 533 case SCTP_DATA_FIRST_FRAG: 534 if (!first_frag) { 535 first_frag = pos; 536 next_tsn = ctsn + 1; 537 last_frag = pos; 538 } else 539 goto done; 540 break; 541 542 case SCTP_DATA_MIDDLE_FRAG: 543 if (!first_frag) 544 return NULL; 545 if (ctsn == next_tsn) { 546 next_tsn++; 547 last_frag = pos; 548 } else 549 goto done; 550 break; 551 default: 552 return NULL; 553 }; 554 } 555 556 /* We have the reassembled event. There is no need to look 557 * further. 558 */ 559 done: 560 retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, last_frag); 561 return retval; 562 } 563 564 /* Helper function to gather skbs that have possibly become 565 * ordered by an an incoming chunk. 566 */ 567 static inline void sctp_ulpq_retrieve_ordered(struct sctp_ulpq *ulpq, 568 struct sctp_ulpevent *event) 569 { 570 struct sk_buff_head *event_list; 571 struct sk_buff *pos, *tmp; 572 struct sctp_ulpevent *cevent; 573 struct sctp_stream *in; 574 __u16 sid, csid; 575 __u16 ssn, cssn; 576 577 sid = event->stream; 578 ssn = event->ssn; 579 in = &ulpq->asoc->ssnmap->in; 580 581 event_list = (struct sk_buff_head *) sctp_event2skb(event)->prev; 582 583 /* We are holding the chunks by stream, by SSN. */ 584 sctp_skb_for_each(pos, &ulpq->lobby, tmp) { 585 cevent = (struct sctp_ulpevent *) pos->cb; 586 csid = cevent->stream; 587 cssn = cevent->ssn; 588 589 /* Have we gone too far? */ 590 if (csid > sid) 591 break; 592 593 /* Have we not gone far enough? */ 594 if (csid < sid) 595 continue; 596 597 if (cssn != sctp_ssn_peek(in, sid)) 598 break; 599 600 /* Found it, so mark in the ssnmap. */ 601 sctp_ssn_next(in, sid); 602 603 __skb_unlink(pos, &ulpq->lobby); 604 605 /* Attach all gathered skbs to the event. */ 606 __skb_queue_tail(event_list, pos); 607 } 608 } 609 610 /* Helper function to store chunks needing ordering. */ 611 static inline void sctp_ulpq_store_ordered(struct sctp_ulpq *ulpq, 612 struct sctp_ulpevent *event) 613 { 614 struct sk_buff *pos; 615 struct sctp_ulpevent *cevent; 616 __u16 sid, csid; 617 __u16 ssn, cssn; 618 619 pos = skb_peek_tail(&ulpq->lobby); 620 if (!pos) { 621 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); 622 return; 623 } 624 625 sid = event->stream; 626 ssn = event->ssn; 627 628 cevent = (struct sctp_ulpevent *) pos->cb; 629 csid = cevent->stream; 630 cssn = cevent->ssn; 631 if (sid > csid) { 632 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); 633 return; 634 } 635 636 if ((sid == csid) && SSN_lt(cssn, ssn)) { 637 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); 638 return; 639 } 640 641 /* Find the right place in this list. We store them by 642 * stream ID and then by SSN. 643 */ 644 skb_queue_walk(&ulpq->lobby, pos) { 645 cevent = (struct sctp_ulpevent *) pos->cb; 646 csid = cevent->stream; 647 cssn = cevent->ssn; 648 649 if (csid > sid) 650 break; 651 if (csid == sid && SSN_lt(ssn, cssn)) 652 break; 653 } 654 655 656 /* Insert before pos. */ 657 __skb_insert(sctp_event2skb(event), pos->prev, pos, &ulpq->lobby); 658 659 } 660 661 static struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *ulpq, 662 struct sctp_ulpevent *event) 663 { 664 __u16 sid, ssn; 665 struct sctp_stream *in; 666 667 /* Check if this message needs ordering. */ 668 if (SCTP_DATA_UNORDERED & event->msg_flags) 669 return event; 670 671 /* Note: The stream ID must be verified before this routine. */ 672 sid = event->stream; 673 ssn = event->ssn; 674 in = &ulpq->asoc->ssnmap->in; 675 676 /* Is this the expected SSN for this stream ID? */ 677 if (ssn != sctp_ssn_peek(in, sid)) { 678 /* We've received something out of order, so find where it 679 * needs to be placed. We order by stream and then by SSN. 680 */ 681 sctp_ulpq_store_ordered(ulpq, event); 682 return NULL; 683 } 684 685 /* Mark that the next chunk has been found. */ 686 sctp_ssn_next(in, sid); 687 688 /* Go find any other chunks that were waiting for 689 * ordering. 690 */ 691 sctp_ulpq_retrieve_ordered(ulpq, event); 692 693 return event; 694 } 695 696 /* Helper function to gather skbs that have possibly become 697 * ordered by forward tsn skipping their dependencies. 698 */ 699 static inline void sctp_ulpq_reap_ordered(struct sctp_ulpq *ulpq) 700 { 701 struct sk_buff *pos, *tmp; 702 struct sctp_ulpevent *cevent; 703 struct sctp_ulpevent *event; 704 struct sctp_stream *in; 705 struct sk_buff_head temp; 706 __u16 csid, cssn; 707 708 in = &ulpq->asoc->ssnmap->in; 709 710 /* We are holding the chunks by stream, by SSN. */ 711 skb_queue_head_init(&temp); 712 event = NULL; 713 sctp_skb_for_each(pos, &ulpq->lobby, tmp) { 714 cevent = (struct sctp_ulpevent *) pos->cb; 715 csid = cevent->stream; 716 cssn = cevent->ssn; 717 718 if (cssn != sctp_ssn_peek(in, csid)) 719 break; 720 721 /* Found it, so mark in the ssnmap. */ 722 sctp_ssn_next(in, csid); 723 724 __skb_unlink(pos, &ulpq->lobby); 725 if (!event) { 726 /* Create a temporary list to collect chunks on. */ 727 event = sctp_skb2event(pos); 728 __skb_queue_tail(&temp, sctp_event2skb(event)); 729 } else { 730 /* Attach all gathered skbs to the event. */ 731 __skb_queue_tail(&temp, pos); 732 } 733 } 734 735 /* Send event to the ULP. 'event' is the sctp_ulpevent for 736 * very first SKB on the 'temp' list. 737 */ 738 if (event) 739 sctp_ulpq_tail_event(ulpq, event); 740 } 741 742 /* Skip over an SSN. */ 743 void sctp_ulpq_skip(struct sctp_ulpq *ulpq, __u16 sid, __u16 ssn) 744 { 745 struct sctp_stream *in; 746 747 /* Note: The stream ID must be verified before this routine. */ 748 in = &ulpq->asoc->ssnmap->in; 749 750 /* Is this an old SSN? If so ignore. */ 751 if (SSN_lt(ssn, sctp_ssn_peek(in, sid))) 752 return; 753 754 /* Mark that we are no longer expecting this SSN or lower. */ 755 sctp_ssn_skip(in, sid, ssn); 756 757 /* Go find any other chunks that were waiting for 758 * ordering and deliver them if needed. 759 */ 760 sctp_ulpq_reap_ordered(ulpq); 761 return; 762 } 763 764 /* Renege 'needed' bytes from the ordering queue. */ 765 static __u16 sctp_ulpq_renege_order(struct sctp_ulpq *ulpq, __u16 needed) 766 { 767 __u16 freed = 0; 768 __u32 tsn; 769 struct sk_buff *skb; 770 struct sctp_ulpevent *event; 771 struct sctp_tsnmap *tsnmap; 772 773 tsnmap = &ulpq->asoc->peer.tsn_map; 774 775 while ((skb = __skb_dequeue_tail(&ulpq->lobby)) != NULL) { 776 freed += skb_headlen(skb); 777 event = sctp_skb2event(skb); 778 tsn = event->tsn; 779 780 sctp_ulpevent_free(event); 781 sctp_tsnmap_renege(tsnmap, tsn); 782 if (freed >= needed) 783 return freed; 784 } 785 786 return freed; 787 } 788 789 /* Renege 'needed' bytes from the reassembly queue. */ 790 static __u16 sctp_ulpq_renege_frags(struct sctp_ulpq *ulpq, __u16 needed) 791 { 792 __u16 freed = 0; 793 __u32 tsn; 794 struct sk_buff *skb; 795 struct sctp_ulpevent *event; 796 struct sctp_tsnmap *tsnmap; 797 798 tsnmap = &ulpq->asoc->peer.tsn_map; 799 800 /* Walk backwards through the list, reneges the newest tsns. */ 801 while ((skb = __skb_dequeue_tail(&ulpq->reasm)) != NULL) { 802 freed += skb_headlen(skb); 803 event = sctp_skb2event(skb); 804 tsn = event->tsn; 805 806 sctp_ulpevent_free(event); 807 sctp_tsnmap_renege(tsnmap, tsn); 808 if (freed >= needed) 809 return freed; 810 } 811 812 return freed; 813 } 814 815 /* Partial deliver the first message as there is pressure on rwnd. */ 816 void sctp_ulpq_partial_delivery(struct sctp_ulpq *ulpq, 817 struct sctp_chunk *chunk, 818 gfp_t gfp) 819 { 820 struct sctp_ulpevent *event; 821 struct sctp_association *asoc; 822 823 asoc = ulpq->asoc; 824 825 /* Are we already in partial delivery mode? */ 826 if (!sctp_sk(asoc->base.sk)->pd_mode) { 827 828 /* Is partial delivery possible? */ 829 event = sctp_ulpq_retrieve_first(ulpq); 830 /* Send event to the ULP. */ 831 if (event) { 832 sctp_ulpq_tail_event(ulpq, event); 833 sctp_sk(asoc->base.sk)->pd_mode = 1; 834 ulpq->pd_mode = 1; 835 return; 836 } 837 } 838 } 839 840 /* Renege some packets to make room for an incoming chunk. */ 841 void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, 842 gfp_t gfp) 843 { 844 struct sctp_association *asoc; 845 __u16 needed, freed; 846 847 asoc = ulpq->asoc; 848 849 if (chunk) { 850 needed = ntohs(chunk->chunk_hdr->length); 851 needed -= sizeof(sctp_data_chunk_t); 852 } else 853 needed = SCTP_DEFAULT_MAXWINDOW; 854 855 freed = 0; 856 857 if (skb_queue_empty(&asoc->base.sk->sk_receive_queue)) { 858 freed = sctp_ulpq_renege_order(ulpq, needed); 859 if (freed < needed) { 860 freed += sctp_ulpq_renege_frags(ulpq, needed - freed); 861 } 862 } 863 /* If able to free enough room, accept this chunk. */ 864 if (chunk && (freed >= needed)) { 865 __u32 tsn; 866 tsn = ntohl(chunk->subh.data_hdr->tsn); 867 sctp_tsnmap_mark(&asoc->peer.tsn_map, tsn); 868 sctp_ulpq_tail_data(ulpq, chunk, gfp); 869 870 sctp_ulpq_partial_delivery(ulpq, chunk, gfp); 871 } 872 873 return; 874 } 875 876 877 878 /* Notify the application if an association is aborted and in 879 * partial delivery mode. Send up any pending received messages. 880 */ 881 void sctp_ulpq_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp) 882 { 883 struct sctp_ulpevent *ev = NULL; 884 struct sock *sk; 885 886 if (!ulpq->pd_mode) 887 return; 888 889 sk = ulpq->asoc->base.sk; 890 if (sctp_ulpevent_type_enabled(SCTP_PARTIAL_DELIVERY_EVENT, 891 &sctp_sk(sk)->subscribe)) 892 ev = sctp_ulpevent_make_pdapi(ulpq->asoc, 893 SCTP_PARTIAL_DELIVERY_ABORTED, 894 gfp); 895 if (ev) 896 __skb_queue_tail(&sk->sk_receive_queue, sctp_event2skb(ev)); 897 898 /* If there is data waiting, send it up the socket now. */ 899 if (sctp_ulpq_clear_pd(ulpq) || ev) 900 sk->sk_data_ready(sk, 0); 901 } 902