1 /*- 2 * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. 3 * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. 4 * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * a) Redistributions of source code must retain the above copyright notice, 10 * this list of conditions and the following disclaimer. 11 * 12 * b) Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in 14 * the documentation and/or other materials provided with the distribution. 15 * 16 * c) Neither the name of Cisco Systems, Inc. nor the names of its 17 * contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #include <sys/cdefs.h> 34 __FBSDID("$FreeBSD$"); 35 36 #include <netinet/sctp_os.h> 37 #include <sys/proc.h> 38 #include <netinet/sctp_var.h> 39 #include <netinet/sctp_sysctl.h> 40 #include <netinet/sctp_header.h> 41 #include <netinet/sctp_pcb.h> 42 #include <netinet/sctputil.h> 43 #include <netinet/sctp_output.h> 44 #include <netinet/sctp_uio.h> 45 #include <netinet/sctputil.h> 46 #include <netinet/sctp_auth.h> 47 #include <netinet/sctp_timer.h> 48 #include <netinet/sctp_asconf.h> 49 #include <netinet/sctp_indata.h> 50 #include <netinet/sctp_bsd_addr.h> 51 #include <netinet/sctp_input.h> 52 #include <netinet/sctp_crc32.h> 53 #if defined(INET) || defined(INET6) 54 #include <netinet/udp.h> 55 #endif 56 #include <netinet/udp_var.h> 57 #include <machine/in_cksum.h> 58 59 60 61 #define SCTP_MAX_GAPS_INARRAY 4 62 struct sack_track { 63 uint8_t right_edge; /* mergable on the right edge */ 64 uint8_t left_edge; /* mergable on the left edge */ 65 uint8_t num_entries; 66 uint8_t spare; 67 struct sctp_gap_ack_block gaps[SCTP_MAX_GAPS_INARRAY]; 68 }; 69 70 const struct sack_track sack_array[256] = { 71 {0, 0, 0, 0, /* 0x00 */ 72 {{0, 0}, 73 {0, 0}, 74 {0, 0}, 75 {0, 0} 76 } 77 }, 78 {1, 0, 1, 0, /* 0x01 */ 79 {{0, 0}, 80 {0, 0}, 81 {0, 0}, 82 {0, 0} 83 } 84 }, 85 {0, 0, 1, 0, /* 0x02 */ 86 {{1, 1}, 87 {0, 0}, 88 {0, 0}, 89 {0, 0} 90 } 91 }, 92 {1, 0, 1, 0, /* 0x03 */ 93 {{0, 1}, 94 {0, 0}, 95 {0, 0}, 96 {0, 0} 97 } 98 }, 99 {0, 0, 1, 0, /* 0x04 */ 100 {{2, 2}, 101 {0, 0}, 102 {0, 0}, 103 {0, 0} 104 } 105 }, 106 {1, 0, 2, 0, /* 0x05 */ 107 {{0, 0}, 108 {2, 2}, 109 {0, 0}, 110 {0, 0} 111 } 112 }, 113 {0, 0, 1, 0, /* 0x06 */ 114 {{1, 2}, 115 {0, 0}, 116 {0, 0}, 117 {0, 0} 118 } 119 }, 120 {1, 0, 1, 0, /* 0x07 */ 121 {{0, 2}, 122 {0, 0}, 123 {0, 0}, 124 {0, 0} 125 } 126 }, 127 {0, 0, 1, 0, /* 0x08 */ 128 {{3, 3}, 129 {0, 0}, 130 {0, 0}, 131 {0, 0} 132 } 133 }, 134 {1, 0, 2, 0, /* 0x09 */ 135 {{0, 0}, 136 {3, 3}, 137 {0, 0}, 138 {0, 0} 139 } 140 }, 141 {0, 0, 2, 0, /* 0x0a */ 142 {{1, 1}, 143 {3, 3}, 144 {0, 0}, 145 {0, 0} 146 } 147 }, 148 {1, 0, 2, 0, /* 0x0b */ 149 {{0, 1}, 150 {3, 3}, 151 {0, 0}, 152 {0, 0} 153 } 154 }, 155 {0, 0, 1, 0, /* 0x0c */ 156 {{2, 3}, 157 {0, 0}, 158 {0, 0}, 159 {0, 0} 160 } 161 }, 162 {1, 0, 2, 0, /* 0x0d */ 163 {{0, 0}, 164 {2, 3}, 165 {0, 0}, 166 {0, 0} 167 } 168 }, 169 {0, 0, 1, 0, /* 0x0e */ 170 {{1, 3}, 171 {0, 0}, 172 {0, 0}, 173 {0, 0} 174 } 175 }, 176 {1, 0, 1, 0, /* 0x0f */ 177 {{0, 3}, 178 {0, 0}, 179 {0, 0}, 180 {0, 0} 181 } 182 }, 183 {0, 0, 1, 0, /* 0x10 */ 184 {{4, 4}, 185 {0, 0}, 186 {0, 0}, 187 {0, 0} 188 } 189 }, 190 {1, 0, 2, 0, /* 0x11 */ 191 {{0, 0}, 192 {4, 4}, 193 {0, 0}, 194 {0, 0} 195 } 196 }, 197 {0, 0, 2, 0, /* 0x12 */ 198 {{1, 1}, 199 {4, 4}, 200 {0, 0}, 201 {0, 0} 202 } 203 }, 204 {1, 0, 2, 0, /* 0x13 */ 205 {{0, 1}, 206 {4, 4}, 207 {0, 0}, 208 {0, 0} 209 } 210 }, 211 {0, 0, 2, 0, /* 0x14 */ 212 {{2, 2}, 213 {4, 4}, 214 {0, 0}, 215 {0, 0} 216 } 217 }, 218 {1, 0, 3, 0, /* 0x15 */ 219 {{0, 0}, 220 {2, 2}, 221 {4, 4}, 222 {0, 0} 223 } 224 }, 225 {0, 0, 2, 0, /* 0x16 */ 226 {{1, 2}, 227 {4, 4}, 228 {0, 0}, 229 {0, 0} 230 } 231 }, 232 {1, 0, 2, 0, /* 0x17 */ 233 {{0, 2}, 234 {4, 4}, 235 {0, 0}, 236 {0, 0} 237 } 238 }, 239 {0, 0, 1, 0, /* 0x18 */ 240 {{3, 4}, 241 {0, 0}, 242 {0, 0}, 243 {0, 0} 244 } 245 }, 246 {1, 0, 2, 0, /* 0x19 */ 247 {{0, 0}, 248 {3, 4}, 249 {0, 0}, 250 {0, 0} 251 } 252 }, 253 {0, 0, 2, 0, /* 0x1a */ 254 {{1, 1}, 255 {3, 4}, 256 {0, 0}, 257 {0, 0} 258 } 259 }, 260 {1, 0, 2, 0, /* 0x1b */ 261 {{0, 1}, 262 {3, 4}, 263 {0, 0}, 264 {0, 0} 265 } 266 }, 267 {0, 0, 1, 0, /* 0x1c */ 268 {{2, 4}, 269 {0, 0}, 270 {0, 0}, 271 {0, 0} 272 } 273 }, 274 {1, 0, 2, 0, /* 0x1d */ 275 {{0, 0}, 276 {2, 4}, 277 {0, 0}, 278 {0, 0} 279 } 280 }, 281 {0, 0, 1, 0, /* 0x1e */ 282 {{1, 4}, 283 {0, 0}, 284 {0, 0}, 285 {0, 0} 286 } 287 }, 288 {1, 0, 1, 0, /* 0x1f */ 289 {{0, 4}, 290 {0, 0}, 291 {0, 0}, 292 {0, 0} 293 } 294 }, 295 {0, 0, 1, 0, /* 0x20 */ 296 {{5, 5}, 297 {0, 0}, 298 {0, 0}, 299 {0, 0} 300 } 301 }, 302 {1, 0, 2, 0, /* 0x21 */ 303 {{0, 0}, 304 {5, 5}, 305 {0, 0}, 306 {0, 0} 307 } 308 }, 309 {0, 0, 2, 0, /* 0x22 */ 310 {{1, 1}, 311 {5, 5}, 312 {0, 0}, 313 {0, 0} 314 } 315 }, 316 {1, 0, 2, 0, /* 0x23 */ 317 {{0, 1}, 318 {5, 5}, 319 {0, 0}, 320 {0, 0} 321 } 322 }, 323 {0, 0, 2, 0, /* 0x24 */ 324 {{2, 2}, 325 {5, 5}, 326 {0, 0}, 327 {0, 0} 328 } 329 }, 330 {1, 0, 3, 0, /* 0x25 */ 331 {{0, 0}, 332 {2, 2}, 333 {5, 5}, 334 {0, 0} 335 } 336 }, 337 {0, 0, 2, 0, /* 0x26 */ 338 {{1, 2}, 339 {5, 5}, 340 {0, 0}, 341 {0, 0} 342 } 343 }, 344 {1, 0, 2, 0, /* 0x27 */ 345 {{0, 2}, 346 {5, 5}, 347 {0, 0}, 348 {0, 0} 349 } 350 }, 351 {0, 0, 2, 0, /* 0x28 */ 352 {{3, 3}, 353 {5, 5}, 354 {0, 0}, 355 {0, 0} 356 } 357 }, 358 {1, 0, 3, 0, /* 0x29 */ 359 {{0, 0}, 360 {3, 3}, 361 {5, 5}, 362 {0, 0} 363 } 364 }, 365 {0, 0, 3, 0, /* 0x2a */ 366 {{1, 1}, 367 {3, 3}, 368 {5, 5}, 369 {0, 0} 370 } 371 }, 372 {1, 0, 3, 0, /* 0x2b */ 373 {{0, 1}, 374 {3, 3}, 375 {5, 5}, 376 {0, 0} 377 } 378 }, 379 {0, 0, 2, 0, /* 0x2c */ 380 {{2, 3}, 381 {5, 5}, 382 {0, 0}, 383 {0, 0} 384 } 385 }, 386 {1, 0, 3, 0, /* 0x2d */ 387 {{0, 0}, 388 {2, 3}, 389 {5, 5}, 390 {0, 0} 391 } 392 }, 393 {0, 0, 2, 0, /* 0x2e */ 394 {{1, 3}, 395 {5, 5}, 396 {0, 0}, 397 {0, 0} 398 } 399 }, 400 {1, 0, 2, 0, /* 0x2f */ 401 {{0, 3}, 402 {5, 5}, 403 {0, 0}, 404 {0, 0} 405 } 406 }, 407 {0, 0, 1, 0, /* 0x30 */ 408 {{4, 5}, 409 {0, 0}, 410 {0, 0}, 411 {0, 0} 412 } 413 }, 414 {1, 0, 2, 0, /* 0x31 */ 415 {{0, 0}, 416 {4, 5}, 417 {0, 0}, 418 {0, 0} 419 } 420 }, 421 {0, 0, 2, 0, /* 0x32 */ 422 {{1, 1}, 423 {4, 5}, 424 {0, 0}, 425 {0, 0} 426 } 427 }, 428 {1, 0, 2, 0, /* 0x33 */ 429 {{0, 1}, 430 {4, 5}, 431 {0, 0}, 432 {0, 0} 433 } 434 }, 435 {0, 0, 2, 0, /* 0x34 */ 436 {{2, 2}, 437 {4, 5}, 438 {0, 0}, 439 {0, 0} 440 } 441 }, 442 {1, 0, 3, 0, /* 0x35 */ 443 {{0, 0}, 444 {2, 2}, 445 {4, 5}, 446 {0, 0} 447 } 448 }, 449 {0, 0, 2, 0, /* 0x36 */ 450 {{1, 2}, 451 {4, 5}, 452 {0, 0}, 453 {0, 0} 454 } 455 }, 456 {1, 0, 2, 0, /* 0x37 */ 457 {{0, 2}, 458 {4, 5}, 459 {0, 0}, 460 {0, 0} 461 } 462 }, 463 {0, 0, 1, 0, /* 0x38 */ 464 {{3, 5}, 465 {0, 0}, 466 {0, 0}, 467 {0, 0} 468 } 469 }, 470 {1, 0, 2, 0, /* 0x39 */ 471 {{0, 0}, 472 {3, 5}, 473 {0, 0}, 474 {0, 0} 475 } 476 }, 477 {0, 0, 2, 0, /* 0x3a */ 478 {{1, 1}, 479 {3, 5}, 480 {0, 0}, 481 {0, 0} 482 } 483 }, 484 {1, 0, 2, 0, /* 0x3b */ 485 {{0, 1}, 486 {3, 5}, 487 {0, 0}, 488 {0, 0} 489 } 490 }, 491 {0, 0, 1, 0, /* 0x3c */ 492 {{2, 5}, 493 {0, 0}, 494 {0, 0}, 495 {0, 0} 496 } 497 }, 498 {1, 0, 2, 0, /* 0x3d */ 499 {{0, 0}, 500 {2, 5}, 501 {0, 0}, 502 {0, 0} 503 } 504 }, 505 {0, 0, 1, 0, /* 0x3e */ 506 {{1, 5}, 507 {0, 0}, 508 {0, 0}, 509 {0, 0} 510 } 511 }, 512 {1, 0, 1, 0, /* 0x3f */ 513 {{0, 5}, 514 {0, 0}, 515 {0, 0}, 516 {0, 0} 517 } 518 }, 519 {0, 0, 1, 0, /* 0x40 */ 520 {{6, 6}, 521 {0, 0}, 522 {0, 0}, 523 {0, 0} 524 } 525 }, 526 {1, 0, 2, 0, /* 0x41 */ 527 {{0, 0}, 528 {6, 6}, 529 {0, 0}, 530 {0, 0} 531 } 532 }, 533 {0, 0, 2, 0, /* 0x42 */ 534 {{1, 1}, 535 {6, 6}, 536 {0, 0}, 537 {0, 0} 538 } 539 }, 540 {1, 0, 2, 0, /* 0x43 */ 541 {{0, 1}, 542 {6, 6}, 543 {0, 0}, 544 {0, 0} 545 } 546 }, 547 {0, 0, 2, 0, /* 0x44 */ 548 {{2, 2}, 549 {6, 6}, 550 {0, 0}, 551 {0, 0} 552 } 553 }, 554 {1, 0, 3, 0, /* 0x45 */ 555 {{0, 0}, 556 {2, 2}, 557 {6, 6}, 558 {0, 0} 559 } 560 }, 561 {0, 0, 2, 0, /* 0x46 */ 562 {{1, 2}, 563 {6, 6}, 564 {0, 0}, 565 {0, 0} 566 } 567 }, 568 {1, 0, 2, 0, /* 0x47 */ 569 {{0, 2}, 570 {6, 6}, 571 {0, 0}, 572 {0, 0} 573 } 574 }, 575 {0, 0, 2, 0, /* 0x48 */ 576 {{3, 3}, 577 {6, 6}, 578 {0, 0}, 579 {0, 0} 580 } 581 }, 582 {1, 0, 3, 0, /* 0x49 */ 583 {{0, 0}, 584 {3, 3}, 585 {6, 6}, 586 {0, 0} 587 } 588 }, 589 {0, 0, 3, 0, /* 0x4a */ 590 {{1, 1}, 591 {3, 3}, 592 {6, 6}, 593 {0, 0} 594 } 595 }, 596 {1, 0, 3, 0, /* 0x4b */ 597 {{0, 1}, 598 {3, 3}, 599 {6, 6}, 600 {0, 0} 601 } 602 }, 603 {0, 0, 2, 0, /* 0x4c */ 604 {{2, 3}, 605 {6, 6}, 606 {0, 0}, 607 {0, 0} 608 } 609 }, 610 {1, 0, 3, 0, /* 0x4d */ 611 {{0, 0}, 612 {2, 3}, 613 {6, 6}, 614 {0, 0} 615 } 616 }, 617 {0, 0, 2, 0, /* 0x4e */ 618 {{1, 3}, 619 {6, 6}, 620 {0, 0}, 621 {0, 0} 622 } 623 }, 624 {1, 0, 2, 0, /* 0x4f */ 625 {{0, 3}, 626 {6, 6}, 627 {0, 0}, 628 {0, 0} 629 } 630 }, 631 {0, 0, 2, 0, /* 0x50 */ 632 {{4, 4}, 633 {6, 6}, 634 {0, 0}, 635 {0, 0} 636 } 637 }, 638 {1, 0, 3, 0, /* 0x51 */ 639 {{0, 0}, 640 {4, 4}, 641 {6, 6}, 642 {0, 0} 643 } 644 }, 645 {0, 0, 3, 0, /* 0x52 */ 646 {{1, 1}, 647 {4, 4}, 648 {6, 6}, 649 {0, 0} 650 } 651 }, 652 {1, 0, 3, 0, /* 0x53 */ 653 {{0, 1}, 654 {4, 4}, 655 {6, 6}, 656 {0, 0} 657 } 658 }, 659 {0, 0, 3, 0, /* 0x54 */ 660 {{2, 2}, 661 {4, 4}, 662 {6, 6}, 663 {0, 0} 664 } 665 }, 666 {1, 0, 4, 0, /* 0x55 */ 667 {{0, 0}, 668 {2, 2}, 669 {4, 4}, 670 {6, 6} 671 } 672 }, 673 {0, 0, 3, 0, /* 0x56 */ 674 {{1, 2}, 675 {4, 4}, 676 {6, 6}, 677 {0, 0} 678 } 679 }, 680 {1, 0, 3, 0, /* 0x57 */ 681 {{0, 2}, 682 {4, 4}, 683 {6, 6}, 684 {0, 0} 685 } 686 }, 687 {0, 0, 2, 0, /* 0x58 */ 688 {{3, 4}, 689 {6, 6}, 690 {0, 0}, 691 {0, 0} 692 } 693 }, 694 {1, 0, 3, 0, /* 0x59 */ 695 {{0, 0}, 696 {3, 4}, 697 {6, 6}, 698 {0, 0} 699 } 700 }, 701 {0, 0, 3, 0, /* 0x5a */ 702 {{1, 1}, 703 {3, 4}, 704 {6, 6}, 705 {0, 0} 706 } 707 }, 708 {1, 0, 3, 0, /* 0x5b */ 709 {{0, 1}, 710 {3, 4}, 711 {6, 6}, 712 {0, 0} 713 } 714 }, 715 {0, 0, 2, 0, /* 0x5c */ 716 {{2, 4}, 717 {6, 6}, 718 {0, 0}, 719 {0, 0} 720 } 721 }, 722 {1, 0, 3, 0, /* 0x5d */ 723 {{0, 0}, 724 {2, 4}, 725 {6, 6}, 726 {0, 0} 727 } 728 }, 729 {0, 0, 2, 0, /* 0x5e */ 730 {{1, 4}, 731 {6, 6}, 732 {0, 0}, 733 {0, 0} 734 } 735 }, 736 {1, 0, 2, 0, /* 0x5f */ 737 {{0, 4}, 738 {6, 6}, 739 {0, 0}, 740 {0, 0} 741 } 742 }, 743 {0, 0, 1, 0, /* 0x60 */ 744 {{5, 6}, 745 {0, 0}, 746 {0, 0}, 747 {0, 0} 748 } 749 }, 750 {1, 0, 2, 0, /* 0x61 */ 751 {{0, 0}, 752 {5, 6}, 753 {0, 0}, 754 {0, 0} 755 } 756 }, 757 {0, 0, 2, 0, /* 0x62 */ 758 {{1, 1}, 759 {5, 6}, 760 {0, 0}, 761 {0, 0} 762 } 763 }, 764 {1, 0, 2, 0, /* 0x63 */ 765 {{0, 1}, 766 {5, 6}, 767 {0, 0}, 768 {0, 0} 769 } 770 }, 771 {0, 0, 2, 0, /* 0x64 */ 772 {{2, 2}, 773 {5, 6}, 774 {0, 0}, 775 {0, 0} 776 } 777 }, 778 {1, 0, 3, 0, /* 0x65 */ 779 {{0, 0}, 780 {2, 2}, 781 {5, 6}, 782 {0, 0} 783 } 784 }, 785 {0, 0, 2, 0, /* 0x66 */ 786 {{1, 2}, 787 {5, 6}, 788 {0, 0}, 789 {0, 0} 790 } 791 }, 792 {1, 0, 2, 0, /* 0x67 */ 793 {{0, 2}, 794 {5, 6}, 795 {0, 0}, 796 {0, 0} 797 } 798 }, 799 {0, 0, 2, 0, /* 0x68 */ 800 {{3, 3}, 801 {5, 6}, 802 {0, 0}, 803 {0, 0} 804 } 805 }, 806 {1, 0, 3, 0, /* 0x69 */ 807 {{0, 0}, 808 {3, 3}, 809 {5, 6}, 810 {0, 0} 811 } 812 }, 813 {0, 0, 3, 0, /* 0x6a */ 814 {{1, 1}, 815 {3, 3}, 816 {5, 6}, 817 {0, 0} 818 } 819 }, 820 {1, 0, 3, 0, /* 0x6b */ 821 {{0, 1}, 822 {3, 3}, 823 {5, 6}, 824 {0, 0} 825 } 826 }, 827 {0, 0, 2, 0, /* 0x6c */ 828 {{2, 3}, 829 {5, 6}, 830 {0, 0}, 831 {0, 0} 832 } 833 }, 834 {1, 0, 3, 0, /* 0x6d */ 835 {{0, 0}, 836 {2, 3}, 837 {5, 6}, 838 {0, 0} 839 } 840 }, 841 {0, 0, 2, 0, /* 0x6e */ 842 {{1, 3}, 843 {5, 6}, 844 {0, 0}, 845 {0, 0} 846 } 847 }, 848 {1, 0, 2, 0, /* 0x6f */ 849 {{0, 3}, 850 {5, 6}, 851 {0, 0}, 852 {0, 0} 853 } 854 }, 855 {0, 0, 1, 0, /* 0x70 */ 856 {{4, 6}, 857 {0, 0}, 858 {0, 0}, 859 {0, 0} 860 } 861 }, 862 {1, 0, 2, 0, /* 0x71 */ 863 {{0, 0}, 864 {4, 6}, 865 {0, 0}, 866 {0, 0} 867 } 868 }, 869 {0, 0, 2, 0, /* 0x72 */ 870 {{1, 1}, 871 {4, 6}, 872 {0, 0}, 873 {0, 0} 874 } 875 }, 876 {1, 0, 2, 0, /* 0x73 */ 877 {{0, 1}, 878 {4, 6}, 879 {0, 0}, 880 {0, 0} 881 } 882 }, 883 {0, 0, 2, 0, /* 0x74 */ 884 {{2, 2}, 885 {4, 6}, 886 {0, 0}, 887 {0, 0} 888 } 889 }, 890 {1, 0, 3, 0, /* 0x75 */ 891 {{0, 0}, 892 {2, 2}, 893 {4, 6}, 894 {0, 0} 895 } 896 }, 897 {0, 0, 2, 0, /* 0x76 */ 898 {{1, 2}, 899 {4, 6}, 900 {0, 0}, 901 {0, 0} 902 } 903 }, 904 {1, 0, 2, 0, /* 0x77 */ 905 {{0, 2}, 906 {4, 6}, 907 {0, 0}, 908 {0, 0} 909 } 910 }, 911 {0, 0, 1, 0, /* 0x78 */ 912 {{3, 6}, 913 {0, 0}, 914 {0, 0}, 915 {0, 0} 916 } 917 }, 918 {1, 0, 2, 0, /* 0x79 */ 919 {{0, 0}, 920 {3, 6}, 921 {0, 0}, 922 {0, 0} 923 } 924 }, 925 {0, 0, 2, 0, /* 0x7a */ 926 {{1, 1}, 927 {3, 6}, 928 {0, 0}, 929 {0, 0} 930 } 931 }, 932 {1, 0, 2, 0, /* 0x7b */ 933 {{0, 1}, 934 {3, 6}, 935 {0, 0}, 936 {0, 0} 937 } 938 }, 939 {0, 0, 1, 0, /* 0x7c */ 940 {{2, 6}, 941 {0, 0}, 942 {0, 0}, 943 {0, 0} 944 } 945 }, 946 {1, 0, 2, 0, /* 0x7d */ 947 {{0, 0}, 948 {2, 6}, 949 {0, 0}, 950 {0, 0} 951 } 952 }, 953 {0, 0, 1, 0, /* 0x7e */ 954 {{1, 6}, 955 {0, 0}, 956 {0, 0}, 957 {0, 0} 958 } 959 }, 960 {1, 0, 1, 0, /* 0x7f */ 961 {{0, 6}, 962 {0, 0}, 963 {0, 0}, 964 {0, 0} 965 } 966 }, 967 {0, 1, 1, 0, /* 0x80 */ 968 {{7, 7}, 969 {0, 0}, 970 {0, 0}, 971 {0, 0} 972 } 973 }, 974 {1, 1, 2, 0, /* 0x81 */ 975 {{0, 0}, 976 {7, 7}, 977 {0, 0}, 978 {0, 0} 979 } 980 }, 981 {0, 1, 2, 0, /* 0x82 */ 982 {{1, 1}, 983 {7, 7}, 984 {0, 0}, 985 {0, 0} 986 } 987 }, 988 {1, 1, 2, 0, /* 0x83 */ 989 {{0, 1}, 990 {7, 7}, 991 {0, 0}, 992 {0, 0} 993 } 994 }, 995 {0, 1, 2, 0, /* 0x84 */ 996 {{2, 2}, 997 {7, 7}, 998 {0, 0}, 999 {0, 0} 1000 } 1001 }, 1002 {1, 1, 3, 0, /* 0x85 */ 1003 {{0, 0}, 1004 {2, 2}, 1005 {7, 7}, 1006 {0, 0} 1007 } 1008 }, 1009 {0, 1, 2, 0, /* 0x86 */ 1010 {{1, 2}, 1011 {7, 7}, 1012 {0, 0}, 1013 {0, 0} 1014 } 1015 }, 1016 {1, 1, 2, 0, /* 0x87 */ 1017 {{0, 2}, 1018 {7, 7}, 1019 {0, 0}, 1020 {0, 0} 1021 } 1022 }, 1023 {0, 1, 2, 0, /* 0x88 */ 1024 {{3, 3}, 1025 {7, 7}, 1026 {0, 0}, 1027 {0, 0} 1028 } 1029 }, 1030 {1, 1, 3, 0, /* 0x89 */ 1031 {{0, 0}, 1032 {3, 3}, 1033 {7, 7}, 1034 {0, 0} 1035 } 1036 }, 1037 {0, 1, 3, 0, /* 0x8a */ 1038 {{1, 1}, 1039 {3, 3}, 1040 {7, 7}, 1041 {0, 0} 1042 } 1043 }, 1044 {1, 1, 3, 0, /* 0x8b */ 1045 {{0, 1}, 1046 {3, 3}, 1047 {7, 7}, 1048 {0, 0} 1049 } 1050 }, 1051 {0, 1, 2, 0, /* 0x8c */ 1052 {{2, 3}, 1053 {7, 7}, 1054 {0, 0}, 1055 {0, 0} 1056 } 1057 }, 1058 {1, 1, 3, 0, /* 0x8d */ 1059 {{0, 0}, 1060 {2, 3}, 1061 {7, 7}, 1062 {0, 0} 1063 } 1064 }, 1065 {0, 1, 2, 0, /* 0x8e */ 1066 {{1, 3}, 1067 {7, 7}, 1068 {0, 0}, 1069 {0, 0} 1070 } 1071 }, 1072 {1, 1, 2, 0, /* 0x8f */ 1073 {{0, 3}, 1074 {7, 7}, 1075 {0, 0}, 1076 {0, 0} 1077 } 1078 }, 1079 {0, 1, 2, 0, /* 0x90 */ 1080 {{4, 4}, 1081 {7, 7}, 1082 {0, 0}, 1083 {0, 0} 1084 } 1085 }, 1086 {1, 1, 3, 0, /* 0x91 */ 1087 {{0, 0}, 1088 {4, 4}, 1089 {7, 7}, 1090 {0, 0} 1091 } 1092 }, 1093 {0, 1, 3, 0, /* 0x92 */ 1094 {{1, 1}, 1095 {4, 4}, 1096 {7, 7}, 1097 {0, 0} 1098 } 1099 }, 1100 {1, 1, 3, 0, /* 0x93 */ 1101 {{0, 1}, 1102 {4, 4}, 1103 {7, 7}, 1104 {0, 0} 1105 } 1106 }, 1107 {0, 1, 3, 0, /* 0x94 */ 1108 {{2, 2}, 1109 {4, 4}, 1110 {7, 7}, 1111 {0, 0} 1112 } 1113 }, 1114 {1, 1, 4, 0, /* 0x95 */ 1115 {{0, 0}, 1116 {2, 2}, 1117 {4, 4}, 1118 {7, 7} 1119 } 1120 }, 1121 {0, 1, 3, 0, /* 0x96 */ 1122 {{1, 2}, 1123 {4, 4}, 1124 {7, 7}, 1125 {0, 0} 1126 } 1127 }, 1128 {1, 1, 3, 0, /* 0x97 */ 1129 {{0, 2}, 1130 {4, 4}, 1131 {7, 7}, 1132 {0, 0} 1133 } 1134 }, 1135 {0, 1, 2, 0, /* 0x98 */ 1136 {{3, 4}, 1137 {7, 7}, 1138 {0, 0}, 1139 {0, 0} 1140 } 1141 }, 1142 {1, 1, 3, 0, /* 0x99 */ 1143 {{0, 0}, 1144 {3, 4}, 1145 {7, 7}, 1146 {0, 0} 1147 } 1148 }, 1149 {0, 1, 3, 0, /* 0x9a */ 1150 {{1, 1}, 1151 {3, 4}, 1152 {7, 7}, 1153 {0, 0} 1154 } 1155 }, 1156 {1, 1, 3, 0, /* 0x9b */ 1157 {{0, 1}, 1158 {3, 4}, 1159 {7, 7}, 1160 {0, 0} 1161 } 1162 }, 1163 {0, 1, 2, 0, /* 0x9c */ 1164 {{2, 4}, 1165 {7, 7}, 1166 {0, 0}, 1167 {0, 0} 1168 } 1169 }, 1170 {1, 1, 3, 0, /* 0x9d */ 1171 {{0, 0}, 1172 {2, 4}, 1173 {7, 7}, 1174 {0, 0} 1175 } 1176 }, 1177 {0, 1, 2, 0, /* 0x9e */ 1178 {{1, 4}, 1179 {7, 7}, 1180 {0, 0}, 1181 {0, 0} 1182 } 1183 }, 1184 {1, 1, 2, 0, /* 0x9f */ 1185 {{0, 4}, 1186 {7, 7}, 1187 {0, 0}, 1188 {0, 0} 1189 } 1190 }, 1191 {0, 1, 2, 0, /* 0xa0 */ 1192 {{5, 5}, 1193 {7, 7}, 1194 {0, 0}, 1195 {0, 0} 1196 } 1197 }, 1198 {1, 1, 3, 0, /* 0xa1 */ 1199 {{0, 0}, 1200 {5, 5}, 1201 {7, 7}, 1202 {0, 0} 1203 } 1204 }, 1205 {0, 1, 3, 0, /* 0xa2 */ 1206 {{1, 1}, 1207 {5, 5}, 1208 {7, 7}, 1209 {0, 0} 1210 } 1211 }, 1212 {1, 1, 3, 0, /* 0xa3 */ 1213 {{0, 1}, 1214 {5, 5}, 1215 {7, 7}, 1216 {0, 0} 1217 } 1218 }, 1219 {0, 1, 3, 0, /* 0xa4 */ 1220 {{2, 2}, 1221 {5, 5}, 1222 {7, 7}, 1223 {0, 0} 1224 } 1225 }, 1226 {1, 1, 4, 0, /* 0xa5 */ 1227 {{0, 0}, 1228 {2, 2}, 1229 {5, 5}, 1230 {7, 7} 1231 } 1232 }, 1233 {0, 1, 3, 0, /* 0xa6 */ 1234 {{1, 2}, 1235 {5, 5}, 1236 {7, 7}, 1237 {0, 0} 1238 } 1239 }, 1240 {1, 1, 3, 0, /* 0xa7 */ 1241 {{0, 2}, 1242 {5, 5}, 1243 {7, 7}, 1244 {0, 0} 1245 } 1246 }, 1247 {0, 1, 3, 0, /* 0xa8 */ 1248 {{3, 3}, 1249 {5, 5}, 1250 {7, 7}, 1251 {0, 0} 1252 } 1253 }, 1254 {1, 1, 4, 0, /* 0xa9 */ 1255 {{0, 0}, 1256 {3, 3}, 1257 {5, 5}, 1258 {7, 7} 1259 } 1260 }, 1261 {0, 1, 4, 0, /* 0xaa */ 1262 {{1, 1}, 1263 {3, 3}, 1264 {5, 5}, 1265 {7, 7} 1266 } 1267 }, 1268 {1, 1, 4, 0, /* 0xab */ 1269 {{0, 1}, 1270 {3, 3}, 1271 {5, 5}, 1272 {7, 7} 1273 } 1274 }, 1275 {0, 1, 3, 0, /* 0xac */ 1276 {{2, 3}, 1277 {5, 5}, 1278 {7, 7}, 1279 {0, 0} 1280 } 1281 }, 1282 {1, 1, 4, 0, /* 0xad */ 1283 {{0, 0}, 1284 {2, 3}, 1285 {5, 5}, 1286 {7, 7} 1287 } 1288 }, 1289 {0, 1, 3, 0, /* 0xae */ 1290 {{1, 3}, 1291 {5, 5}, 1292 {7, 7}, 1293 {0, 0} 1294 } 1295 }, 1296 {1, 1, 3, 0, /* 0xaf */ 1297 {{0, 3}, 1298 {5, 5}, 1299 {7, 7}, 1300 {0, 0} 1301 } 1302 }, 1303 {0, 1, 2, 0, /* 0xb0 */ 1304 {{4, 5}, 1305 {7, 7}, 1306 {0, 0}, 1307 {0, 0} 1308 } 1309 }, 1310 {1, 1, 3, 0, /* 0xb1 */ 1311 {{0, 0}, 1312 {4, 5}, 1313 {7, 7}, 1314 {0, 0} 1315 } 1316 }, 1317 {0, 1, 3, 0, /* 0xb2 */ 1318 {{1, 1}, 1319 {4, 5}, 1320 {7, 7}, 1321 {0, 0} 1322 } 1323 }, 1324 {1, 1, 3, 0, /* 0xb3 */ 1325 {{0, 1}, 1326 {4, 5}, 1327 {7, 7}, 1328 {0, 0} 1329 } 1330 }, 1331 {0, 1, 3, 0, /* 0xb4 */ 1332 {{2, 2}, 1333 {4, 5}, 1334 {7, 7}, 1335 {0, 0} 1336 } 1337 }, 1338 {1, 1, 4, 0, /* 0xb5 */ 1339 {{0, 0}, 1340 {2, 2}, 1341 {4, 5}, 1342 {7, 7} 1343 } 1344 }, 1345 {0, 1, 3, 0, /* 0xb6 */ 1346 {{1, 2}, 1347 {4, 5}, 1348 {7, 7}, 1349 {0, 0} 1350 } 1351 }, 1352 {1, 1, 3, 0, /* 0xb7 */ 1353 {{0, 2}, 1354 {4, 5}, 1355 {7, 7}, 1356 {0, 0} 1357 } 1358 }, 1359 {0, 1, 2, 0, /* 0xb8 */ 1360 {{3, 5}, 1361 {7, 7}, 1362 {0, 0}, 1363 {0, 0} 1364 } 1365 }, 1366 {1, 1, 3, 0, /* 0xb9 */ 1367 {{0, 0}, 1368 {3, 5}, 1369 {7, 7}, 1370 {0, 0} 1371 } 1372 }, 1373 {0, 1, 3, 0, /* 0xba */ 1374 {{1, 1}, 1375 {3, 5}, 1376 {7, 7}, 1377 {0, 0} 1378 } 1379 }, 1380 {1, 1, 3, 0, /* 0xbb */ 1381 {{0, 1}, 1382 {3, 5}, 1383 {7, 7}, 1384 {0, 0} 1385 } 1386 }, 1387 {0, 1, 2, 0, /* 0xbc */ 1388 {{2, 5}, 1389 {7, 7}, 1390 {0, 0}, 1391 {0, 0} 1392 } 1393 }, 1394 {1, 1, 3, 0, /* 0xbd */ 1395 {{0, 0}, 1396 {2, 5}, 1397 {7, 7}, 1398 {0, 0} 1399 } 1400 }, 1401 {0, 1, 2, 0, /* 0xbe */ 1402 {{1, 5}, 1403 {7, 7}, 1404 {0, 0}, 1405 {0, 0} 1406 } 1407 }, 1408 {1, 1, 2, 0, /* 0xbf */ 1409 {{0, 5}, 1410 {7, 7}, 1411 {0, 0}, 1412 {0, 0} 1413 } 1414 }, 1415 {0, 1, 1, 0, /* 0xc0 */ 1416 {{6, 7}, 1417 {0, 0}, 1418 {0, 0}, 1419 {0, 0} 1420 } 1421 }, 1422 {1, 1, 2, 0, /* 0xc1 */ 1423 {{0, 0}, 1424 {6, 7}, 1425 {0, 0}, 1426 {0, 0} 1427 } 1428 }, 1429 {0, 1, 2, 0, /* 0xc2 */ 1430 {{1, 1}, 1431 {6, 7}, 1432 {0, 0}, 1433 {0, 0} 1434 } 1435 }, 1436 {1, 1, 2, 0, /* 0xc3 */ 1437 {{0, 1}, 1438 {6, 7}, 1439 {0, 0}, 1440 {0, 0} 1441 } 1442 }, 1443 {0, 1, 2, 0, /* 0xc4 */ 1444 {{2, 2}, 1445 {6, 7}, 1446 {0, 0}, 1447 {0, 0} 1448 } 1449 }, 1450 {1, 1, 3, 0, /* 0xc5 */ 1451 {{0, 0}, 1452 {2, 2}, 1453 {6, 7}, 1454 {0, 0} 1455 } 1456 }, 1457 {0, 1, 2, 0, /* 0xc6 */ 1458 {{1, 2}, 1459 {6, 7}, 1460 {0, 0}, 1461 {0, 0} 1462 } 1463 }, 1464 {1, 1, 2, 0, /* 0xc7 */ 1465 {{0, 2}, 1466 {6, 7}, 1467 {0, 0}, 1468 {0, 0} 1469 } 1470 }, 1471 {0, 1, 2, 0, /* 0xc8 */ 1472 {{3, 3}, 1473 {6, 7}, 1474 {0, 0}, 1475 {0, 0} 1476 } 1477 }, 1478 {1, 1, 3, 0, /* 0xc9 */ 1479 {{0, 0}, 1480 {3, 3}, 1481 {6, 7}, 1482 {0, 0} 1483 } 1484 }, 1485 {0, 1, 3, 0, /* 0xca */ 1486 {{1, 1}, 1487 {3, 3}, 1488 {6, 7}, 1489 {0, 0} 1490 } 1491 }, 1492 {1, 1, 3, 0, /* 0xcb */ 1493 {{0, 1}, 1494 {3, 3}, 1495 {6, 7}, 1496 {0, 0} 1497 } 1498 }, 1499 {0, 1, 2, 0, /* 0xcc */ 1500 {{2, 3}, 1501 {6, 7}, 1502 {0, 0}, 1503 {0, 0} 1504 } 1505 }, 1506 {1, 1, 3, 0, /* 0xcd */ 1507 {{0, 0}, 1508 {2, 3}, 1509 {6, 7}, 1510 {0, 0} 1511 } 1512 }, 1513 {0, 1, 2, 0, /* 0xce */ 1514 {{1, 3}, 1515 {6, 7}, 1516 {0, 0}, 1517 {0, 0} 1518 } 1519 }, 1520 {1, 1, 2, 0, /* 0xcf */ 1521 {{0, 3}, 1522 {6, 7}, 1523 {0, 0}, 1524 {0, 0} 1525 } 1526 }, 1527 {0, 1, 2, 0, /* 0xd0 */ 1528 {{4, 4}, 1529 {6, 7}, 1530 {0, 0}, 1531 {0, 0} 1532 } 1533 }, 1534 {1, 1, 3, 0, /* 0xd1 */ 1535 {{0, 0}, 1536 {4, 4}, 1537 {6, 7}, 1538 {0, 0} 1539 } 1540 }, 1541 {0, 1, 3, 0, /* 0xd2 */ 1542 {{1, 1}, 1543 {4, 4}, 1544 {6, 7}, 1545 {0, 0} 1546 } 1547 }, 1548 {1, 1, 3, 0, /* 0xd3 */ 1549 {{0, 1}, 1550 {4, 4}, 1551 {6, 7}, 1552 {0, 0} 1553 } 1554 }, 1555 {0, 1, 3, 0, /* 0xd4 */ 1556 {{2, 2}, 1557 {4, 4}, 1558 {6, 7}, 1559 {0, 0} 1560 } 1561 }, 1562 {1, 1, 4, 0, /* 0xd5 */ 1563 {{0, 0}, 1564 {2, 2}, 1565 {4, 4}, 1566 {6, 7} 1567 } 1568 }, 1569 {0, 1, 3, 0, /* 0xd6 */ 1570 {{1, 2}, 1571 {4, 4}, 1572 {6, 7}, 1573 {0, 0} 1574 } 1575 }, 1576 {1, 1, 3, 0, /* 0xd7 */ 1577 {{0, 2}, 1578 {4, 4}, 1579 {6, 7}, 1580 {0, 0} 1581 } 1582 }, 1583 {0, 1, 2, 0, /* 0xd8 */ 1584 {{3, 4}, 1585 {6, 7}, 1586 {0, 0}, 1587 {0, 0} 1588 } 1589 }, 1590 {1, 1, 3, 0, /* 0xd9 */ 1591 {{0, 0}, 1592 {3, 4}, 1593 {6, 7}, 1594 {0, 0} 1595 } 1596 }, 1597 {0, 1, 3, 0, /* 0xda */ 1598 {{1, 1}, 1599 {3, 4}, 1600 {6, 7}, 1601 {0, 0} 1602 } 1603 }, 1604 {1, 1, 3, 0, /* 0xdb */ 1605 {{0, 1}, 1606 {3, 4}, 1607 {6, 7}, 1608 {0, 0} 1609 } 1610 }, 1611 {0, 1, 2, 0, /* 0xdc */ 1612 {{2, 4}, 1613 {6, 7}, 1614 {0, 0}, 1615 {0, 0} 1616 } 1617 }, 1618 {1, 1, 3, 0, /* 0xdd */ 1619 {{0, 0}, 1620 {2, 4}, 1621 {6, 7}, 1622 {0, 0} 1623 } 1624 }, 1625 {0, 1, 2, 0, /* 0xde */ 1626 {{1, 4}, 1627 {6, 7}, 1628 {0, 0}, 1629 {0, 0} 1630 } 1631 }, 1632 {1, 1, 2, 0, /* 0xdf */ 1633 {{0, 4}, 1634 {6, 7}, 1635 {0, 0}, 1636 {0, 0} 1637 } 1638 }, 1639 {0, 1, 1, 0, /* 0xe0 */ 1640 {{5, 7}, 1641 {0, 0}, 1642 {0, 0}, 1643 {0, 0} 1644 } 1645 }, 1646 {1, 1, 2, 0, /* 0xe1 */ 1647 {{0, 0}, 1648 {5, 7}, 1649 {0, 0}, 1650 {0, 0} 1651 } 1652 }, 1653 {0, 1, 2, 0, /* 0xe2 */ 1654 {{1, 1}, 1655 {5, 7}, 1656 {0, 0}, 1657 {0, 0} 1658 } 1659 }, 1660 {1, 1, 2, 0, /* 0xe3 */ 1661 {{0, 1}, 1662 {5, 7}, 1663 {0, 0}, 1664 {0, 0} 1665 } 1666 }, 1667 {0, 1, 2, 0, /* 0xe4 */ 1668 {{2, 2}, 1669 {5, 7}, 1670 {0, 0}, 1671 {0, 0} 1672 } 1673 }, 1674 {1, 1, 3, 0, /* 0xe5 */ 1675 {{0, 0}, 1676 {2, 2}, 1677 {5, 7}, 1678 {0, 0} 1679 } 1680 }, 1681 {0, 1, 2, 0, /* 0xe6 */ 1682 {{1, 2}, 1683 {5, 7}, 1684 {0, 0}, 1685 {0, 0} 1686 } 1687 }, 1688 {1, 1, 2, 0, /* 0xe7 */ 1689 {{0, 2}, 1690 {5, 7}, 1691 {0, 0}, 1692 {0, 0} 1693 } 1694 }, 1695 {0, 1, 2, 0, /* 0xe8 */ 1696 {{3, 3}, 1697 {5, 7}, 1698 {0, 0}, 1699 {0, 0} 1700 } 1701 }, 1702 {1, 1, 3, 0, /* 0xe9 */ 1703 {{0, 0}, 1704 {3, 3}, 1705 {5, 7}, 1706 {0, 0} 1707 } 1708 }, 1709 {0, 1, 3, 0, /* 0xea */ 1710 {{1, 1}, 1711 {3, 3}, 1712 {5, 7}, 1713 {0, 0} 1714 } 1715 }, 1716 {1, 1, 3, 0, /* 0xeb */ 1717 {{0, 1}, 1718 {3, 3}, 1719 {5, 7}, 1720 {0, 0} 1721 } 1722 }, 1723 {0, 1, 2, 0, /* 0xec */ 1724 {{2, 3}, 1725 {5, 7}, 1726 {0, 0}, 1727 {0, 0} 1728 } 1729 }, 1730 {1, 1, 3, 0, /* 0xed */ 1731 {{0, 0}, 1732 {2, 3}, 1733 {5, 7}, 1734 {0, 0} 1735 } 1736 }, 1737 {0, 1, 2, 0, /* 0xee */ 1738 {{1, 3}, 1739 {5, 7}, 1740 {0, 0}, 1741 {0, 0} 1742 } 1743 }, 1744 {1, 1, 2, 0, /* 0xef */ 1745 {{0, 3}, 1746 {5, 7}, 1747 {0, 0}, 1748 {0, 0} 1749 } 1750 }, 1751 {0, 1, 1, 0, /* 0xf0 */ 1752 {{4, 7}, 1753 {0, 0}, 1754 {0, 0}, 1755 {0, 0} 1756 } 1757 }, 1758 {1, 1, 2, 0, /* 0xf1 */ 1759 {{0, 0}, 1760 {4, 7}, 1761 {0, 0}, 1762 {0, 0} 1763 } 1764 }, 1765 {0, 1, 2, 0, /* 0xf2 */ 1766 {{1, 1}, 1767 {4, 7}, 1768 {0, 0}, 1769 {0, 0} 1770 } 1771 }, 1772 {1, 1, 2, 0, /* 0xf3 */ 1773 {{0, 1}, 1774 {4, 7}, 1775 {0, 0}, 1776 {0, 0} 1777 } 1778 }, 1779 {0, 1, 2, 0, /* 0xf4 */ 1780 {{2, 2}, 1781 {4, 7}, 1782 {0, 0}, 1783 {0, 0} 1784 } 1785 }, 1786 {1, 1, 3, 0, /* 0xf5 */ 1787 {{0, 0}, 1788 {2, 2}, 1789 {4, 7}, 1790 {0, 0} 1791 } 1792 }, 1793 {0, 1, 2, 0, /* 0xf6 */ 1794 {{1, 2}, 1795 {4, 7}, 1796 {0, 0}, 1797 {0, 0} 1798 } 1799 }, 1800 {1, 1, 2, 0, /* 0xf7 */ 1801 {{0, 2}, 1802 {4, 7}, 1803 {0, 0}, 1804 {0, 0} 1805 } 1806 }, 1807 {0, 1, 1, 0, /* 0xf8 */ 1808 {{3, 7}, 1809 {0, 0}, 1810 {0, 0}, 1811 {0, 0} 1812 } 1813 }, 1814 {1, 1, 2, 0, /* 0xf9 */ 1815 {{0, 0}, 1816 {3, 7}, 1817 {0, 0}, 1818 {0, 0} 1819 } 1820 }, 1821 {0, 1, 2, 0, /* 0xfa */ 1822 {{1, 1}, 1823 {3, 7}, 1824 {0, 0}, 1825 {0, 0} 1826 } 1827 }, 1828 {1, 1, 2, 0, /* 0xfb */ 1829 {{0, 1}, 1830 {3, 7}, 1831 {0, 0}, 1832 {0, 0} 1833 } 1834 }, 1835 {0, 1, 1, 0, /* 0xfc */ 1836 {{2, 7}, 1837 {0, 0}, 1838 {0, 0}, 1839 {0, 0} 1840 } 1841 }, 1842 {1, 1, 2, 0, /* 0xfd */ 1843 {{0, 0}, 1844 {2, 7}, 1845 {0, 0}, 1846 {0, 0} 1847 } 1848 }, 1849 {0, 1, 1, 0, /* 0xfe */ 1850 {{1, 7}, 1851 {0, 0}, 1852 {0, 0}, 1853 {0, 0} 1854 } 1855 }, 1856 {1, 1, 1, 0, /* 0xff */ 1857 {{0, 7}, 1858 {0, 0}, 1859 {0, 0}, 1860 {0, 0} 1861 } 1862 } 1863 }; 1864 1865 1866 int 1867 sctp_is_address_in_scope(struct sctp_ifa *ifa, 1868 struct sctp_scoping *scope, 1869 int do_update) 1870 { 1871 if ((scope->loopback_scope == 0) && 1872 (ifa->ifn_p) && SCTP_IFN_IS_IFT_LOOP(ifa->ifn_p)) { 1873 /* 1874 * skip loopback if not in scope * 1875 */ 1876 return (0); 1877 } 1878 switch (ifa->address.sa.sa_family) { 1879 #ifdef INET 1880 case AF_INET: 1881 if (scope->ipv4_addr_legal) { 1882 struct sockaddr_in *sin; 1883 1884 sin = &ifa->address.sin; 1885 if (sin->sin_addr.s_addr == 0) { 1886 /* not in scope , unspecified */ 1887 return (0); 1888 } 1889 if ((scope->ipv4_local_scope == 0) && 1890 (IN4_ISPRIVATE_ADDRESS(&sin->sin_addr))) { 1891 /* private address not in scope */ 1892 return (0); 1893 } 1894 } else { 1895 return (0); 1896 } 1897 break; 1898 #endif 1899 #ifdef INET6 1900 case AF_INET6: 1901 if (scope->ipv6_addr_legal) { 1902 struct sockaddr_in6 *sin6; 1903 1904 /* 1905 * Must update the flags, bummer, which means any 1906 * IFA locks must now be applied HERE <-> 1907 */ 1908 if (do_update) { 1909 sctp_gather_internal_ifa_flags(ifa); 1910 } 1911 if (ifa->localifa_flags & SCTP_ADDR_IFA_UNUSEABLE) { 1912 return (0); 1913 } 1914 /* ok to use deprecated addresses? */ 1915 sin6 = &ifa->address.sin6; 1916 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { 1917 /* skip unspecifed addresses */ 1918 return (0); 1919 } 1920 if ( /* (local_scope == 0) && */ 1921 (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))) { 1922 return (0); 1923 } 1924 if ((scope->site_scope == 0) && 1925 (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))) { 1926 return (0); 1927 } 1928 } else { 1929 return (0); 1930 } 1931 break; 1932 #endif 1933 default: 1934 return (0); 1935 } 1936 return (1); 1937 } 1938 1939 static struct mbuf * 1940 sctp_add_addr_to_mbuf(struct mbuf *m, struct sctp_ifa *ifa, uint16_t *len) 1941 { 1942 #if defined(INET) || defined(INET6) 1943 struct sctp_paramhdr *paramh; 1944 struct mbuf *mret; 1945 uint16_t plen; 1946 #endif 1947 1948 switch (ifa->address.sa.sa_family) { 1949 #ifdef INET 1950 case AF_INET: 1951 plen = (uint16_t)sizeof(struct sctp_ipv4addr_param); 1952 break; 1953 #endif 1954 #ifdef INET6 1955 case AF_INET6: 1956 plen = (uint16_t)sizeof(struct sctp_ipv6addr_param); 1957 break; 1958 #endif 1959 default: 1960 return (m); 1961 } 1962 #if defined(INET) || defined(INET6) 1963 if (M_TRAILINGSPACE(m) >= plen) { 1964 /* easy side we just drop it on the end */ 1965 paramh = (struct sctp_paramhdr *)(SCTP_BUF_AT(m, SCTP_BUF_LEN(m))); 1966 mret = m; 1967 } else { 1968 /* Need more space */ 1969 mret = m; 1970 while (SCTP_BUF_NEXT(mret) != NULL) { 1971 mret = SCTP_BUF_NEXT(mret); 1972 } 1973 SCTP_BUF_NEXT(mret) = sctp_get_mbuf_for_msg(plen, 0, M_NOWAIT, 1, MT_DATA); 1974 if (SCTP_BUF_NEXT(mret) == NULL) { 1975 /* We are hosed, can't add more addresses */ 1976 return (m); 1977 } 1978 mret = SCTP_BUF_NEXT(mret); 1979 paramh = mtod(mret, struct sctp_paramhdr *); 1980 } 1981 /* now add the parameter */ 1982 switch (ifa->address.sa.sa_family) { 1983 #ifdef INET 1984 case AF_INET: 1985 { 1986 struct sctp_ipv4addr_param *ipv4p; 1987 struct sockaddr_in *sin; 1988 1989 sin = &ifa->address.sin; 1990 ipv4p = (struct sctp_ipv4addr_param *)paramh; 1991 paramh->param_type = htons(SCTP_IPV4_ADDRESS); 1992 paramh->param_length = htons(plen); 1993 ipv4p->addr = sin->sin_addr.s_addr; 1994 SCTP_BUF_LEN(mret) += plen; 1995 break; 1996 } 1997 #endif 1998 #ifdef INET6 1999 case AF_INET6: 2000 { 2001 struct sctp_ipv6addr_param *ipv6p; 2002 struct sockaddr_in6 *sin6; 2003 2004 sin6 = &ifa->address.sin6; 2005 ipv6p = (struct sctp_ipv6addr_param *)paramh; 2006 paramh->param_type = htons(SCTP_IPV6_ADDRESS); 2007 paramh->param_length = htons(plen); 2008 memcpy(ipv6p->addr, &sin6->sin6_addr, 2009 sizeof(ipv6p->addr)); 2010 /* clear embedded scope in the address */ 2011 in6_clearscope((struct in6_addr *)ipv6p->addr); 2012 SCTP_BUF_LEN(mret) += plen; 2013 break; 2014 } 2015 #endif 2016 default: 2017 return (m); 2018 } 2019 if (len != NULL) { 2020 *len += plen; 2021 } 2022 return (mret); 2023 #endif 2024 } 2025 2026 2027 struct mbuf * 2028 sctp_add_addresses_to_i_ia(struct sctp_inpcb *inp, struct sctp_tcb *stcb, 2029 struct sctp_scoping *scope, 2030 struct mbuf *m_at, int cnt_inits_to, 2031 uint16_t *padding_len, uint16_t *chunk_len) 2032 { 2033 struct sctp_vrf *vrf = NULL; 2034 int cnt, limit_out = 0, total_count; 2035 uint32_t vrf_id; 2036 2037 vrf_id = inp->def_vrf_id; 2038 SCTP_IPI_ADDR_RLOCK(); 2039 vrf = sctp_find_vrf(vrf_id); 2040 if (vrf == NULL) { 2041 SCTP_IPI_ADDR_RUNLOCK(); 2042 return (m_at); 2043 } 2044 if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { 2045 struct sctp_ifa *sctp_ifap; 2046 struct sctp_ifn *sctp_ifnp; 2047 2048 cnt = cnt_inits_to; 2049 if (vrf->total_ifa_count > SCTP_COUNT_LIMIT) { 2050 limit_out = 1; 2051 cnt = SCTP_ADDRESS_LIMIT; 2052 goto skip_count; 2053 } 2054 LIST_FOREACH(sctp_ifnp, &vrf->ifnlist, next_ifn) { 2055 if ((scope->loopback_scope == 0) && 2056 SCTP_IFN_IS_IFT_LOOP(sctp_ifnp)) { 2057 /* 2058 * Skip loopback devices if loopback_scope 2059 * not set 2060 */ 2061 continue; 2062 } 2063 LIST_FOREACH(sctp_ifap, &sctp_ifnp->ifalist, next_ifa) { 2064 #ifdef INET 2065 if ((sctp_ifap->address.sa.sa_family == AF_INET) && 2066 (prison_check_ip4(inp->ip_inp.inp.inp_cred, 2067 &sctp_ifap->address.sin.sin_addr) != 0)) { 2068 continue; 2069 } 2070 #endif 2071 #ifdef INET6 2072 if ((sctp_ifap->address.sa.sa_family == AF_INET6) && 2073 (prison_check_ip6(inp->ip_inp.inp.inp_cred, 2074 &sctp_ifap->address.sin6.sin6_addr) != 0)) { 2075 continue; 2076 } 2077 #endif 2078 if (sctp_is_addr_restricted(stcb, sctp_ifap)) { 2079 continue; 2080 } 2081 if (sctp_is_address_in_scope(sctp_ifap, scope, 1) == 0) { 2082 continue; 2083 } 2084 cnt++; 2085 if (cnt > SCTP_ADDRESS_LIMIT) { 2086 break; 2087 } 2088 } 2089 if (cnt > SCTP_ADDRESS_LIMIT) { 2090 break; 2091 } 2092 } 2093 skip_count: 2094 if (cnt > 1) { 2095 total_count = 0; 2096 LIST_FOREACH(sctp_ifnp, &vrf->ifnlist, next_ifn) { 2097 cnt = 0; 2098 if ((scope->loopback_scope == 0) && 2099 SCTP_IFN_IS_IFT_LOOP(sctp_ifnp)) { 2100 /* 2101 * Skip loopback devices if 2102 * loopback_scope not set 2103 */ 2104 continue; 2105 } 2106 LIST_FOREACH(sctp_ifap, &sctp_ifnp->ifalist, next_ifa) { 2107 #ifdef INET 2108 if ((sctp_ifap->address.sa.sa_family == AF_INET) && 2109 (prison_check_ip4(inp->ip_inp.inp.inp_cred, 2110 &sctp_ifap->address.sin.sin_addr) != 0)) { 2111 continue; 2112 } 2113 #endif 2114 #ifdef INET6 2115 if ((sctp_ifap->address.sa.sa_family == AF_INET6) && 2116 (prison_check_ip6(inp->ip_inp.inp.inp_cred, 2117 &sctp_ifap->address.sin6.sin6_addr) != 0)) { 2118 continue; 2119 } 2120 #endif 2121 if (sctp_is_addr_restricted(stcb, sctp_ifap)) { 2122 continue; 2123 } 2124 if (sctp_is_address_in_scope(sctp_ifap, 2125 scope, 0) == 0) { 2126 continue; 2127 } 2128 if ((chunk_len != NULL) && 2129 (padding_len != NULL) && 2130 (*padding_len > 0)) { 2131 memset(mtod(m_at, caddr_t)+*chunk_len, 0, *padding_len); 2132 SCTP_BUF_LEN(m_at) += *padding_len; 2133 *chunk_len += *padding_len; 2134 *padding_len = 0; 2135 } 2136 m_at = sctp_add_addr_to_mbuf(m_at, sctp_ifap, chunk_len); 2137 if (limit_out) { 2138 cnt++; 2139 total_count++; 2140 if (cnt >= 2) { 2141 /* 2142 * two from each 2143 * address 2144 */ 2145 break; 2146 } 2147 if (total_count > SCTP_ADDRESS_LIMIT) { 2148 /* No more addresses */ 2149 break; 2150 } 2151 } 2152 } 2153 } 2154 } 2155 } else { 2156 struct sctp_laddr *laddr; 2157 2158 cnt = cnt_inits_to; 2159 /* First, how many ? */ 2160 LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { 2161 if (laddr->ifa == NULL) { 2162 continue; 2163 } 2164 if (laddr->ifa->localifa_flags & SCTP_BEING_DELETED) 2165 /* 2166 * Address being deleted by the system, dont 2167 * list. 2168 */ 2169 continue; 2170 if (laddr->action == SCTP_DEL_IP_ADDRESS) { 2171 /* 2172 * Address being deleted on this ep don't 2173 * list. 2174 */ 2175 continue; 2176 } 2177 if (sctp_is_address_in_scope(laddr->ifa, 2178 scope, 1) == 0) { 2179 continue; 2180 } 2181 cnt++; 2182 } 2183 /* 2184 * To get through a NAT we only list addresses if we have 2185 * more than one. That way if you just bind a single address 2186 * we let the source of the init dictate our address. 2187 */ 2188 if (cnt > 1) { 2189 cnt = cnt_inits_to; 2190 LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { 2191 if (laddr->ifa == NULL) { 2192 continue; 2193 } 2194 if (laddr->ifa->localifa_flags & SCTP_BEING_DELETED) { 2195 continue; 2196 } 2197 if (sctp_is_address_in_scope(laddr->ifa, 2198 scope, 0) == 0) { 2199 continue; 2200 } 2201 if ((chunk_len != NULL) && 2202 (padding_len != NULL) && 2203 (*padding_len > 0)) { 2204 memset(mtod(m_at, caddr_t)+*chunk_len, 0, *padding_len); 2205 SCTP_BUF_LEN(m_at) += *padding_len; 2206 *chunk_len += *padding_len; 2207 *padding_len = 0; 2208 } 2209 m_at = sctp_add_addr_to_mbuf(m_at, laddr->ifa, chunk_len); 2210 cnt++; 2211 if (cnt >= SCTP_ADDRESS_LIMIT) { 2212 break; 2213 } 2214 } 2215 } 2216 } 2217 SCTP_IPI_ADDR_RUNLOCK(); 2218 return (m_at); 2219 } 2220 2221 static struct sctp_ifa * 2222 sctp_is_ifa_addr_preferred(struct sctp_ifa *ifa, 2223 uint8_t dest_is_loop, 2224 uint8_t dest_is_priv, 2225 sa_family_t fam) 2226 { 2227 uint8_t dest_is_global = 0; 2228 2229 /* dest_is_priv is true if destination is a private address */ 2230 /* dest_is_loop is true if destination is a loopback addresses */ 2231 2232 /** 2233 * Here we determine if its a preferred address. A preferred address 2234 * means it is the same scope or higher scope then the destination. 2235 * L = loopback, P = private, G = global 2236 * ----------------------------------------- 2237 * src | dest | result 2238 * ---------------------------------------- 2239 * L | L | yes 2240 * ----------------------------------------- 2241 * P | L | yes-v4 no-v6 2242 * ----------------------------------------- 2243 * G | L | yes-v4 no-v6 2244 * ----------------------------------------- 2245 * L | P | no 2246 * ----------------------------------------- 2247 * P | P | yes 2248 * ----------------------------------------- 2249 * G | P | no 2250 * ----------------------------------------- 2251 * L | G | no 2252 * ----------------------------------------- 2253 * P | G | no 2254 * ----------------------------------------- 2255 * G | G | yes 2256 * ----------------------------------------- 2257 */ 2258 2259 if (ifa->address.sa.sa_family != fam) { 2260 /* forget mis-matched family */ 2261 return (NULL); 2262 } 2263 if ((dest_is_priv == 0) && (dest_is_loop == 0)) { 2264 dest_is_global = 1; 2265 } 2266 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Is destination preferred:"); 2267 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, &ifa->address.sa); 2268 /* Ok the address may be ok */ 2269 #ifdef INET6 2270 if (fam == AF_INET6) { 2271 /* ok to use deprecated addresses? no lets not! */ 2272 if (ifa->localifa_flags & SCTP_ADDR_IFA_UNUSEABLE) { 2273 SCTPDBG(SCTP_DEBUG_OUTPUT3, "NO:1\n"); 2274 return (NULL); 2275 } 2276 if (ifa->src_is_priv && !ifa->src_is_loop) { 2277 if (dest_is_loop) { 2278 SCTPDBG(SCTP_DEBUG_OUTPUT3, "NO:2\n"); 2279 return (NULL); 2280 } 2281 } 2282 if (ifa->src_is_glob) { 2283 if (dest_is_loop) { 2284 SCTPDBG(SCTP_DEBUG_OUTPUT3, "NO:3\n"); 2285 return (NULL); 2286 } 2287 } 2288 } 2289 #endif 2290 /* 2291 * Now that we know what is what, implement or table this could in 2292 * theory be done slicker (it used to be), but this is 2293 * straightforward and easier to validate :-) 2294 */ 2295 SCTPDBG(SCTP_DEBUG_OUTPUT3, "src_loop:%d src_priv:%d src_glob:%d\n", 2296 ifa->src_is_loop, ifa->src_is_priv, ifa->src_is_glob); 2297 SCTPDBG(SCTP_DEBUG_OUTPUT3, "dest_loop:%d dest_priv:%d dest_glob:%d\n", 2298 dest_is_loop, dest_is_priv, dest_is_global); 2299 2300 if ((ifa->src_is_loop) && (dest_is_priv)) { 2301 SCTPDBG(SCTP_DEBUG_OUTPUT3, "NO:4\n"); 2302 return (NULL); 2303 } 2304 if ((ifa->src_is_glob) && (dest_is_priv)) { 2305 SCTPDBG(SCTP_DEBUG_OUTPUT3, "NO:5\n"); 2306 return (NULL); 2307 } 2308 if ((ifa->src_is_loop) && (dest_is_global)) { 2309 SCTPDBG(SCTP_DEBUG_OUTPUT3, "NO:6\n"); 2310 return (NULL); 2311 } 2312 if ((ifa->src_is_priv) && (dest_is_global)) { 2313 SCTPDBG(SCTP_DEBUG_OUTPUT3, "NO:7\n"); 2314 return (NULL); 2315 } 2316 SCTPDBG(SCTP_DEBUG_OUTPUT3, "YES\n"); 2317 /* its a preferred address */ 2318 return (ifa); 2319 } 2320 2321 static struct sctp_ifa * 2322 sctp_is_ifa_addr_acceptable(struct sctp_ifa *ifa, 2323 uint8_t dest_is_loop, 2324 uint8_t dest_is_priv, 2325 sa_family_t fam) 2326 { 2327 uint8_t dest_is_global = 0; 2328 2329 /** 2330 * Here we determine if its a acceptable address. A acceptable 2331 * address means it is the same scope or higher scope but we can 2332 * allow for NAT which means its ok to have a global dest and a 2333 * private src. 2334 * 2335 * L = loopback, P = private, G = global 2336 * ----------------------------------------- 2337 * src | dest | result 2338 * ----------------------------------------- 2339 * L | L | yes 2340 * ----------------------------------------- 2341 * P | L | yes-v4 no-v6 2342 * ----------------------------------------- 2343 * G | L | yes 2344 * ----------------------------------------- 2345 * L | P | no 2346 * ----------------------------------------- 2347 * P | P | yes 2348 * ----------------------------------------- 2349 * G | P | yes - May not work 2350 * ----------------------------------------- 2351 * L | G | no 2352 * ----------------------------------------- 2353 * P | G | yes - May not work 2354 * ----------------------------------------- 2355 * G | G | yes 2356 * ----------------------------------------- 2357 */ 2358 2359 if (ifa->address.sa.sa_family != fam) { 2360 /* forget non matching family */ 2361 SCTPDBG(SCTP_DEBUG_OUTPUT3, "ifa_fam:%d fam:%d\n", 2362 ifa->address.sa.sa_family, fam); 2363 return (NULL); 2364 } 2365 /* Ok the address may be ok */ 2366 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT3, &ifa->address.sa); 2367 SCTPDBG(SCTP_DEBUG_OUTPUT3, "dst_is_loop:%d dest_is_priv:%d\n", 2368 dest_is_loop, dest_is_priv); 2369 if ((dest_is_loop == 0) && (dest_is_priv == 0)) { 2370 dest_is_global = 1; 2371 } 2372 #ifdef INET6 2373 if (fam == AF_INET6) { 2374 /* ok to use deprecated addresses? */ 2375 if (ifa->localifa_flags & SCTP_ADDR_IFA_UNUSEABLE) { 2376 return (NULL); 2377 } 2378 if (ifa->src_is_priv) { 2379 /* Special case, linklocal to loop */ 2380 if (dest_is_loop) 2381 return (NULL); 2382 } 2383 } 2384 #endif 2385 /* 2386 * Now that we know what is what, implement our table. This could in 2387 * theory be done slicker (it used to be), but this is 2388 * straightforward and easier to validate :-) 2389 */ 2390 SCTPDBG(SCTP_DEBUG_OUTPUT3, "ifa->src_is_loop:%d dest_is_priv:%d\n", 2391 ifa->src_is_loop, 2392 dest_is_priv); 2393 if ((ifa->src_is_loop == 1) && (dest_is_priv)) { 2394 return (NULL); 2395 } 2396 SCTPDBG(SCTP_DEBUG_OUTPUT3, "ifa->src_is_loop:%d dest_is_glob:%d\n", 2397 ifa->src_is_loop, 2398 dest_is_global); 2399 if ((ifa->src_is_loop == 1) && (dest_is_global)) { 2400 return (NULL); 2401 } 2402 SCTPDBG(SCTP_DEBUG_OUTPUT3, "address is acceptable\n"); 2403 /* its an acceptable address */ 2404 return (ifa); 2405 } 2406 2407 int 2408 sctp_is_addr_restricted(struct sctp_tcb *stcb, struct sctp_ifa *ifa) 2409 { 2410 struct sctp_laddr *laddr; 2411 2412 if (stcb == NULL) { 2413 /* There are no restrictions, no TCB :-) */ 2414 return (0); 2415 } 2416 LIST_FOREACH(laddr, &stcb->asoc.sctp_restricted_addrs, sctp_nxt_addr) { 2417 if (laddr->ifa == NULL) { 2418 SCTPDBG(SCTP_DEBUG_OUTPUT1, "%s: NULL ifa\n", 2419 __func__); 2420 continue; 2421 } 2422 if (laddr->ifa == ifa) { 2423 /* Yes it is on the list */ 2424 return (1); 2425 } 2426 } 2427 return (0); 2428 } 2429 2430 2431 int 2432 sctp_is_addr_in_ep(struct sctp_inpcb *inp, struct sctp_ifa *ifa) 2433 { 2434 struct sctp_laddr *laddr; 2435 2436 if (ifa == NULL) 2437 return (0); 2438 LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { 2439 if (laddr->ifa == NULL) { 2440 SCTPDBG(SCTP_DEBUG_OUTPUT1, "%s: NULL ifa\n", 2441 __func__); 2442 continue; 2443 } 2444 if ((laddr->ifa == ifa) && laddr->action == 0) 2445 /* same pointer */ 2446 return (1); 2447 } 2448 return (0); 2449 } 2450 2451 2452 2453 static struct sctp_ifa * 2454 sctp_choose_boundspecific_inp(struct sctp_inpcb *inp, 2455 sctp_route_t *ro, 2456 uint32_t vrf_id, 2457 int non_asoc_addr_ok, 2458 uint8_t dest_is_priv, 2459 uint8_t dest_is_loop, 2460 sa_family_t fam) 2461 { 2462 struct sctp_laddr *laddr, *starting_point; 2463 void *ifn; 2464 int resettotop = 0; 2465 struct sctp_ifn *sctp_ifn; 2466 struct sctp_ifa *sctp_ifa, *sifa; 2467 struct sctp_vrf *vrf; 2468 uint32_t ifn_index; 2469 2470 vrf = sctp_find_vrf(vrf_id); 2471 if (vrf == NULL) 2472 return (NULL); 2473 2474 ifn = SCTP_GET_IFN_VOID_FROM_ROUTE(ro); 2475 ifn_index = SCTP_GET_IF_INDEX_FROM_ROUTE(ro); 2476 sctp_ifn = sctp_find_ifn(ifn, ifn_index); 2477 /* 2478 * first question, is the ifn we will emit on in our list, if so, we 2479 * want such an address. Note that we first looked for a preferred 2480 * address. 2481 */ 2482 if (sctp_ifn) { 2483 /* is a preferred one on the interface we route out? */ 2484 LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { 2485 #ifdef INET 2486 if ((sctp_ifa->address.sa.sa_family == AF_INET) && 2487 (prison_check_ip4(inp->ip_inp.inp.inp_cred, 2488 &sctp_ifa->address.sin.sin_addr) != 0)) { 2489 continue; 2490 } 2491 #endif 2492 #ifdef INET6 2493 if ((sctp_ifa->address.sa.sa_family == AF_INET6) && 2494 (prison_check_ip6(inp->ip_inp.inp.inp_cred, 2495 &sctp_ifa->address.sin6.sin6_addr) != 0)) { 2496 continue; 2497 } 2498 #endif 2499 if ((sctp_ifa->localifa_flags & SCTP_ADDR_DEFER_USE) && 2500 (non_asoc_addr_ok == 0)) 2501 continue; 2502 sifa = sctp_is_ifa_addr_preferred(sctp_ifa, 2503 dest_is_loop, 2504 dest_is_priv, fam); 2505 if (sifa == NULL) 2506 continue; 2507 if (sctp_is_addr_in_ep(inp, sifa)) { 2508 atomic_add_int(&sifa->refcount, 1); 2509 return (sifa); 2510 } 2511 } 2512 } 2513 /* 2514 * ok, now we now need to find one on the list of the addresses. We 2515 * can't get one on the emitting interface so let's find first a 2516 * preferred one. If not that an acceptable one otherwise... we 2517 * return NULL. 2518 */ 2519 starting_point = inp->next_addr_touse; 2520 once_again: 2521 if (inp->next_addr_touse == NULL) { 2522 inp->next_addr_touse = LIST_FIRST(&inp->sctp_addr_list); 2523 resettotop = 1; 2524 } 2525 for (laddr = inp->next_addr_touse; laddr; 2526 laddr = LIST_NEXT(laddr, sctp_nxt_addr)) { 2527 if (laddr->ifa == NULL) { 2528 /* address has been removed */ 2529 continue; 2530 } 2531 if (laddr->action == SCTP_DEL_IP_ADDRESS) { 2532 /* address is being deleted */ 2533 continue; 2534 } 2535 sifa = sctp_is_ifa_addr_preferred(laddr->ifa, dest_is_loop, 2536 dest_is_priv, fam); 2537 if (sifa == NULL) 2538 continue; 2539 atomic_add_int(&sifa->refcount, 1); 2540 return (sifa); 2541 } 2542 if (resettotop == 0) { 2543 inp->next_addr_touse = NULL; 2544 goto once_again; 2545 } 2546 inp->next_addr_touse = starting_point; 2547 resettotop = 0; 2548 once_again_too: 2549 if (inp->next_addr_touse == NULL) { 2550 inp->next_addr_touse = LIST_FIRST(&inp->sctp_addr_list); 2551 resettotop = 1; 2552 } 2553 /* ok, what about an acceptable address in the inp */ 2554 for (laddr = inp->next_addr_touse; laddr; 2555 laddr = LIST_NEXT(laddr, sctp_nxt_addr)) { 2556 if (laddr->ifa == NULL) { 2557 /* address has been removed */ 2558 continue; 2559 } 2560 if (laddr->action == SCTP_DEL_IP_ADDRESS) { 2561 /* address is being deleted */ 2562 continue; 2563 } 2564 sifa = sctp_is_ifa_addr_acceptable(laddr->ifa, dest_is_loop, 2565 dest_is_priv, fam); 2566 if (sifa == NULL) 2567 continue; 2568 atomic_add_int(&sifa->refcount, 1); 2569 return (sifa); 2570 } 2571 if (resettotop == 0) { 2572 inp->next_addr_touse = NULL; 2573 goto once_again_too; 2574 } 2575 /* 2576 * no address bound can be a source for the destination we are in 2577 * trouble 2578 */ 2579 return (NULL); 2580 } 2581 2582 2583 2584 static struct sctp_ifa * 2585 sctp_choose_boundspecific_stcb(struct sctp_inpcb *inp, 2586 struct sctp_tcb *stcb, 2587 sctp_route_t *ro, 2588 uint32_t vrf_id, 2589 uint8_t dest_is_priv, 2590 uint8_t dest_is_loop, 2591 int non_asoc_addr_ok, 2592 sa_family_t fam) 2593 { 2594 struct sctp_laddr *laddr, *starting_point; 2595 void *ifn; 2596 struct sctp_ifn *sctp_ifn; 2597 struct sctp_ifa *sctp_ifa, *sifa; 2598 uint8_t start_at_beginning = 0; 2599 struct sctp_vrf *vrf; 2600 uint32_t ifn_index; 2601 2602 /* 2603 * first question, is the ifn we will emit on in our list, if so, we 2604 * want that one. 2605 */ 2606 vrf = sctp_find_vrf(vrf_id); 2607 if (vrf == NULL) 2608 return (NULL); 2609 2610 ifn = SCTP_GET_IFN_VOID_FROM_ROUTE(ro); 2611 ifn_index = SCTP_GET_IF_INDEX_FROM_ROUTE(ro); 2612 sctp_ifn = sctp_find_ifn(ifn, ifn_index); 2613 2614 /* 2615 * first question, is the ifn we will emit on in our list? If so, 2616 * we want that one. First we look for a preferred. Second, we go 2617 * for an acceptable. 2618 */ 2619 if (sctp_ifn) { 2620 /* first try for a preferred address on the ep */ 2621 LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { 2622 #ifdef INET 2623 if ((sctp_ifa->address.sa.sa_family == AF_INET) && 2624 (prison_check_ip4(inp->ip_inp.inp.inp_cred, 2625 &sctp_ifa->address.sin.sin_addr) != 0)) { 2626 continue; 2627 } 2628 #endif 2629 #ifdef INET6 2630 if ((sctp_ifa->address.sa.sa_family == AF_INET6) && 2631 (prison_check_ip6(inp->ip_inp.inp.inp_cred, 2632 &sctp_ifa->address.sin6.sin6_addr) != 0)) { 2633 continue; 2634 } 2635 #endif 2636 if ((sctp_ifa->localifa_flags & SCTP_ADDR_DEFER_USE) && (non_asoc_addr_ok == 0)) 2637 continue; 2638 if (sctp_is_addr_in_ep(inp, sctp_ifa)) { 2639 sifa = sctp_is_ifa_addr_preferred(sctp_ifa, dest_is_loop, dest_is_priv, fam); 2640 if (sifa == NULL) 2641 continue; 2642 if (((non_asoc_addr_ok == 0) && 2643 (sctp_is_addr_restricted(stcb, sifa))) || 2644 (non_asoc_addr_ok && 2645 (sctp_is_addr_restricted(stcb, sifa)) && 2646 (!sctp_is_addr_pending(stcb, sifa)))) { 2647 /* on the no-no list */ 2648 continue; 2649 } 2650 atomic_add_int(&sifa->refcount, 1); 2651 return (sifa); 2652 } 2653 } 2654 /* next try for an acceptable address on the ep */ 2655 LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { 2656 #ifdef INET 2657 if ((sctp_ifa->address.sa.sa_family == AF_INET) && 2658 (prison_check_ip4(inp->ip_inp.inp.inp_cred, 2659 &sctp_ifa->address.sin.sin_addr) != 0)) { 2660 continue; 2661 } 2662 #endif 2663 #ifdef INET6 2664 if ((sctp_ifa->address.sa.sa_family == AF_INET6) && 2665 (prison_check_ip6(inp->ip_inp.inp.inp_cred, 2666 &sctp_ifa->address.sin6.sin6_addr) != 0)) { 2667 continue; 2668 } 2669 #endif 2670 if ((sctp_ifa->localifa_flags & SCTP_ADDR_DEFER_USE) && (non_asoc_addr_ok == 0)) 2671 continue; 2672 if (sctp_is_addr_in_ep(inp, sctp_ifa)) { 2673 sifa = sctp_is_ifa_addr_acceptable(sctp_ifa, dest_is_loop, dest_is_priv, fam); 2674 if (sifa == NULL) 2675 continue; 2676 if (((non_asoc_addr_ok == 0) && 2677 (sctp_is_addr_restricted(stcb, sifa))) || 2678 (non_asoc_addr_ok && 2679 (sctp_is_addr_restricted(stcb, sifa)) && 2680 (!sctp_is_addr_pending(stcb, sifa)))) { 2681 /* on the no-no list */ 2682 continue; 2683 } 2684 atomic_add_int(&sifa->refcount, 1); 2685 return (sifa); 2686 } 2687 } 2688 2689 } 2690 /* 2691 * if we can't find one like that then we must look at all addresses 2692 * bound to pick one at first preferable then secondly acceptable. 2693 */ 2694 starting_point = stcb->asoc.last_used_address; 2695 sctp_from_the_top: 2696 if (stcb->asoc.last_used_address == NULL) { 2697 start_at_beginning = 1; 2698 stcb->asoc.last_used_address = LIST_FIRST(&inp->sctp_addr_list); 2699 } 2700 /* search beginning with the last used address */ 2701 for (laddr = stcb->asoc.last_used_address; laddr; 2702 laddr = LIST_NEXT(laddr, sctp_nxt_addr)) { 2703 if (laddr->ifa == NULL) { 2704 /* address has been removed */ 2705 continue; 2706 } 2707 if (laddr->action == SCTP_DEL_IP_ADDRESS) { 2708 /* address is being deleted */ 2709 continue; 2710 } 2711 sifa = sctp_is_ifa_addr_preferred(laddr->ifa, dest_is_loop, dest_is_priv, fam); 2712 if (sifa == NULL) 2713 continue; 2714 if (((non_asoc_addr_ok == 0) && 2715 (sctp_is_addr_restricted(stcb, sifa))) || 2716 (non_asoc_addr_ok && 2717 (sctp_is_addr_restricted(stcb, sifa)) && 2718 (!sctp_is_addr_pending(stcb, sifa)))) { 2719 /* on the no-no list */ 2720 continue; 2721 } 2722 stcb->asoc.last_used_address = laddr; 2723 atomic_add_int(&sifa->refcount, 1); 2724 return (sifa); 2725 } 2726 if (start_at_beginning == 0) { 2727 stcb->asoc.last_used_address = NULL; 2728 goto sctp_from_the_top; 2729 } 2730 /* now try for any higher scope than the destination */ 2731 stcb->asoc.last_used_address = starting_point; 2732 start_at_beginning = 0; 2733 sctp_from_the_top2: 2734 if (stcb->asoc.last_used_address == NULL) { 2735 start_at_beginning = 1; 2736 stcb->asoc.last_used_address = LIST_FIRST(&inp->sctp_addr_list); 2737 } 2738 /* search beginning with the last used address */ 2739 for (laddr = stcb->asoc.last_used_address; laddr; 2740 laddr = LIST_NEXT(laddr, sctp_nxt_addr)) { 2741 if (laddr->ifa == NULL) { 2742 /* address has been removed */ 2743 continue; 2744 } 2745 if (laddr->action == SCTP_DEL_IP_ADDRESS) { 2746 /* address is being deleted */ 2747 continue; 2748 } 2749 sifa = sctp_is_ifa_addr_acceptable(laddr->ifa, dest_is_loop, 2750 dest_is_priv, fam); 2751 if (sifa == NULL) 2752 continue; 2753 if (((non_asoc_addr_ok == 0) && 2754 (sctp_is_addr_restricted(stcb, sifa))) || 2755 (non_asoc_addr_ok && 2756 (sctp_is_addr_restricted(stcb, sifa)) && 2757 (!sctp_is_addr_pending(stcb, sifa)))) { 2758 /* on the no-no list */ 2759 continue; 2760 } 2761 stcb->asoc.last_used_address = laddr; 2762 atomic_add_int(&sifa->refcount, 1); 2763 return (sifa); 2764 } 2765 if (start_at_beginning == 0) { 2766 stcb->asoc.last_used_address = NULL; 2767 goto sctp_from_the_top2; 2768 } 2769 return (NULL); 2770 } 2771 2772 static struct sctp_ifa * 2773 sctp_select_nth_preferred_addr_from_ifn_boundall(struct sctp_ifn *ifn, 2774 struct sctp_inpcb *inp, 2775 struct sctp_tcb *stcb, 2776 int non_asoc_addr_ok, 2777 uint8_t dest_is_loop, 2778 uint8_t dest_is_priv, 2779 int addr_wanted, 2780 sa_family_t fam, 2781 sctp_route_t *ro 2782 ) 2783 { 2784 struct sctp_ifa *ifa, *sifa; 2785 int num_eligible_addr = 0; 2786 #ifdef INET6 2787 struct sockaddr_in6 sin6, lsa6; 2788 2789 if (fam == AF_INET6) { 2790 memcpy(&sin6, &ro->ro_dst, sizeof(struct sockaddr_in6)); 2791 (void)sa6_recoverscope(&sin6); 2792 } 2793 #endif /* INET6 */ 2794 LIST_FOREACH(ifa, &ifn->ifalist, next_ifa) { 2795 #ifdef INET 2796 if ((ifa->address.sa.sa_family == AF_INET) && 2797 (prison_check_ip4(inp->ip_inp.inp.inp_cred, 2798 &ifa->address.sin.sin_addr) != 0)) { 2799 continue; 2800 } 2801 #endif 2802 #ifdef INET6 2803 if ((ifa->address.sa.sa_family == AF_INET6) && 2804 (prison_check_ip6(inp->ip_inp.inp.inp_cred, 2805 &ifa->address.sin6.sin6_addr) != 0)) { 2806 continue; 2807 } 2808 #endif 2809 if ((ifa->localifa_flags & SCTP_ADDR_DEFER_USE) && 2810 (non_asoc_addr_ok == 0)) 2811 continue; 2812 sifa = sctp_is_ifa_addr_preferred(ifa, dest_is_loop, 2813 dest_is_priv, fam); 2814 if (sifa == NULL) 2815 continue; 2816 #ifdef INET6 2817 if (fam == AF_INET6 && 2818 dest_is_loop && 2819 sifa->src_is_loop && sifa->src_is_priv) { 2820 /* 2821 * don't allow fe80::1 to be a src on loop ::1, we 2822 * don't list it to the peer so we will get an 2823 * abort. 2824 */ 2825 continue; 2826 } 2827 if (fam == AF_INET6 && 2828 IN6_IS_ADDR_LINKLOCAL(&sifa->address.sin6.sin6_addr) && 2829 IN6_IS_ADDR_LINKLOCAL(&sin6.sin6_addr)) { 2830 /* 2831 * link-local <-> link-local must belong to the same 2832 * scope. 2833 */ 2834 memcpy(&lsa6, &sifa->address.sin6, sizeof(struct sockaddr_in6)); 2835 (void)sa6_recoverscope(&lsa6); 2836 if (sin6.sin6_scope_id != lsa6.sin6_scope_id) { 2837 continue; 2838 } 2839 } 2840 #endif /* INET6 */ 2841 2842 /* 2843 * Check if the IPv6 address matches to next-hop. In the 2844 * mobile case, old IPv6 address may be not deleted from the 2845 * interface. Then, the interface has previous and new 2846 * addresses. We should use one corresponding to the 2847 * next-hop. (by micchie) 2848 */ 2849 #ifdef INET6 2850 if (stcb && fam == AF_INET6 && 2851 sctp_is_mobility_feature_on(stcb->sctp_ep, SCTP_MOBILITY_BASE)) { 2852 if (sctp_v6src_match_nexthop(&sifa->address.sin6, ro) 2853 == 0) { 2854 continue; 2855 } 2856 } 2857 #endif 2858 #ifdef INET 2859 /* Avoid topologically incorrect IPv4 address */ 2860 if (stcb && fam == AF_INET && 2861 sctp_is_mobility_feature_on(stcb->sctp_ep, SCTP_MOBILITY_BASE)) { 2862 if (sctp_v4src_match_nexthop(sifa, ro) == 0) { 2863 continue; 2864 } 2865 } 2866 #endif 2867 if (stcb) { 2868 if (sctp_is_address_in_scope(ifa, &stcb->asoc.scope, 0) == 0) { 2869 continue; 2870 } 2871 if (((non_asoc_addr_ok == 0) && 2872 (sctp_is_addr_restricted(stcb, sifa))) || 2873 (non_asoc_addr_ok && 2874 (sctp_is_addr_restricted(stcb, sifa)) && 2875 (!sctp_is_addr_pending(stcb, sifa)))) { 2876 /* 2877 * It is restricted for some reason.. 2878 * probably not yet added. 2879 */ 2880 continue; 2881 } 2882 } 2883 if (num_eligible_addr >= addr_wanted) { 2884 return (sifa); 2885 } 2886 num_eligible_addr++; 2887 } 2888 return (NULL); 2889 } 2890 2891 2892 static int 2893 sctp_count_num_preferred_boundall(struct sctp_ifn *ifn, 2894 struct sctp_inpcb *inp, 2895 struct sctp_tcb *stcb, 2896 int non_asoc_addr_ok, 2897 uint8_t dest_is_loop, 2898 uint8_t dest_is_priv, 2899 sa_family_t fam) 2900 { 2901 struct sctp_ifa *ifa, *sifa; 2902 int num_eligible_addr = 0; 2903 2904 LIST_FOREACH(ifa, &ifn->ifalist, next_ifa) { 2905 #ifdef INET 2906 if ((ifa->address.sa.sa_family == AF_INET) && 2907 (prison_check_ip4(inp->ip_inp.inp.inp_cred, 2908 &ifa->address.sin.sin_addr) != 0)) { 2909 continue; 2910 } 2911 #endif 2912 #ifdef INET6 2913 if ((ifa->address.sa.sa_family == AF_INET6) && 2914 (stcb != NULL) && 2915 (prison_check_ip6(inp->ip_inp.inp.inp_cred, 2916 &ifa->address.sin6.sin6_addr) != 0)) { 2917 continue; 2918 } 2919 #endif 2920 if ((ifa->localifa_flags & SCTP_ADDR_DEFER_USE) && 2921 (non_asoc_addr_ok == 0)) { 2922 continue; 2923 } 2924 sifa = sctp_is_ifa_addr_preferred(ifa, dest_is_loop, 2925 dest_is_priv, fam); 2926 if (sifa == NULL) { 2927 continue; 2928 } 2929 if (stcb) { 2930 if (sctp_is_address_in_scope(ifa, &stcb->asoc.scope, 0) == 0) { 2931 continue; 2932 } 2933 if (((non_asoc_addr_ok == 0) && 2934 (sctp_is_addr_restricted(stcb, sifa))) || 2935 (non_asoc_addr_ok && 2936 (sctp_is_addr_restricted(stcb, sifa)) && 2937 (!sctp_is_addr_pending(stcb, sifa)))) { 2938 /* 2939 * It is restricted for some reason.. 2940 * probably not yet added. 2941 */ 2942 continue; 2943 } 2944 } 2945 num_eligible_addr++; 2946 } 2947 return (num_eligible_addr); 2948 } 2949 2950 static struct sctp_ifa * 2951 sctp_choose_boundall(struct sctp_inpcb *inp, 2952 struct sctp_tcb *stcb, 2953 struct sctp_nets *net, 2954 sctp_route_t *ro, 2955 uint32_t vrf_id, 2956 uint8_t dest_is_priv, 2957 uint8_t dest_is_loop, 2958 int non_asoc_addr_ok, 2959 sa_family_t fam) 2960 { 2961 int cur_addr_num = 0, num_preferred = 0; 2962 void *ifn; 2963 struct sctp_ifn *sctp_ifn, *looked_at = NULL, *emit_ifn; 2964 struct sctp_ifa *sctp_ifa, *sifa; 2965 uint32_t ifn_index; 2966 struct sctp_vrf *vrf; 2967 #ifdef INET 2968 int retried = 0; 2969 #endif 2970 2971 /*- 2972 * For boundall we can use any address in the association. 2973 * If non_asoc_addr_ok is set we can use any address (at least in 2974 * theory). So we look for preferred addresses first. If we find one, 2975 * we use it. Otherwise we next try to get an address on the 2976 * interface, which we should be able to do (unless non_asoc_addr_ok 2977 * is false and we are routed out that way). In these cases where we 2978 * can't use the address of the interface we go through all the 2979 * ifn's looking for an address we can use and fill that in. Punting 2980 * means we send back address 0, which will probably cause problems 2981 * actually since then IP will fill in the address of the route ifn, 2982 * which means we probably already rejected it.. i.e. here comes an 2983 * abort :-<. 2984 */ 2985 vrf = sctp_find_vrf(vrf_id); 2986 if (vrf == NULL) 2987 return (NULL); 2988 2989 ifn = SCTP_GET_IFN_VOID_FROM_ROUTE(ro); 2990 ifn_index = SCTP_GET_IF_INDEX_FROM_ROUTE(ro); 2991 SCTPDBG(SCTP_DEBUG_OUTPUT2, "ifn from route:%p ifn_index:%d\n", ifn, ifn_index); 2992 emit_ifn = looked_at = sctp_ifn = sctp_find_ifn(ifn, ifn_index); 2993 if (sctp_ifn == NULL) { 2994 /* ?? We don't have this guy ?? */ 2995 SCTPDBG(SCTP_DEBUG_OUTPUT2, "No ifn emit interface?\n"); 2996 goto bound_all_plan_b; 2997 } 2998 SCTPDBG(SCTP_DEBUG_OUTPUT2, "ifn_index:%d name:%s is emit interface\n", 2999 ifn_index, sctp_ifn->ifn_name); 3000 3001 if (net) { 3002 cur_addr_num = net->indx_of_eligible_next_to_use; 3003 } 3004 num_preferred = sctp_count_num_preferred_boundall(sctp_ifn, 3005 inp, stcb, 3006 non_asoc_addr_ok, 3007 dest_is_loop, 3008 dest_is_priv, fam); 3009 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Found %d preferred source addresses for intf:%s\n", 3010 num_preferred, sctp_ifn->ifn_name); 3011 if (num_preferred == 0) { 3012 /* 3013 * no eligible addresses, we must use some other interface 3014 * address if we can find one. 3015 */ 3016 goto bound_all_plan_b; 3017 } 3018 /* 3019 * Ok we have num_eligible_addr set with how many we can use, this 3020 * may vary from call to call due to addresses being deprecated 3021 * etc.. 3022 */ 3023 if (cur_addr_num >= num_preferred) { 3024 cur_addr_num = 0; 3025 } 3026 /* 3027 * select the nth address from the list (where cur_addr_num is the 3028 * nth) and 0 is the first one, 1 is the second one etc... 3029 */ 3030 SCTPDBG(SCTP_DEBUG_OUTPUT2, "cur_addr_num:%d\n", cur_addr_num); 3031 3032 sctp_ifa = sctp_select_nth_preferred_addr_from_ifn_boundall(sctp_ifn, inp, stcb, non_asoc_addr_ok, dest_is_loop, 3033 dest_is_priv, cur_addr_num, fam, ro); 3034 3035 /* if sctp_ifa is NULL something changed??, fall to plan b. */ 3036 if (sctp_ifa) { 3037 atomic_add_int(&sctp_ifa->refcount, 1); 3038 if (net) { 3039 /* save off where the next one we will want */ 3040 net->indx_of_eligible_next_to_use = cur_addr_num + 1; 3041 } 3042 return (sctp_ifa); 3043 } 3044 /* 3045 * plan_b: Look at all interfaces and find a preferred address. If 3046 * no preferred fall through to plan_c. 3047 */ 3048 bound_all_plan_b: 3049 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Trying Plan B\n"); 3050 LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) { 3051 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Examine interface %s\n", 3052 sctp_ifn->ifn_name); 3053 if (dest_is_loop == 0 && SCTP_IFN_IS_IFT_LOOP(sctp_ifn)) { 3054 /* wrong base scope */ 3055 SCTPDBG(SCTP_DEBUG_OUTPUT2, "skip\n"); 3056 continue; 3057 } 3058 if ((sctp_ifn == looked_at) && looked_at) { 3059 /* already looked at this guy */ 3060 SCTPDBG(SCTP_DEBUG_OUTPUT2, "already seen\n"); 3061 continue; 3062 } 3063 num_preferred = sctp_count_num_preferred_boundall(sctp_ifn, inp, stcb, non_asoc_addr_ok, 3064 dest_is_loop, dest_is_priv, fam); 3065 SCTPDBG(SCTP_DEBUG_OUTPUT2, 3066 "Found ifn:%p %d preferred source addresses\n", 3067 ifn, num_preferred); 3068 if (num_preferred == 0) { 3069 /* None on this interface. */ 3070 SCTPDBG(SCTP_DEBUG_OUTPUT2, "No preferred -- skipping to next\n"); 3071 continue; 3072 } 3073 SCTPDBG(SCTP_DEBUG_OUTPUT2, 3074 "num preferred:%d on interface:%p cur_addr_num:%d\n", 3075 num_preferred, (void *)sctp_ifn, cur_addr_num); 3076 3077 /* 3078 * Ok we have num_eligible_addr set with how many we can 3079 * use, this may vary from call to call due to addresses 3080 * being deprecated etc.. 3081 */ 3082 if (cur_addr_num >= num_preferred) { 3083 cur_addr_num = 0; 3084 } 3085 sifa = sctp_select_nth_preferred_addr_from_ifn_boundall(sctp_ifn, inp, stcb, non_asoc_addr_ok, dest_is_loop, 3086 dest_is_priv, cur_addr_num, fam, ro); 3087 if (sifa == NULL) 3088 continue; 3089 if (net) { 3090 net->indx_of_eligible_next_to_use = cur_addr_num + 1; 3091 SCTPDBG(SCTP_DEBUG_OUTPUT2, "we selected %d\n", 3092 cur_addr_num); 3093 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Source:"); 3094 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, &sifa->address.sa); 3095 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Dest:"); 3096 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, &net->ro._l_addr.sa); 3097 } 3098 atomic_add_int(&sifa->refcount, 1); 3099 return (sifa); 3100 } 3101 #ifdef INET 3102 again_with_private_addresses_allowed: 3103 #endif 3104 /* plan_c: do we have an acceptable address on the emit interface */ 3105 sifa = NULL; 3106 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Trying Plan C: find acceptable on interface\n"); 3107 if (emit_ifn == NULL) { 3108 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Jump to Plan D - no emit_ifn\n"); 3109 goto plan_d; 3110 } 3111 LIST_FOREACH(sctp_ifa, &emit_ifn->ifalist, next_ifa) { 3112 SCTPDBG(SCTP_DEBUG_OUTPUT2, "ifa:%p\n", (void *)sctp_ifa); 3113 #ifdef INET 3114 if ((sctp_ifa->address.sa.sa_family == AF_INET) && 3115 (prison_check_ip4(inp->ip_inp.inp.inp_cred, 3116 &sctp_ifa->address.sin.sin_addr) != 0)) { 3117 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Jailed\n"); 3118 continue; 3119 } 3120 #endif 3121 #ifdef INET6 3122 if ((sctp_ifa->address.sa.sa_family == AF_INET6) && 3123 (prison_check_ip6(inp->ip_inp.inp.inp_cred, 3124 &sctp_ifa->address.sin6.sin6_addr) != 0)) { 3125 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Jailed\n"); 3126 continue; 3127 } 3128 #endif 3129 if ((sctp_ifa->localifa_flags & SCTP_ADDR_DEFER_USE) && 3130 (non_asoc_addr_ok == 0)) { 3131 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Defer\n"); 3132 continue; 3133 } 3134 sifa = sctp_is_ifa_addr_acceptable(sctp_ifa, dest_is_loop, 3135 dest_is_priv, fam); 3136 if (sifa == NULL) { 3137 SCTPDBG(SCTP_DEBUG_OUTPUT2, "IFA not acceptable\n"); 3138 continue; 3139 } 3140 if (stcb) { 3141 if (sctp_is_address_in_scope(sifa, &stcb->asoc.scope, 0) == 0) { 3142 SCTPDBG(SCTP_DEBUG_OUTPUT2, "NOT in scope\n"); 3143 sifa = NULL; 3144 continue; 3145 } 3146 if (((non_asoc_addr_ok == 0) && 3147 (sctp_is_addr_restricted(stcb, sifa))) || 3148 (non_asoc_addr_ok && 3149 (sctp_is_addr_restricted(stcb, sifa)) && 3150 (!sctp_is_addr_pending(stcb, sifa)))) { 3151 /* 3152 * It is restricted for some reason.. 3153 * probably not yet added. 3154 */ 3155 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Its restricted\n"); 3156 sifa = NULL; 3157 continue; 3158 } 3159 } 3160 atomic_add_int(&sifa->refcount, 1); 3161 goto out; 3162 } 3163 plan_d: 3164 /* 3165 * plan_d: We are in trouble. No preferred address on the emit 3166 * interface. And not even a preferred address on all interfaces. Go 3167 * out and see if we can find an acceptable address somewhere 3168 * amongst all interfaces. 3169 */ 3170 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Trying Plan D looked_at is %p\n", (void *)looked_at); 3171 LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) { 3172 if (dest_is_loop == 0 && SCTP_IFN_IS_IFT_LOOP(sctp_ifn)) { 3173 /* wrong base scope */ 3174 continue; 3175 } 3176 LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { 3177 #ifdef INET 3178 if ((sctp_ifa->address.sa.sa_family == AF_INET) && 3179 (prison_check_ip4(inp->ip_inp.inp.inp_cred, 3180 &sctp_ifa->address.sin.sin_addr) != 0)) { 3181 continue; 3182 } 3183 #endif 3184 #ifdef INET6 3185 if ((sctp_ifa->address.sa.sa_family == AF_INET6) && 3186 (prison_check_ip6(inp->ip_inp.inp.inp_cred, 3187 &sctp_ifa->address.sin6.sin6_addr) != 0)) { 3188 continue; 3189 } 3190 #endif 3191 if ((sctp_ifa->localifa_flags & SCTP_ADDR_DEFER_USE) && 3192 (non_asoc_addr_ok == 0)) 3193 continue; 3194 sifa = sctp_is_ifa_addr_acceptable(sctp_ifa, 3195 dest_is_loop, 3196 dest_is_priv, fam); 3197 if (sifa == NULL) 3198 continue; 3199 if (stcb) { 3200 if (sctp_is_address_in_scope(sifa, &stcb->asoc.scope, 0) == 0) { 3201 sifa = NULL; 3202 continue; 3203 } 3204 if (((non_asoc_addr_ok == 0) && 3205 (sctp_is_addr_restricted(stcb, sifa))) || 3206 (non_asoc_addr_ok && 3207 (sctp_is_addr_restricted(stcb, sifa)) && 3208 (!sctp_is_addr_pending(stcb, sifa)))) { 3209 /* 3210 * It is restricted for some 3211 * reason.. probably not yet added. 3212 */ 3213 sifa = NULL; 3214 continue; 3215 } 3216 } 3217 goto out; 3218 } 3219 } 3220 #ifdef INET 3221 if (stcb) { 3222 if ((retried == 0) && (stcb->asoc.scope.ipv4_local_scope == 0)) { 3223 stcb->asoc.scope.ipv4_local_scope = 1; 3224 retried = 1; 3225 goto again_with_private_addresses_allowed; 3226 } else if (retried == 1) { 3227 stcb->asoc.scope.ipv4_local_scope = 0; 3228 } 3229 } 3230 #endif 3231 out: 3232 #ifdef INET 3233 if (sifa) { 3234 if (retried == 1) { 3235 LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) { 3236 if (dest_is_loop == 0 && SCTP_IFN_IS_IFT_LOOP(sctp_ifn)) { 3237 /* wrong base scope */ 3238 continue; 3239 } 3240 LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { 3241 struct sctp_ifa *tmp_sifa; 3242 3243 #ifdef INET 3244 if ((sctp_ifa->address.sa.sa_family == AF_INET) && 3245 (prison_check_ip4(inp->ip_inp.inp.inp_cred, 3246 &sctp_ifa->address.sin.sin_addr) != 0)) { 3247 continue; 3248 } 3249 #endif 3250 #ifdef INET6 3251 if ((sctp_ifa->address.sa.sa_family == AF_INET6) && 3252 (prison_check_ip6(inp->ip_inp.inp.inp_cred, 3253 &sctp_ifa->address.sin6.sin6_addr) != 0)) { 3254 continue; 3255 } 3256 #endif 3257 if ((sctp_ifa->localifa_flags & SCTP_ADDR_DEFER_USE) && 3258 (non_asoc_addr_ok == 0)) 3259 continue; 3260 tmp_sifa = sctp_is_ifa_addr_acceptable(sctp_ifa, 3261 dest_is_loop, 3262 dest_is_priv, fam); 3263 if (tmp_sifa == NULL) { 3264 continue; 3265 } 3266 if (tmp_sifa == sifa) { 3267 continue; 3268 } 3269 if (stcb) { 3270 if (sctp_is_address_in_scope(tmp_sifa, 3271 &stcb->asoc.scope, 0) == 0) { 3272 continue; 3273 } 3274 if (((non_asoc_addr_ok == 0) && 3275 (sctp_is_addr_restricted(stcb, tmp_sifa))) || 3276 (non_asoc_addr_ok && 3277 (sctp_is_addr_restricted(stcb, tmp_sifa)) && 3278 (!sctp_is_addr_pending(stcb, tmp_sifa)))) { 3279 /* 3280 * It is restricted 3281 * for some reason.. 3282 * probably not yet 3283 * added. 3284 */ 3285 continue; 3286 } 3287 } 3288 if ((tmp_sifa->address.sin.sin_family == AF_INET) && 3289 (IN4_ISPRIVATE_ADDRESS(&(tmp_sifa->address.sin.sin_addr)))) { 3290 sctp_add_local_addr_restricted(stcb, tmp_sifa); 3291 } 3292 } 3293 } 3294 } 3295 atomic_add_int(&sifa->refcount, 1); 3296 } 3297 #endif 3298 return (sifa); 3299 } 3300 3301 3302 3303 /* tcb may be NULL */ 3304 struct sctp_ifa * 3305 sctp_source_address_selection(struct sctp_inpcb *inp, 3306 struct sctp_tcb *stcb, 3307 sctp_route_t *ro, 3308 struct sctp_nets *net, 3309 int non_asoc_addr_ok, uint32_t vrf_id) 3310 { 3311 struct sctp_ifa *answer; 3312 uint8_t dest_is_priv, dest_is_loop; 3313 sa_family_t fam; 3314 #ifdef INET 3315 struct sockaddr_in *to = (struct sockaddr_in *)&ro->ro_dst; 3316 #endif 3317 #ifdef INET6 3318 struct sockaddr_in6 *to6 = (struct sockaddr_in6 *)&ro->ro_dst; 3319 #endif 3320 3321 /** 3322 * Rules: 3323 * - Find the route if needed, cache if I can. 3324 * - Look at interface address in route, Is it in the bound list. If so we 3325 * have the best source. 3326 * - If not we must rotate amongst the addresses. 3327 * 3328 * Cavets and issues 3329 * 3330 * Do we need to pay attention to scope. We can have a private address 3331 * or a global address we are sourcing or sending to. So if we draw 3332 * it out 3333 * zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 3334 * For V4 3335 * ------------------------------------------ 3336 * source * dest * result 3337 * ----------------------------------------- 3338 * <a> Private * Global * NAT 3339 * ----------------------------------------- 3340 * <b> Private * Private * No problem 3341 * ----------------------------------------- 3342 * <c> Global * Private * Huh, How will this work? 3343 * ----------------------------------------- 3344 * <d> Global * Global * No Problem 3345 *------------------------------------------ 3346 * zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 3347 * For V6 3348 *------------------------------------------ 3349 * source * dest * result 3350 * ----------------------------------------- 3351 * <a> Linklocal * Global * 3352 * ----------------------------------------- 3353 * <b> Linklocal * Linklocal * No problem 3354 * ----------------------------------------- 3355 * <c> Global * Linklocal * Huh, How will this work? 3356 * ----------------------------------------- 3357 * <d> Global * Global * No Problem 3358 *------------------------------------------ 3359 * zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 3360 * 3361 * And then we add to that what happens if there are multiple addresses 3362 * assigned to an interface. Remember the ifa on a ifn is a linked 3363 * list of addresses. So one interface can have more than one IP 3364 * address. What happens if we have both a private and a global 3365 * address? Do we then use context of destination to sort out which 3366 * one is best? And what about NAT's sending P->G may get you a NAT 3367 * translation, or should you select the G thats on the interface in 3368 * preference. 3369 * 3370 * Decisions: 3371 * 3372 * - count the number of addresses on the interface. 3373 * - if it is one, no problem except case <c>. 3374 * For <a> we will assume a NAT out there. 3375 * - if there are more than one, then we need to worry about scope P 3376 * or G. We should prefer G -> G and P -> P if possible. 3377 * Then as a secondary fall back to mixed types G->P being a last 3378 * ditch one. 3379 * - The above all works for bound all, but bound specific we need to 3380 * use the same concept but instead only consider the bound 3381 * addresses. If the bound set is NOT assigned to the interface then 3382 * we must use rotation amongst the bound addresses.. 3383 */ 3384 if (ro->ro_rt == NULL) { 3385 /* 3386 * Need a route to cache. 3387 */ 3388 SCTP_RTALLOC(ro, vrf_id, inp->fibnum); 3389 } 3390 if (ro->ro_rt == NULL) { 3391 return (NULL); 3392 } 3393 fam = ro->ro_dst.sa_family; 3394 dest_is_priv = dest_is_loop = 0; 3395 /* Setup our scopes for the destination */ 3396 switch (fam) { 3397 #ifdef INET 3398 case AF_INET: 3399 /* Scope based on outbound address */ 3400 if (IN4_ISLOOPBACK_ADDRESS(&to->sin_addr)) { 3401 dest_is_loop = 1; 3402 if (net != NULL) { 3403 /* mark it as local */ 3404 net->addr_is_local = 1; 3405 } 3406 } else if ((IN4_ISPRIVATE_ADDRESS(&to->sin_addr))) { 3407 dest_is_priv = 1; 3408 } 3409 break; 3410 #endif 3411 #ifdef INET6 3412 case AF_INET6: 3413 /* Scope based on outbound address */ 3414 if (IN6_IS_ADDR_LOOPBACK(&to6->sin6_addr) || 3415 SCTP_ROUTE_IS_REAL_LOOP(ro)) { 3416 /* 3417 * If the address is a loopback address, which 3418 * consists of "::1" OR "fe80::1%lo0", we are 3419 * loopback scope. But we don't use dest_is_priv 3420 * (link local addresses). 3421 */ 3422 dest_is_loop = 1; 3423 if (net != NULL) { 3424 /* mark it as local */ 3425 net->addr_is_local = 1; 3426 } 3427 } else if (IN6_IS_ADDR_LINKLOCAL(&to6->sin6_addr)) { 3428 dest_is_priv = 1; 3429 } 3430 break; 3431 #endif 3432 } 3433 SCTPDBG(SCTP_DEBUG_OUTPUT2, "Select source addr for:"); 3434 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, (struct sockaddr *)&ro->ro_dst); 3435 SCTP_IPI_ADDR_RLOCK(); 3436 if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { 3437 /* 3438 * Bound all case 3439 */ 3440 answer = sctp_choose_boundall(inp, stcb, net, ro, vrf_id, 3441 dest_is_priv, dest_is_loop, 3442 non_asoc_addr_ok, fam); 3443 SCTP_IPI_ADDR_RUNLOCK(); 3444 return (answer); 3445 } 3446 /* 3447 * Subset bound case 3448 */ 3449 if (stcb) { 3450 answer = sctp_choose_boundspecific_stcb(inp, stcb, ro, 3451 vrf_id, dest_is_priv, 3452 dest_is_loop, 3453 non_asoc_addr_ok, fam); 3454 } else { 3455 answer = sctp_choose_boundspecific_inp(inp, ro, vrf_id, 3456 non_asoc_addr_ok, 3457 dest_is_priv, 3458 dest_is_loop, fam); 3459 } 3460 SCTP_IPI_ADDR_RUNLOCK(); 3461 return (answer); 3462 } 3463 3464 static int 3465 sctp_find_cmsg(int c_type, void *data, struct mbuf *control, size_t cpsize) 3466 { 3467 struct cmsghdr cmh; 3468 struct sctp_sndinfo sndinfo; 3469 struct sctp_prinfo prinfo; 3470 struct sctp_authinfo authinfo; 3471 int tot_len, rem_len, cmsg_data_len, cmsg_data_off, off; 3472 int found; 3473 3474 /* 3475 * Independent of how many mbufs, find the c_type inside the control 3476 * structure and copy out the data. 3477 */ 3478 found = 0; 3479 tot_len = SCTP_BUF_LEN(control); 3480 for (off = 0; off < tot_len; off += CMSG_ALIGN(cmh.cmsg_len)) { 3481 rem_len = tot_len - off; 3482 if (rem_len < (int)CMSG_ALIGN(sizeof(cmh))) { 3483 /* There is not enough room for one more. */ 3484 return (found); 3485 } 3486 m_copydata(control, off, sizeof(cmh), (caddr_t)&cmh); 3487 if (cmh.cmsg_len < CMSG_ALIGN(sizeof(cmh))) { 3488 /* We dont't have a complete CMSG header. */ 3489 return (found); 3490 } 3491 if ((cmh.cmsg_len > INT_MAX) || ((int)cmh.cmsg_len > rem_len)) { 3492 /* We don't have the complete CMSG. */ 3493 return (found); 3494 } 3495 cmsg_data_len = (int)cmh.cmsg_len - CMSG_ALIGN(sizeof(cmh)); 3496 cmsg_data_off = off + CMSG_ALIGN(sizeof(cmh)); 3497 if ((cmh.cmsg_level == IPPROTO_SCTP) && 3498 ((c_type == cmh.cmsg_type) || 3499 ((c_type == SCTP_SNDRCV) && 3500 ((cmh.cmsg_type == SCTP_SNDINFO) || 3501 (cmh.cmsg_type == SCTP_PRINFO) || 3502 (cmh.cmsg_type == SCTP_AUTHINFO))))) { 3503 if (c_type == cmh.cmsg_type) { 3504 if (cpsize > INT_MAX) { 3505 return (found); 3506 } 3507 if (cmsg_data_len < (int)cpsize) { 3508 return (found); 3509 } 3510 /* It is exactly what we want. Copy it out. */ 3511 m_copydata(control, cmsg_data_off, (int)cpsize, (caddr_t)data); 3512 return (1); 3513 } else { 3514 struct sctp_sndrcvinfo *sndrcvinfo; 3515 3516 sndrcvinfo = (struct sctp_sndrcvinfo *)data; 3517 if (found == 0) { 3518 if (cpsize < sizeof(struct sctp_sndrcvinfo)) { 3519 return (found); 3520 } 3521 memset(sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo)); 3522 } 3523 switch (cmh.cmsg_type) { 3524 case SCTP_SNDINFO: 3525 if (cmsg_data_len < (int)sizeof(struct sctp_sndinfo)) { 3526 return (found); 3527 } 3528 m_copydata(control, cmsg_data_off, sizeof(struct sctp_sndinfo), (caddr_t)&sndinfo); 3529 sndrcvinfo->sinfo_stream = sndinfo.snd_sid; 3530 sndrcvinfo->sinfo_flags = sndinfo.snd_flags; 3531 sndrcvinfo->sinfo_ppid = sndinfo.snd_ppid; 3532 sndrcvinfo->sinfo_context = sndinfo.snd_context; 3533 sndrcvinfo->sinfo_assoc_id = sndinfo.snd_assoc_id; 3534 break; 3535 case SCTP_PRINFO: 3536 if (cmsg_data_len < (int)sizeof(struct sctp_prinfo)) { 3537 return (found); 3538 } 3539 m_copydata(control, cmsg_data_off, sizeof(struct sctp_prinfo), (caddr_t)&prinfo); 3540 if (prinfo.pr_policy != SCTP_PR_SCTP_NONE) { 3541 sndrcvinfo->sinfo_timetolive = prinfo.pr_value; 3542 } else { 3543 sndrcvinfo->sinfo_timetolive = 0; 3544 } 3545 sndrcvinfo->sinfo_flags |= prinfo.pr_policy; 3546 break; 3547 case SCTP_AUTHINFO: 3548 if (cmsg_data_len < (int)sizeof(struct sctp_authinfo)) { 3549 return (found); 3550 } 3551 m_copydata(control, cmsg_data_off, sizeof(struct sctp_authinfo), (caddr_t)&authinfo); 3552 sndrcvinfo->sinfo_keynumber_valid = 1; 3553 sndrcvinfo->sinfo_keynumber = authinfo.auth_keynumber; 3554 break; 3555 default: 3556 return (found); 3557 } 3558 found = 1; 3559 } 3560 } 3561 } 3562 return (found); 3563 } 3564 3565 static int 3566 sctp_process_cmsgs_for_init(struct sctp_tcb *stcb, struct mbuf *control, int *error) 3567 { 3568 struct cmsghdr cmh; 3569 int tlen, at; 3570 struct sctp_initmsg initmsg; 3571 #ifdef INET 3572 struct sockaddr_in sin; 3573 #endif 3574 #ifdef INET6 3575 struct sockaddr_in6 sin6; 3576 #endif 3577 3578 tlen = SCTP_BUF_LEN(control); 3579 at = 0; 3580 while (at < tlen) { 3581 if ((tlen - at) < (int)CMSG_ALIGN(sizeof(cmh))) { 3582 /* There is not enough room for one more. */ 3583 *error = EINVAL; 3584 return (1); 3585 } 3586 m_copydata(control, at, sizeof(cmh), (caddr_t)&cmh); 3587 if (cmh.cmsg_len < CMSG_ALIGN(sizeof(cmh))) { 3588 /* We dont't have a complete CMSG header. */ 3589 *error = EINVAL; 3590 return (1); 3591 } 3592 if (((int)cmh.cmsg_len + at) > tlen) { 3593 /* We don't have the complete CMSG. */ 3594 *error = EINVAL; 3595 return (1); 3596 } 3597 if (cmh.cmsg_level == IPPROTO_SCTP) { 3598 switch (cmh.cmsg_type) { 3599 case SCTP_INIT: 3600 if ((size_t)(cmh.cmsg_len - CMSG_ALIGN(sizeof(cmh))) < sizeof(struct sctp_initmsg)) { 3601 *error = EINVAL; 3602 return (1); 3603 } 3604 m_copydata(control, at + CMSG_ALIGN(sizeof(cmh)), sizeof(struct sctp_initmsg), (caddr_t)&initmsg); 3605 if (initmsg.sinit_max_attempts) 3606 stcb->asoc.max_init_times = initmsg.sinit_max_attempts; 3607 if (initmsg.sinit_num_ostreams) 3608 stcb->asoc.pre_open_streams = initmsg.sinit_num_ostreams; 3609 if (initmsg.sinit_max_instreams) 3610 stcb->asoc.max_inbound_streams = initmsg.sinit_max_instreams; 3611 if (initmsg.sinit_max_init_timeo) 3612 stcb->asoc.initial_init_rto_max = initmsg.sinit_max_init_timeo; 3613 if (stcb->asoc.streamoutcnt < stcb->asoc.pre_open_streams) { 3614 struct sctp_stream_out *tmp_str; 3615 unsigned int i; 3616 #if defined(SCTP_DETAILED_STR_STATS) 3617 int j; 3618 #endif 3619 3620 /* Default is NOT correct */ 3621 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Ok, default:%d pre_open:%d\n", 3622 stcb->asoc.streamoutcnt, stcb->asoc.pre_open_streams); 3623 SCTP_TCB_UNLOCK(stcb); 3624 SCTP_MALLOC(tmp_str, 3625 struct sctp_stream_out *, 3626 (stcb->asoc.pre_open_streams * sizeof(struct sctp_stream_out)), 3627 SCTP_M_STRMO); 3628 SCTP_TCB_LOCK(stcb); 3629 if (tmp_str != NULL) { 3630 SCTP_FREE(stcb->asoc.strmout, SCTP_M_STRMO); 3631 stcb->asoc.strmout = tmp_str; 3632 stcb->asoc.strm_realoutsize = stcb->asoc.streamoutcnt = stcb->asoc.pre_open_streams; 3633 } else { 3634 stcb->asoc.pre_open_streams = stcb->asoc.streamoutcnt; 3635 } 3636 for (i = 0; i < stcb->asoc.streamoutcnt; i++) { 3637 TAILQ_INIT(&stcb->asoc.strmout[i].outqueue); 3638 stcb->asoc.strmout[i].chunks_on_queues = 0; 3639 stcb->asoc.strmout[i].next_mid_ordered = 0; 3640 stcb->asoc.strmout[i].next_mid_unordered = 0; 3641 #if defined(SCTP_DETAILED_STR_STATS) 3642 for (j = 0; j < SCTP_PR_SCTP_MAX + 1; j++) { 3643 stcb->asoc.strmout[i].abandoned_sent[j] = 0; 3644 stcb->asoc.strmout[i].abandoned_unsent[j] = 0; 3645 } 3646 #else 3647 stcb->asoc.strmout[i].abandoned_sent[0] = 0; 3648 stcb->asoc.strmout[i].abandoned_unsent[0] = 0; 3649 #endif 3650 stcb->asoc.strmout[i].sid = i; 3651 stcb->asoc.strmout[i].last_msg_incomplete = 0; 3652 stcb->asoc.strmout[i].state = SCTP_STREAM_OPENING; 3653 stcb->asoc.ss_functions.sctp_ss_init_stream(stcb, &stcb->asoc.strmout[i], NULL); 3654 } 3655 } 3656 break; 3657 #ifdef INET 3658 case SCTP_DSTADDRV4: 3659 if ((size_t)(cmh.cmsg_len - CMSG_ALIGN(sizeof(cmh))) < sizeof(struct in_addr)) { 3660 *error = EINVAL; 3661 return (1); 3662 } 3663 memset(&sin, 0, sizeof(struct sockaddr_in)); 3664 sin.sin_family = AF_INET; 3665 sin.sin_len = sizeof(struct sockaddr_in); 3666 sin.sin_port = stcb->rport; 3667 m_copydata(control, at + CMSG_ALIGN(sizeof(cmh)), sizeof(struct in_addr), (caddr_t)&sin.sin_addr); 3668 if ((sin.sin_addr.s_addr == INADDR_ANY) || 3669 (sin.sin_addr.s_addr == INADDR_BROADCAST) || 3670 IN_MULTICAST(ntohl(sin.sin_addr.s_addr))) { 3671 *error = EINVAL; 3672 return (1); 3673 } 3674 if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin, NULL, stcb->asoc.port, 3675 SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { 3676 *error = ENOBUFS; 3677 return (1); 3678 } 3679 break; 3680 #endif 3681 #ifdef INET6 3682 case SCTP_DSTADDRV6: 3683 if ((size_t)(cmh.cmsg_len - CMSG_ALIGN(sizeof(cmh))) < sizeof(struct in6_addr)) { 3684 *error = EINVAL; 3685 return (1); 3686 } 3687 memset(&sin6, 0, sizeof(struct sockaddr_in6)); 3688 sin6.sin6_family = AF_INET6; 3689 sin6.sin6_len = sizeof(struct sockaddr_in6); 3690 sin6.sin6_port = stcb->rport; 3691 m_copydata(control, at + CMSG_ALIGN(sizeof(cmh)), sizeof(struct in6_addr), (caddr_t)&sin6.sin6_addr); 3692 if (IN6_IS_ADDR_UNSPECIFIED(&sin6.sin6_addr) || 3693 IN6_IS_ADDR_MULTICAST(&sin6.sin6_addr)) { 3694 *error = EINVAL; 3695 return (1); 3696 } 3697 #ifdef INET 3698 if (IN6_IS_ADDR_V4MAPPED(&sin6.sin6_addr)) { 3699 in6_sin6_2_sin(&sin, &sin6); 3700 if ((sin.sin_addr.s_addr == INADDR_ANY) || 3701 (sin.sin_addr.s_addr == INADDR_BROADCAST) || 3702 IN_MULTICAST(ntohl(sin.sin_addr.s_addr))) { 3703 *error = EINVAL; 3704 return (1); 3705 } 3706 if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin, NULL, stcb->asoc.port, 3707 SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { 3708 *error = ENOBUFS; 3709 return (1); 3710 } 3711 } else 3712 #endif 3713 if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin6, NULL, stcb->asoc.port, 3714 SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { 3715 *error = ENOBUFS; 3716 return (1); 3717 } 3718 break; 3719 #endif 3720 default: 3721 break; 3722 } 3723 } 3724 at += CMSG_ALIGN(cmh.cmsg_len); 3725 } 3726 return (0); 3727 } 3728 3729 static struct sctp_tcb * 3730 sctp_findassociation_cmsgs(struct sctp_inpcb **inp_p, 3731 uint16_t port, 3732 struct mbuf *control, 3733 struct sctp_nets **net_p, 3734 int *error) 3735 { 3736 struct cmsghdr cmh; 3737 int tlen, at; 3738 struct sctp_tcb *stcb; 3739 struct sockaddr *addr; 3740 #ifdef INET 3741 struct sockaddr_in sin; 3742 #endif 3743 #ifdef INET6 3744 struct sockaddr_in6 sin6; 3745 #endif 3746 3747 tlen = SCTP_BUF_LEN(control); 3748 at = 0; 3749 while (at < tlen) { 3750 if ((tlen - at) < (int)CMSG_ALIGN(sizeof(cmh))) { 3751 /* There is not enough room for one more. */ 3752 *error = EINVAL; 3753 return (NULL); 3754 } 3755 m_copydata(control, at, sizeof(cmh), (caddr_t)&cmh); 3756 if (cmh.cmsg_len < CMSG_ALIGN(sizeof(cmh))) { 3757 /* We dont't have a complete CMSG header. */ 3758 *error = EINVAL; 3759 return (NULL); 3760 } 3761 if (((int)cmh.cmsg_len + at) > tlen) { 3762 /* We don't have the complete CMSG. */ 3763 *error = EINVAL; 3764 return (NULL); 3765 } 3766 if (cmh.cmsg_level == IPPROTO_SCTP) { 3767 switch (cmh.cmsg_type) { 3768 #ifdef INET 3769 case SCTP_DSTADDRV4: 3770 if ((size_t)(cmh.cmsg_len - CMSG_ALIGN(sizeof(cmh))) < sizeof(struct in_addr)) { 3771 *error = EINVAL; 3772 return (NULL); 3773 } 3774 memset(&sin, 0, sizeof(struct sockaddr_in)); 3775 sin.sin_family = AF_INET; 3776 sin.sin_len = sizeof(struct sockaddr_in); 3777 sin.sin_port = port; 3778 m_copydata(control, at + CMSG_ALIGN(sizeof(cmh)), sizeof(struct in_addr), (caddr_t)&sin.sin_addr); 3779 addr = (struct sockaddr *)&sin; 3780 break; 3781 #endif 3782 #ifdef INET6 3783 case SCTP_DSTADDRV6: 3784 if ((size_t)(cmh.cmsg_len - CMSG_ALIGN(sizeof(cmh))) < sizeof(struct in6_addr)) { 3785 *error = EINVAL; 3786 return (NULL); 3787 } 3788 memset(&sin6, 0, sizeof(struct sockaddr_in6)); 3789 sin6.sin6_family = AF_INET6; 3790 sin6.sin6_len = sizeof(struct sockaddr_in6); 3791 sin6.sin6_port = port; 3792 m_copydata(control, at + CMSG_ALIGN(sizeof(cmh)), sizeof(struct in6_addr), (caddr_t)&sin6.sin6_addr); 3793 #ifdef INET 3794 if (IN6_IS_ADDR_V4MAPPED(&sin6.sin6_addr)) { 3795 in6_sin6_2_sin(&sin, &sin6); 3796 addr = (struct sockaddr *)&sin; 3797 } else 3798 #endif 3799 addr = (struct sockaddr *)&sin6; 3800 break; 3801 #endif 3802 default: 3803 addr = NULL; 3804 break; 3805 } 3806 if (addr) { 3807 stcb = sctp_findassociation_ep_addr(inp_p, addr, net_p, NULL, NULL); 3808 if (stcb != NULL) { 3809 return (stcb); 3810 } 3811 } 3812 } 3813 at += CMSG_ALIGN(cmh.cmsg_len); 3814 } 3815 return (NULL); 3816 } 3817 3818 static struct mbuf * 3819 sctp_add_cookie(struct mbuf *init, int init_offset, 3820 struct mbuf *initack, int initack_offset, struct sctp_state_cookie *stc_in, uint8_t **signature) 3821 { 3822 struct mbuf *copy_init, *copy_initack, *m_at, *sig, *mret; 3823 struct sctp_state_cookie *stc; 3824 struct sctp_paramhdr *ph; 3825 uint8_t *foo; 3826 int sig_offset; 3827 uint16_t cookie_sz; 3828 3829 mret = sctp_get_mbuf_for_msg((sizeof(struct sctp_state_cookie) + 3830 sizeof(struct sctp_paramhdr)), 0, 3831 M_NOWAIT, 1, MT_DATA); 3832 if (mret == NULL) { 3833 return (NULL); 3834 } 3835 copy_init = SCTP_M_COPYM(init, init_offset, M_COPYALL, M_NOWAIT); 3836 if (copy_init == NULL) { 3837 sctp_m_freem(mret); 3838 return (NULL); 3839 } 3840 #ifdef SCTP_MBUF_LOGGING 3841 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { 3842 sctp_log_mbc(copy_init, SCTP_MBUF_ICOPY); 3843 } 3844 #endif 3845 copy_initack = SCTP_M_COPYM(initack, initack_offset, M_COPYALL, 3846 M_NOWAIT); 3847 if (copy_initack == NULL) { 3848 sctp_m_freem(mret); 3849 sctp_m_freem(copy_init); 3850 return (NULL); 3851 } 3852 #ifdef SCTP_MBUF_LOGGING 3853 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { 3854 sctp_log_mbc(copy_initack, SCTP_MBUF_ICOPY); 3855 } 3856 #endif 3857 /* easy side we just drop it on the end */ 3858 ph = mtod(mret, struct sctp_paramhdr *); 3859 SCTP_BUF_LEN(mret) = sizeof(struct sctp_state_cookie) + 3860 sizeof(struct sctp_paramhdr); 3861 stc = (struct sctp_state_cookie *)((caddr_t)ph + 3862 sizeof(struct sctp_paramhdr)); 3863 ph->param_type = htons(SCTP_STATE_COOKIE); 3864 ph->param_length = 0; /* fill in at the end */ 3865 /* Fill in the stc cookie data */ 3866 memcpy(stc, stc_in, sizeof(struct sctp_state_cookie)); 3867 3868 /* tack the INIT and then the INIT-ACK onto the chain */ 3869 cookie_sz = 0; 3870 for (m_at = mret; m_at; m_at = SCTP_BUF_NEXT(m_at)) { 3871 cookie_sz += SCTP_BUF_LEN(m_at); 3872 if (SCTP_BUF_NEXT(m_at) == NULL) { 3873 SCTP_BUF_NEXT(m_at) = copy_init; 3874 break; 3875 } 3876 } 3877 for (m_at = copy_init; m_at; m_at = SCTP_BUF_NEXT(m_at)) { 3878 cookie_sz += SCTP_BUF_LEN(m_at); 3879 if (SCTP_BUF_NEXT(m_at) == NULL) { 3880 SCTP_BUF_NEXT(m_at) = copy_initack; 3881 break; 3882 } 3883 } 3884 for (m_at = copy_initack; m_at; m_at = SCTP_BUF_NEXT(m_at)) { 3885 cookie_sz += SCTP_BUF_LEN(m_at); 3886 if (SCTP_BUF_NEXT(m_at) == NULL) { 3887 break; 3888 } 3889 } 3890 sig = sctp_get_mbuf_for_msg(SCTP_SECRET_SIZE, 0, M_NOWAIT, 1, MT_DATA); 3891 if (sig == NULL) { 3892 /* no space, so free the entire chain */ 3893 sctp_m_freem(mret); 3894 return (NULL); 3895 } 3896 SCTP_BUF_LEN(sig) = 0; 3897 SCTP_BUF_NEXT(m_at) = sig; 3898 sig_offset = 0; 3899 foo = (uint8_t *)(mtod(sig, caddr_t)+sig_offset); 3900 memset(foo, 0, SCTP_SIGNATURE_SIZE); 3901 *signature = foo; 3902 SCTP_BUF_LEN(sig) += SCTP_SIGNATURE_SIZE; 3903 cookie_sz += SCTP_SIGNATURE_SIZE; 3904 ph->param_length = htons(cookie_sz); 3905 return (mret); 3906 } 3907 3908 3909 static uint8_t 3910 sctp_get_ect(struct sctp_tcb *stcb) 3911 { 3912 if ((stcb != NULL) && (stcb->asoc.ecn_supported == 1)) { 3913 return (SCTP_ECT0_BIT); 3914 } else { 3915 return (0); 3916 } 3917 } 3918 3919 #if defined(INET) || defined(INET6) 3920 static void 3921 sctp_handle_no_route(struct sctp_tcb *stcb, 3922 struct sctp_nets *net, 3923 int so_locked) 3924 { 3925 SCTPDBG(SCTP_DEBUG_OUTPUT1, "dropped packet - no valid source addr\n"); 3926 3927 if (net) { 3928 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Destination was "); 3929 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT1, &net->ro._l_addr.sa); 3930 if (net->dest_state & SCTP_ADDR_CONFIRMED) { 3931 if ((net->dest_state & SCTP_ADDR_REACHABLE) && stcb) { 3932 SCTPDBG(SCTP_DEBUG_OUTPUT1, "no route takes interface %p down\n", (void *)net); 3933 sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, 3934 stcb, 0, 3935 (void *)net, 3936 so_locked); 3937 net->dest_state &= ~SCTP_ADDR_REACHABLE; 3938 net->dest_state &= ~SCTP_ADDR_PF; 3939 } 3940 } 3941 if (stcb) { 3942 if (net == stcb->asoc.primary_destination) { 3943 /* need a new primary */ 3944 struct sctp_nets *alt; 3945 3946 alt = sctp_find_alternate_net(stcb, net, 0); 3947 if (alt != net) { 3948 if (stcb->asoc.alternate) { 3949 sctp_free_remote_addr(stcb->asoc.alternate); 3950 } 3951 stcb->asoc.alternate = alt; 3952 atomic_add_int(&stcb->asoc.alternate->ref_count, 1); 3953 if (net->ro._s_addr) { 3954 sctp_free_ifa(net->ro._s_addr); 3955 net->ro._s_addr = NULL; 3956 } 3957 net->src_addr_selected = 0; 3958 } 3959 } 3960 } 3961 } 3962 } 3963 #endif 3964 3965 static int 3966 sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, 3967 struct sctp_tcb *stcb, /* may be NULL */ 3968 struct sctp_nets *net, 3969 struct sockaddr *to, 3970 struct mbuf *m, 3971 uint32_t auth_offset, 3972 struct sctp_auth_chunk *auth, 3973 uint16_t auth_keyid, 3974 int nofragment_flag, 3975 int ecn_ok, 3976 int out_of_asoc_ok, 3977 uint16_t src_port, 3978 uint16_t dest_port, 3979 uint32_t v_tag, 3980 uint16_t port, 3981 union sctp_sockstore *over_addr, 3982 uint8_t mflowtype, uint32_t mflowid, 3983 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3984 int so_locked SCTP_UNUSED 3985 #else 3986 int so_locked 3987 #endif 3988 ) 3989 /* nofragment_flag to tell if IP_DF should be set (IPv4 only) */ 3990 { 3991 /** 3992 * Given a mbuf chain (via SCTP_BUF_NEXT()) that holds a packet header 3993 * WITH an SCTPHDR but no IP header, endpoint inp and sa structure: 3994 * - fill in the HMAC digest of any AUTH chunk in the packet. 3995 * - calculate and fill in the SCTP checksum. 3996 * - prepend an IP address header. 3997 * - if boundall use INADDR_ANY. 3998 * - if boundspecific do source address selection. 3999 * - set fragmentation option for ipV4. 4000 * - On return from IP output, check/adjust mtu size of output 4001 * interface and smallest_mtu size as well. 4002 */ 4003 /* Will need ifdefs around this */ 4004 struct mbuf *newm; 4005 struct sctphdr *sctphdr; 4006 int packet_length; 4007 int ret; 4008 #if defined(INET) || defined(INET6) 4009 uint32_t vrf_id; 4010 #endif 4011 #if defined(INET) || defined(INET6) 4012 struct mbuf *o_pak; 4013 sctp_route_t *ro = NULL; 4014 struct udphdr *udp = NULL; 4015 #endif 4016 uint8_t tos_value; 4017 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4018 struct socket *so = NULL; 4019 #endif 4020 4021 if ((net) && (net->dest_state & SCTP_ADDR_OUT_OF_SCOPE)) { 4022 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EFAULT); 4023 sctp_m_freem(m); 4024 return (EFAULT); 4025 } 4026 #if defined(INET) || defined(INET6) 4027 if (stcb) { 4028 vrf_id = stcb->asoc.vrf_id; 4029 } else { 4030 vrf_id = inp->def_vrf_id; 4031 } 4032 #endif 4033 /* fill in the HMAC digest for any AUTH chunk in the packet */ 4034 if ((auth != NULL) && (stcb != NULL)) { 4035 sctp_fill_hmac_digest_m(m, auth_offset, auth, stcb, auth_keyid); 4036 } 4037 if (net) { 4038 tos_value = net->dscp; 4039 } else if (stcb) { 4040 tos_value = stcb->asoc.default_dscp; 4041 } else { 4042 tos_value = inp->sctp_ep.default_dscp; 4043 } 4044 4045 switch (to->sa_family) { 4046 #ifdef INET 4047 case AF_INET: 4048 { 4049 struct ip *ip = NULL; 4050 sctp_route_t iproute; 4051 int len; 4052 4053 len = SCTP_MIN_V4_OVERHEAD; 4054 if (port) { 4055 len += sizeof(struct udphdr); 4056 } 4057 newm = sctp_get_mbuf_for_msg(len, 1, M_NOWAIT, 1, MT_DATA); 4058 if (newm == NULL) { 4059 sctp_m_freem(m); 4060 SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 4061 return (ENOMEM); 4062 } 4063 SCTP_ALIGN_TO_END(newm, len); 4064 SCTP_BUF_LEN(newm) = len; 4065 SCTP_BUF_NEXT(newm) = m; 4066 m = newm; 4067 if (net != NULL) { 4068 m->m_pkthdr.flowid = net->flowid; 4069 M_HASHTYPE_SET(m, net->flowtype); 4070 } else { 4071 m->m_pkthdr.flowid = mflowid; 4072 M_HASHTYPE_SET(m, mflowtype); 4073 } 4074 packet_length = sctp_calculate_len(m); 4075 ip = mtod(m, struct ip *); 4076 ip->ip_v = IPVERSION; 4077 ip->ip_hl = (sizeof(struct ip) >> 2); 4078 if (tos_value == 0) { 4079 /* 4080 * This means especially, that it is not set 4081 * at the SCTP layer. So use the value from 4082 * the IP layer. 4083 */ 4084 tos_value = inp->ip_inp.inp.inp_ip_tos; 4085 } 4086 tos_value &= 0xfc; 4087 if (ecn_ok) { 4088 tos_value |= sctp_get_ect(stcb); 4089 } 4090 if ((nofragment_flag) && (port == 0)) { 4091 ip->ip_off = htons(IP_DF); 4092 } else { 4093 ip->ip_off = htons(0); 4094 } 4095 /* FreeBSD has a function for ip_id's */ 4096 ip_fillid(ip); 4097 4098 ip->ip_ttl = inp->ip_inp.inp.inp_ip_ttl; 4099 ip->ip_len = htons(packet_length); 4100 ip->ip_tos = tos_value; 4101 if (port) { 4102 ip->ip_p = IPPROTO_UDP; 4103 } else { 4104 ip->ip_p = IPPROTO_SCTP; 4105 } 4106 ip->ip_sum = 0; 4107 if (net == NULL) { 4108 ro = &iproute; 4109 memset(&iproute, 0, sizeof(iproute)); 4110 memcpy(&ro->ro_dst, to, to->sa_len); 4111 } else { 4112 ro = (sctp_route_t *)&net->ro; 4113 } 4114 /* Now the address selection part */ 4115 ip->ip_dst.s_addr = ((struct sockaddr_in *)to)->sin_addr.s_addr; 4116 4117 /* call the routine to select the src address */ 4118 if (net && out_of_asoc_ok == 0) { 4119 if (net->ro._s_addr && (net->ro._s_addr->localifa_flags & (SCTP_BEING_DELETED | SCTP_ADDR_IFA_UNUSEABLE))) { 4120 sctp_free_ifa(net->ro._s_addr); 4121 net->ro._s_addr = NULL; 4122 net->src_addr_selected = 0; 4123 if (ro->ro_rt) { 4124 RTFREE(ro->ro_rt); 4125 ro->ro_rt = NULL; 4126 } 4127 } 4128 if (net->src_addr_selected == 0) { 4129 /* Cache the source address */ 4130 net->ro._s_addr = sctp_source_address_selection(inp, stcb, 4131 ro, net, 0, 4132 vrf_id); 4133 net->src_addr_selected = 1; 4134 } 4135 if (net->ro._s_addr == NULL) { 4136 /* No route to host */ 4137 net->src_addr_selected = 0; 4138 sctp_handle_no_route(stcb, net, so_locked); 4139 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EHOSTUNREACH); 4140 sctp_m_freem(m); 4141 return (EHOSTUNREACH); 4142 } 4143 ip->ip_src = net->ro._s_addr->address.sin.sin_addr; 4144 } else { 4145 if (over_addr == NULL) { 4146 struct sctp_ifa *_lsrc; 4147 4148 _lsrc = sctp_source_address_selection(inp, stcb, ro, 4149 net, 4150 out_of_asoc_ok, 4151 vrf_id); 4152 if (_lsrc == NULL) { 4153 sctp_handle_no_route(stcb, net, so_locked); 4154 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EHOSTUNREACH); 4155 sctp_m_freem(m); 4156 return (EHOSTUNREACH); 4157 } 4158 ip->ip_src = _lsrc->address.sin.sin_addr; 4159 sctp_free_ifa(_lsrc); 4160 } else { 4161 ip->ip_src = over_addr->sin.sin_addr; 4162 SCTP_RTALLOC(ro, vrf_id, inp->fibnum); 4163 } 4164 } 4165 if (port) { 4166 if (htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)) == 0) { 4167 sctp_handle_no_route(stcb, net, so_locked); 4168 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EHOSTUNREACH); 4169 sctp_m_freem(m); 4170 return (EHOSTUNREACH); 4171 } 4172 udp = (struct udphdr *)((caddr_t)ip + sizeof(struct ip)); 4173 udp->uh_sport = htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)); 4174 udp->uh_dport = port; 4175 udp->uh_ulen = htons((uint16_t)(packet_length - sizeof(struct ip))); 4176 if (V_udp_cksum) { 4177 udp->uh_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, udp->uh_ulen + htons(IPPROTO_UDP)); 4178 } else { 4179 udp->uh_sum = 0; 4180 } 4181 sctphdr = (struct sctphdr *)((caddr_t)udp + sizeof(struct udphdr)); 4182 } else { 4183 sctphdr = (struct sctphdr *)((caddr_t)ip + sizeof(struct ip)); 4184 } 4185 4186 sctphdr->src_port = src_port; 4187 sctphdr->dest_port = dest_port; 4188 sctphdr->v_tag = v_tag; 4189 sctphdr->checksum = 0; 4190 4191 /* 4192 * If source address selection fails and we find no 4193 * route then the ip_output should fail as well with 4194 * a NO_ROUTE_TO_HOST type error. We probably should 4195 * catch that somewhere and abort the association 4196 * right away (assuming this is an INIT being sent). 4197 */ 4198 if (ro->ro_rt == NULL) { 4199 /* 4200 * src addr selection failed to find a route 4201 * (or valid source addr), so we can't get 4202 * there from here (yet)! 4203 */ 4204 sctp_handle_no_route(stcb, net, so_locked); 4205 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EHOSTUNREACH); 4206 sctp_m_freem(m); 4207 return (EHOSTUNREACH); 4208 } 4209 if (ro != &iproute) { 4210 memcpy(&iproute, ro, sizeof(*ro)); 4211 } 4212 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Calling ipv4 output routine from low level src addr:%x\n", 4213 (uint32_t)(ntohl(ip->ip_src.s_addr))); 4214 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Destination is %x\n", 4215 (uint32_t)(ntohl(ip->ip_dst.s_addr))); 4216 SCTPDBG(SCTP_DEBUG_OUTPUT3, "RTP route is %p through\n", 4217 (void *)ro->ro_rt); 4218 4219 if (SCTP_GET_HEADER_FOR_OUTPUT(o_pak)) { 4220 /* failed to prepend data, give up */ 4221 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 4222 sctp_m_freem(m); 4223 return (ENOMEM); 4224 } 4225 SCTP_ATTACH_CHAIN(o_pak, m, packet_length); 4226 if (port) { 4227 #if defined(SCTP_WITH_NO_CSUM) 4228 SCTP_STAT_INCR(sctps_sendnocrc); 4229 #else 4230 sctphdr->checksum = sctp_calculate_cksum(m, sizeof(struct ip) + sizeof(struct udphdr)); 4231 SCTP_STAT_INCR(sctps_sendswcrc); 4232 #endif 4233 if (V_udp_cksum) { 4234 SCTP_ENABLE_UDP_CSUM(o_pak); 4235 } 4236 } else { 4237 #if defined(SCTP_WITH_NO_CSUM) 4238 SCTP_STAT_INCR(sctps_sendnocrc); 4239 #else 4240 m->m_pkthdr.csum_flags = CSUM_SCTP; 4241 m->m_pkthdr.csum_data = offsetof(struct sctphdr, checksum); 4242 SCTP_STAT_INCR(sctps_sendhwcrc); 4243 #endif 4244 } 4245 #ifdef SCTP_PACKET_LOGGING 4246 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) 4247 sctp_packet_log(o_pak); 4248 #endif 4249 /* send it out. table id is taken from stcb */ 4250 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4251 if ((SCTP_BASE_SYSCTL(sctp_output_unlocked)) && (so_locked)) { 4252 so = SCTP_INP_SO(inp); 4253 SCTP_SOCKET_UNLOCK(so, 0); 4254 } 4255 #endif 4256 SCTP_IP_OUTPUT(ret, o_pak, ro, stcb, vrf_id); 4257 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4258 if ((SCTP_BASE_SYSCTL(sctp_output_unlocked)) && (so_locked)) { 4259 atomic_add_int(&stcb->asoc.refcnt, 1); 4260 SCTP_TCB_UNLOCK(stcb); 4261 SCTP_SOCKET_LOCK(so, 0); 4262 SCTP_TCB_LOCK(stcb); 4263 atomic_subtract_int(&stcb->asoc.refcnt, 1); 4264 } 4265 #endif 4266 SCTP_STAT_INCR(sctps_sendpackets); 4267 SCTP_STAT_INCR_COUNTER64(sctps_outpackets); 4268 if (ret) 4269 SCTP_STAT_INCR(sctps_senderrors); 4270 4271 SCTPDBG(SCTP_DEBUG_OUTPUT3, "IP output returns %d\n", ret); 4272 if (net == NULL) { 4273 /* free tempy routes */ 4274 RO_RTFREE(ro); 4275 } else { 4276 /* 4277 * PMTU check versus smallest asoc MTU goes 4278 * here 4279 */ 4280 if ((ro->ro_rt != NULL) && 4281 (net->ro._s_addr)) { 4282 uint32_t mtu; 4283 4284 mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, ro->ro_rt); 4285 if (mtu > 0) { 4286 if (net->port) { 4287 mtu -= sizeof(struct udphdr); 4288 } 4289 if ((stcb != NULL) && (stcb->asoc.smallest_mtu > mtu)) { 4290 sctp_mtu_size_reset(inp, &stcb->asoc, mtu); 4291 } 4292 net->mtu = mtu; 4293 } 4294 } else if (ro->ro_rt == NULL) { 4295 /* route was freed */ 4296 if (net->ro._s_addr && 4297 net->src_addr_selected) { 4298 sctp_free_ifa(net->ro._s_addr); 4299 net->ro._s_addr = NULL; 4300 } 4301 net->src_addr_selected = 0; 4302 } 4303 } 4304 return (ret); 4305 } 4306 #endif 4307 #ifdef INET6 4308 case AF_INET6: 4309 { 4310 uint32_t flowlabel, flowinfo; 4311 struct ip6_hdr *ip6h; 4312 struct route_in6 ip6route; 4313 struct ifnet *ifp; 4314 struct sockaddr_in6 *sin6, tmp, *lsa6, lsa6_tmp; 4315 int prev_scope = 0; 4316 struct sockaddr_in6 lsa6_storage; 4317 int error; 4318 u_short prev_port = 0; 4319 int len; 4320 4321 if (net) { 4322 flowlabel = net->flowlabel; 4323 } else if (stcb) { 4324 flowlabel = stcb->asoc.default_flowlabel; 4325 } else { 4326 flowlabel = inp->sctp_ep.default_flowlabel; 4327 } 4328 if (flowlabel == 0) { 4329 /* 4330 * This means especially, that it is not set 4331 * at the SCTP layer. So use the value from 4332 * the IP layer. 4333 */ 4334 flowlabel = ntohl(((struct in6pcb *)inp)->in6p_flowinfo); 4335 } 4336 flowlabel &= 0x000fffff; 4337 len = SCTP_MIN_OVERHEAD; 4338 if (port) { 4339 len += sizeof(struct udphdr); 4340 } 4341 newm = sctp_get_mbuf_for_msg(len, 1, M_NOWAIT, 1, MT_DATA); 4342 if (newm == NULL) { 4343 sctp_m_freem(m); 4344 SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 4345 return (ENOMEM); 4346 } 4347 SCTP_ALIGN_TO_END(newm, len); 4348 SCTP_BUF_LEN(newm) = len; 4349 SCTP_BUF_NEXT(newm) = m; 4350 m = newm; 4351 if (net != NULL) { 4352 m->m_pkthdr.flowid = net->flowid; 4353 M_HASHTYPE_SET(m, net->flowtype); 4354 } else { 4355 m->m_pkthdr.flowid = mflowid; 4356 M_HASHTYPE_SET(m, mflowtype); 4357 } 4358 packet_length = sctp_calculate_len(m); 4359 4360 ip6h = mtod(m, struct ip6_hdr *); 4361 /* protect *sin6 from overwrite */ 4362 sin6 = (struct sockaddr_in6 *)to; 4363 tmp = *sin6; 4364 sin6 = &tmp; 4365 4366 /* KAME hack: embed scopeid */ 4367 if (sa6_embedscope(sin6, MODULE_GLOBAL(ip6_use_defzone)) != 0) { 4368 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 4369 return (EINVAL); 4370 } 4371 if (net == NULL) { 4372 memset(&ip6route, 0, sizeof(ip6route)); 4373 ro = (sctp_route_t *)&ip6route; 4374 memcpy(&ro->ro_dst, sin6, sin6->sin6_len); 4375 } else { 4376 ro = (sctp_route_t *)&net->ro; 4377 } 4378 /* 4379 * We assume here that inp_flow is in host byte 4380 * order within the TCB! 4381 */ 4382 if (tos_value == 0) { 4383 /* 4384 * This means especially, that it is not set 4385 * at the SCTP layer. So use the value from 4386 * the IP layer. 4387 */ 4388 tos_value = (ntohl(((struct in6pcb *)inp)->in6p_flowinfo) >> 20) & 0xff; 4389 } 4390 tos_value &= 0xfc; 4391 if (ecn_ok) { 4392 tos_value |= sctp_get_ect(stcb); 4393 } 4394 flowinfo = 0x06; 4395 flowinfo <<= 8; 4396 flowinfo |= tos_value; 4397 flowinfo <<= 20; 4398 flowinfo |= flowlabel; 4399 ip6h->ip6_flow = htonl(flowinfo); 4400 if (port) { 4401 ip6h->ip6_nxt = IPPROTO_UDP; 4402 } else { 4403 ip6h->ip6_nxt = IPPROTO_SCTP; 4404 } 4405 ip6h->ip6_plen = (uint16_t)(packet_length - sizeof(struct ip6_hdr)); 4406 ip6h->ip6_dst = sin6->sin6_addr; 4407 4408 /* 4409 * Add SRC address selection here: we can only reuse 4410 * to a limited degree the kame src-addr-sel, since 4411 * we can try their selection but it may not be 4412 * bound. 4413 */ 4414 memset(&lsa6_tmp, 0, sizeof(lsa6_tmp)); 4415 lsa6_tmp.sin6_family = AF_INET6; 4416 lsa6_tmp.sin6_len = sizeof(lsa6_tmp); 4417 lsa6 = &lsa6_tmp; 4418 if (net && out_of_asoc_ok == 0) { 4419 if (net->ro._s_addr && (net->ro._s_addr->localifa_flags & (SCTP_BEING_DELETED | SCTP_ADDR_IFA_UNUSEABLE))) { 4420 sctp_free_ifa(net->ro._s_addr); 4421 net->ro._s_addr = NULL; 4422 net->src_addr_selected = 0; 4423 if (ro->ro_rt) { 4424 RTFREE(ro->ro_rt); 4425 ro->ro_rt = NULL; 4426 } 4427 } 4428 if (net->src_addr_selected == 0) { 4429 sin6 = (struct sockaddr_in6 *)&net->ro._l_addr; 4430 /* KAME hack: embed scopeid */ 4431 if (sa6_embedscope(sin6, MODULE_GLOBAL(ip6_use_defzone)) != 0) { 4432 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 4433 return (EINVAL); 4434 } 4435 /* Cache the source address */ 4436 net->ro._s_addr = sctp_source_address_selection(inp, 4437 stcb, 4438 ro, 4439 net, 4440 0, 4441 vrf_id); 4442 (void)sa6_recoverscope(sin6); 4443 net->src_addr_selected = 1; 4444 } 4445 if (net->ro._s_addr == NULL) { 4446 SCTPDBG(SCTP_DEBUG_OUTPUT3, "V6:No route to host\n"); 4447 net->src_addr_selected = 0; 4448 sctp_handle_no_route(stcb, net, so_locked); 4449 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EHOSTUNREACH); 4450 sctp_m_freem(m); 4451 return (EHOSTUNREACH); 4452 } 4453 lsa6->sin6_addr = net->ro._s_addr->address.sin6.sin6_addr; 4454 } else { 4455 sin6 = (struct sockaddr_in6 *)&ro->ro_dst; 4456 /* KAME hack: embed scopeid */ 4457 if (sa6_embedscope(sin6, MODULE_GLOBAL(ip6_use_defzone)) != 0) { 4458 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 4459 return (EINVAL); 4460 } 4461 if (over_addr == NULL) { 4462 struct sctp_ifa *_lsrc; 4463 4464 _lsrc = sctp_source_address_selection(inp, stcb, ro, 4465 net, 4466 out_of_asoc_ok, 4467 vrf_id); 4468 if (_lsrc == NULL) { 4469 sctp_handle_no_route(stcb, net, so_locked); 4470 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EHOSTUNREACH); 4471 sctp_m_freem(m); 4472 return (EHOSTUNREACH); 4473 } 4474 lsa6->sin6_addr = _lsrc->address.sin6.sin6_addr; 4475 sctp_free_ifa(_lsrc); 4476 } else { 4477 lsa6->sin6_addr = over_addr->sin6.sin6_addr; 4478 SCTP_RTALLOC(ro, vrf_id, inp->fibnum); 4479 } 4480 (void)sa6_recoverscope(sin6); 4481 } 4482 lsa6->sin6_port = inp->sctp_lport; 4483 4484 if (ro->ro_rt == NULL) { 4485 /* 4486 * src addr selection failed to find a route 4487 * (or valid source addr), so we can't get 4488 * there from here! 4489 */ 4490 sctp_handle_no_route(stcb, net, so_locked); 4491 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EHOSTUNREACH); 4492 sctp_m_freem(m); 4493 return (EHOSTUNREACH); 4494 } 4495 /* 4496 * XXX: sa6 may not have a valid sin6_scope_id in 4497 * the non-SCOPEDROUTING case. 4498 */ 4499 memset(&lsa6_storage, 0, sizeof(lsa6_storage)); 4500 lsa6_storage.sin6_family = AF_INET6; 4501 lsa6_storage.sin6_len = sizeof(lsa6_storage); 4502 lsa6_storage.sin6_addr = lsa6->sin6_addr; 4503 if ((error = sa6_recoverscope(&lsa6_storage)) != 0) { 4504 SCTPDBG(SCTP_DEBUG_OUTPUT3, "recover scope fails error %d\n", error); 4505 sctp_m_freem(m); 4506 return (error); 4507 } 4508 /* XXX */ 4509 lsa6_storage.sin6_addr = lsa6->sin6_addr; 4510 lsa6_storage.sin6_port = inp->sctp_lport; 4511 lsa6 = &lsa6_storage; 4512 ip6h->ip6_src = lsa6->sin6_addr; 4513 4514 if (port) { 4515 if (htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)) == 0) { 4516 sctp_handle_no_route(stcb, net, so_locked); 4517 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EHOSTUNREACH); 4518 sctp_m_freem(m); 4519 return (EHOSTUNREACH); 4520 } 4521 udp = (struct udphdr *)((caddr_t)ip6h + sizeof(struct ip6_hdr)); 4522 udp->uh_sport = htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)); 4523 udp->uh_dport = port; 4524 udp->uh_ulen = htons((uint16_t)(packet_length - sizeof(struct ip6_hdr))); 4525 udp->uh_sum = 0; 4526 sctphdr = (struct sctphdr *)((caddr_t)udp + sizeof(struct udphdr)); 4527 } else { 4528 sctphdr = (struct sctphdr *)((caddr_t)ip6h + sizeof(struct ip6_hdr)); 4529 } 4530 4531 sctphdr->src_port = src_port; 4532 sctphdr->dest_port = dest_port; 4533 sctphdr->v_tag = v_tag; 4534 sctphdr->checksum = 0; 4535 4536 /* 4537 * We set the hop limit now since there is a good 4538 * chance that our ro pointer is now filled 4539 */ 4540 ip6h->ip6_hlim = SCTP_GET_HLIM(inp, ro); 4541 ifp = SCTP_GET_IFN_VOID_FROM_ROUTE(ro); 4542 4543 #ifdef SCTP_DEBUG 4544 /* Copy to be sure something bad is not happening */ 4545 sin6->sin6_addr = ip6h->ip6_dst; 4546 lsa6->sin6_addr = ip6h->ip6_src; 4547 #endif 4548 4549 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Calling ipv6 output routine from low level\n"); 4550 SCTPDBG(SCTP_DEBUG_OUTPUT3, "src: "); 4551 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT3, (struct sockaddr *)lsa6); 4552 SCTPDBG(SCTP_DEBUG_OUTPUT3, "dst: "); 4553 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT3, (struct sockaddr *)sin6); 4554 if (net) { 4555 sin6 = (struct sockaddr_in6 *)&net->ro._l_addr; 4556 /* 4557 * preserve the port and scope for link 4558 * local send 4559 */ 4560 prev_scope = sin6->sin6_scope_id; 4561 prev_port = sin6->sin6_port; 4562 } 4563 if (SCTP_GET_HEADER_FOR_OUTPUT(o_pak)) { 4564 /* failed to prepend data, give up */ 4565 sctp_m_freem(m); 4566 SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 4567 return (ENOMEM); 4568 } 4569 SCTP_ATTACH_CHAIN(o_pak, m, packet_length); 4570 if (port) { 4571 #if defined(SCTP_WITH_NO_CSUM) 4572 SCTP_STAT_INCR(sctps_sendnocrc); 4573 #else 4574 sctphdr->checksum = sctp_calculate_cksum(m, sizeof(struct ip6_hdr) + sizeof(struct udphdr)); 4575 SCTP_STAT_INCR(sctps_sendswcrc); 4576 #endif 4577 if ((udp->uh_sum = in6_cksum(o_pak, IPPROTO_UDP, sizeof(struct ip6_hdr), packet_length - sizeof(struct ip6_hdr))) == 0) { 4578 udp->uh_sum = 0xffff; 4579 } 4580 } else { 4581 #if defined(SCTP_WITH_NO_CSUM) 4582 SCTP_STAT_INCR(sctps_sendnocrc); 4583 #else 4584 m->m_pkthdr.csum_flags = CSUM_SCTP_IPV6; 4585 m->m_pkthdr.csum_data = offsetof(struct sctphdr, checksum); 4586 SCTP_STAT_INCR(sctps_sendhwcrc); 4587 #endif 4588 } 4589 /* send it out. table id is taken from stcb */ 4590 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4591 if ((SCTP_BASE_SYSCTL(sctp_output_unlocked)) && (so_locked)) { 4592 so = SCTP_INP_SO(inp); 4593 SCTP_SOCKET_UNLOCK(so, 0); 4594 } 4595 #endif 4596 #ifdef SCTP_PACKET_LOGGING 4597 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) 4598 sctp_packet_log(o_pak); 4599 #endif 4600 SCTP_IP6_OUTPUT(ret, o_pak, (struct route_in6 *)ro, &ifp, stcb, vrf_id); 4601 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4602 if ((SCTP_BASE_SYSCTL(sctp_output_unlocked)) && (so_locked)) { 4603 atomic_add_int(&stcb->asoc.refcnt, 1); 4604 SCTP_TCB_UNLOCK(stcb); 4605 SCTP_SOCKET_LOCK(so, 0); 4606 SCTP_TCB_LOCK(stcb); 4607 atomic_subtract_int(&stcb->asoc.refcnt, 1); 4608 } 4609 #endif 4610 if (net) { 4611 /* for link local this must be done */ 4612 sin6->sin6_scope_id = prev_scope; 4613 sin6->sin6_port = prev_port; 4614 } 4615 SCTPDBG(SCTP_DEBUG_OUTPUT3, "return from send is %d\n", ret); 4616 SCTP_STAT_INCR(sctps_sendpackets); 4617 SCTP_STAT_INCR_COUNTER64(sctps_outpackets); 4618 if (ret) { 4619 SCTP_STAT_INCR(sctps_senderrors); 4620 } 4621 if (net == NULL) { 4622 /* Now if we had a temp route free it */ 4623 RO_RTFREE(ro); 4624 } else { 4625 /* 4626 * PMTU check versus smallest asoc MTU goes 4627 * here 4628 */ 4629 if (ro->ro_rt == NULL) { 4630 /* Route was freed */ 4631 if (net->ro._s_addr && 4632 net->src_addr_selected) { 4633 sctp_free_ifa(net->ro._s_addr); 4634 net->ro._s_addr = NULL; 4635 } 4636 net->src_addr_selected = 0; 4637 } 4638 if ((ro->ro_rt != NULL) && 4639 (net->ro._s_addr)) { 4640 uint32_t mtu; 4641 4642 mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, ro->ro_rt); 4643 if (mtu > 0) { 4644 if (net->port) { 4645 mtu -= sizeof(struct udphdr); 4646 } 4647 if ((stcb != NULL) && (stcb->asoc.smallest_mtu > mtu)) { 4648 sctp_mtu_size_reset(inp, &stcb->asoc, mtu); 4649 } 4650 net->mtu = mtu; 4651 } 4652 } else if (ifp) { 4653 if (ND_IFINFO(ifp)->linkmtu && 4654 (stcb->asoc.smallest_mtu > ND_IFINFO(ifp)->linkmtu)) { 4655 sctp_mtu_size_reset(inp, 4656 &stcb->asoc, 4657 ND_IFINFO(ifp)->linkmtu); 4658 } 4659 } 4660 } 4661 return (ret); 4662 } 4663 #endif 4664 default: 4665 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Unknown protocol (TSNH) type %d\n", 4666 ((struct sockaddr *)to)->sa_family); 4667 sctp_m_freem(m); 4668 SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EFAULT); 4669 return (EFAULT); 4670 } 4671 } 4672 4673 4674 void 4675 sctp_send_initiate(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int so_locked 4676 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 4677 SCTP_UNUSED 4678 #endif 4679 ) 4680 { 4681 struct mbuf *m, *m_last; 4682 struct sctp_nets *net; 4683 struct sctp_init_chunk *init; 4684 struct sctp_supported_addr_param *sup_addr; 4685 struct sctp_adaptation_layer_indication *ali; 4686 struct sctp_supported_chunk_types_param *pr_supported; 4687 struct sctp_paramhdr *ph; 4688 int cnt_inits_to = 0; 4689 int error; 4690 uint16_t num_ext, chunk_len, padding_len, parameter_len; 4691 4692 /* INIT's always go to the primary (and usually ONLY address) */ 4693 net = stcb->asoc.primary_destination; 4694 if (net == NULL) { 4695 net = TAILQ_FIRST(&stcb->asoc.nets); 4696 if (net == NULL) { 4697 /* TSNH */ 4698 return; 4699 } 4700 /* we confirm any address we send an INIT to */ 4701 net->dest_state &= ~SCTP_ADDR_UNCONFIRMED; 4702 (void)sctp_set_primary_addr(stcb, NULL, net); 4703 } else { 4704 /* we confirm any address we send an INIT to */ 4705 net->dest_state &= ~SCTP_ADDR_UNCONFIRMED; 4706 } 4707 SCTPDBG(SCTP_DEBUG_OUTPUT4, "Sending INIT\n"); 4708 #ifdef INET6 4709 if (net->ro._l_addr.sa.sa_family == AF_INET6) { 4710 /* 4711 * special hook, if we are sending to link local it will not 4712 * show up in our private address count. 4713 */ 4714 if (IN6_IS_ADDR_LINKLOCAL(&net->ro._l_addr.sin6.sin6_addr)) 4715 cnt_inits_to = 1; 4716 } 4717 #endif 4718 if (SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { 4719 /* This case should not happen */ 4720 SCTPDBG(SCTP_DEBUG_OUTPUT4, "Sending INIT - failed timer?\n"); 4721 return; 4722 } 4723 /* start the INIT timer */ 4724 sctp_timer_start(SCTP_TIMER_TYPE_INIT, inp, stcb, net); 4725 4726 m = sctp_get_mbuf_for_msg(MCLBYTES, 1, M_NOWAIT, 1, MT_DATA); 4727 if (m == NULL) { 4728 /* No memory, INIT timer will re-attempt. */ 4729 SCTPDBG(SCTP_DEBUG_OUTPUT4, "Sending INIT - mbuf?\n"); 4730 return; 4731 } 4732 chunk_len = (uint16_t)sizeof(struct sctp_init_chunk); 4733 padding_len = 0; 4734 /* Now lets put the chunk header in place */ 4735 init = mtod(m, struct sctp_init_chunk *); 4736 /* now the chunk header */ 4737 init->ch.chunk_type = SCTP_INITIATION; 4738 init->ch.chunk_flags = 0; 4739 /* fill in later from mbuf we build */ 4740 init->ch.chunk_length = 0; 4741 /* place in my tag */ 4742 init->init.initiate_tag = htonl(stcb->asoc.my_vtag); 4743 /* set up some of the credits. */ 4744 init->init.a_rwnd = htonl(max(inp->sctp_socket ? SCTP_SB_LIMIT_RCV(inp->sctp_socket) : 0, 4745 SCTP_MINIMAL_RWND)); 4746 init->init.num_outbound_streams = htons(stcb->asoc.pre_open_streams); 4747 init->init.num_inbound_streams = htons(stcb->asoc.max_inbound_streams); 4748 init->init.initial_tsn = htonl(stcb->asoc.init_seq_number); 4749 4750 /* Adaptation layer indication parameter */ 4751 if (inp->sctp_ep.adaptation_layer_indicator_provided) { 4752 parameter_len = (uint16_t)sizeof(struct sctp_adaptation_layer_indication); 4753 ali = (struct sctp_adaptation_layer_indication *)(mtod(m, caddr_t)+chunk_len); 4754 ali->ph.param_type = htons(SCTP_ULP_ADAPTATION); 4755 ali->ph.param_length = htons(parameter_len); 4756 ali->indication = htonl(inp->sctp_ep.adaptation_layer_indicator); 4757 chunk_len += parameter_len; 4758 } 4759 /* ECN parameter */ 4760 if (stcb->asoc.ecn_supported == 1) { 4761 parameter_len = (uint16_t)sizeof(struct sctp_paramhdr); 4762 ph = (struct sctp_paramhdr *)(mtod(m, caddr_t)+chunk_len); 4763 ph->param_type = htons(SCTP_ECN_CAPABLE); 4764 ph->param_length = htons(parameter_len); 4765 chunk_len += parameter_len; 4766 } 4767 /* PR-SCTP supported parameter */ 4768 if (stcb->asoc.prsctp_supported == 1) { 4769 parameter_len = (uint16_t)sizeof(struct sctp_paramhdr); 4770 ph = (struct sctp_paramhdr *)(mtod(m, caddr_t)+chunk_len); 4771 ph->param_type = htons(SCTP_PRSCTP_SUPPORTED); 4772 ph->param_length = htons(parameter_len); 4773 chunk_len += parameter_len; 4774 } 4775 /* Add NAT friendly parameter. */ 4776 if (SCTP_BASE_SYSCTL(sctp_inits_include_nat_friendly)) { 4777 parameter_len = (uint16_t)sizeof(struct sctp_paramhdr); 4778 ph = (struct sctp_paramhdr *)(mtod(m, caddr_t)+chunk_len); 4779 ph->param_type = htons(SCTP_HAS_NAT_SUPPORT); 4780 ph->param_length = htons(parameter_len); 4781 chunk_len += parameter_len; 4782 } 4783 /* And now tell the peer which extensions we support */ 4784 num_ext = 0; 4785 pr_supported = (struct sctp_supported_chunk_types_param *)(mtod(m, caddr_t)+chunk_len); 4786 if (stcb->asoc.prsctp_supported == 1) { 4787 pr_supported->chunk_types[num_ext++] = SCTP_FORWARD_CUM_TSN; 4788 if (stcb->asoc.idata_supported) { 4789 pr_supported->chunk_types[num_ext++] = SCTP_IFORWARD_CUM_TSN; 4790 } 4791 } 4792 if (stcb->asoc.auth_supported == 1) { 4793 pr_supported->chunk_types[num_ext++] = SCTP_AUTHENTICATION; 4794 } 4795 if (stcb->asoc.asconf_supported == 1) { 4796 pr_supported->chunk_types[num_ext++] = SCTP_ASCONF; 4797 pr_supported->chunk_types[num_ext++] = SCTP_ASCONF_ACK; 4798 } 4799 if (stcb->asoc.reconfig_supported == 1) { 4800 pr_supported->chunk_types[num_ext++] = SCTP_STREAM_RESET; 4801 } 4802 if (stcb->asoc.idata_supported) { 4803 pr_supported->chunk_types[num_ext++] = SCTP_IDATA; 4804 } 4805 if (stcb->asoc.nrsack_supported == 1) { 4806 pr_supported->chunk_types[num_ext++] = SCTP_NR_SELECTIVE_ACK; 4807 } 4808 if (stcb->asoc.pktdrop_supported == 1) { 4809 pr_supported->chunk_types[num_ext++] = SCTP_PACKET_DROPPED; 4810 } 4811 if (num_ext > 0) { 4812 parameter_len = (uint16_t)sizeof(struct sctp_supported_chunk_types_param) + num_ext; 4813 pr_supported->ph.param_type = htons(SCTP_SUPPORTED_CHUNK_EXT); 4814 pr_supported->ph.param_length = htons(parameter_len); 4815 padding_len = SCTP_SIZE32(parameter_len) - parameter_len; 4816 chunk_len += parameter_len; 4817 } 4818 /* add authentication parameters */ 4819 if (stcb->asoc.auth_supported) { 4820 /* attach RANDOM parameter, if available */ 4821 if (stcb->asoc.authinfo.random != NULL) { 4822 struct sctp_auth_random *randp; 4823 4824 if (padding_len > 0) { 4825 memset(mtod(m, caddr_t)+chunk_len, 0, padding_len); 4826 chunk_len += padding_len; 4827 padding_len = 0; 4828 } 4829 randp = (struct sctp_auth_random *)(mtod(m, caddr_t)+chunk_len); 4830 parameter_len = (uint16_t)sizeof(struct sctp_auth_random) + stcb->asoc.authinfo.random_len; 4831 /* random key already contains the header */ 4832 memcpy(randp, stcb->asoc.authinfo.random->key, parameter_len); 4833 padding_len = SCTP_SIZE32(parameter_len) - parameter_len; 4834 chunk_len += parameter_len; 4835 } 4836 /* add HMAC_ALGO parameter */ 4837 if (stcb->asoc.local_hmacs != NULL) { 4838 struct sctp_auth_hmac_algo *hmacs; 4839 4840 if (padding_len > 0) { 4841 memset(mtod(m, caddr_t)+chunk_len, 0, padding_len); 4842 chunk_len += padding_len; 4843 padding_len = 0; 4844 } 4845 hmacs = (struct sctp_auth_hmac_algo *)(mtod(m, caddr_t)+chunk_len); 4846 parameter_len = (uint16_t)(sizeof(struct sctp_auth_hmac_algo) + 4847 stcb->asoc.local_hmacs->num_algo * sizeof(uint16_t)); 4848 hmacs->ph.param_type = htons(SCTP_HMAC_LIST); 4849 hmacs->ph.param_length = htons(parameter_len); 4850 sctp_serialize_hmaclist(stcb->asoc.local_hmacs, (uint8_t *)hmacs->hmac_ids); 4851 padding_len = SCTP_SIZE32(parameter_len) - parameter_len; 4852 chunk_len += parameter_len; 4853 } 4854 /* add CHUNKS parameter */ 4855 if (stcb->asoc.local_auth_chunks != NULL) { 4856 struct sctp_auth_chunk_list *chunks; 4857 4858 if (padding_len > 0) { 4859 memset(mtod(m, caddr_t)+chunk_len, 0, padding_len); 4860 chunk_len += padding_len; 4861 padding_len = 0; 4862 } 4863 chunks = (struct sctp_auth_chunk_list *)(mtod(m, caddr_t)+chunk_len); 4864 parameter_len = (uint16_t)(sizeof(struct sctp_auth_chunk_list) + 4865 sctp_auth_get_chklist_size(stcb->asoc.local_auth_chunks)); 4866 chunks->ph.param_type = htons(SCTP_CHUNK_LIST); 4867 chunks->ph.param_length = htons(parameter_len); 4868 sctp_serialize_auth_chunks(stcb->asoc.local_auth_chunks, chunks->chunk_types); 4869 padding_len = SCTP_SIZE32(parameter_len) - parameter_len; 4870 chunk_len += parameter_len; 4871 } 4872 } 4873 /* now any cookie time extensions */ 4874 if (stcb->asoc.cookie_preserve_req) { 4875 struct sctp_cookie_perserve_param *cookie_preserve; 4876 4877 if (padding_len > 0) { 4878 memset(mtod(m, caddr_t)+chunk_len, 0, padding_len); 4879 chunk_len += padding_len; 4880 padding_len = 0; 4881 } 4882 parameter_len = (uint16_t)sizeof(struct sctp_cookie_perserve_param); 4883 cookie_preserve = (struct sctp_cookie_perserve_param *)(mtod(m, caddr_t)+chunk_len); 4884 cookie_preserve->ph.param_type = htons(SCTP_COOKIE_PRESERVE); 4885 cookie_preserve->ph.param_length = htons(parameter_len); 4886 cookie_preserve->time = htonl(stcb->asoc.cookie_preserve_req); 4887 stcb->asoc.cookie_preserve_req = 0; 4888 chunk_len += parameter_len; 4889 } 4890 if (stcb->asoc.scope.ipv4_addr_legal || stcb->asoc.scope.ipv6_addr_legal) { 4891 uint8_t i; 4892 4893 if (padding_len > 0) { 4894 memset(mtod(m, caddr_t)+chunk_len, 0, padding_len); 4895 chunk_len += padding_len; 4896 padding_len = 0; 4897 } 4898 parameter_len = (uint16_t)sizeof(struct sctp_paramhdr); 4899 if (stcb->asoc.scope.ipv4_addr_legal) { 4900 parameter_len += (uint16_t)sizeof(uint16_t); 4901 } 4902 if (stcb->asoc.scope.ipv6_addr_legal) { 4903 parameter_len += (uint16_t)sizeof(uint16_t); 4904 } 4905 sup_addr = (struct sctp_supported_addr_param *)(mtod(m, caddr_t)+chunk_len); 4906 sup_addr->ph.param_type = htons(SCTP_SUPPORTED_ADDRTYPE); 4907 sup_addr->ph.param_length = htons(parameter_len); 4908 i = 0; 4909 if (stcb->asoc.scope.ipv4_addr_legal) { 4910 sup_addr->addr_type[i++] = htons(SCTP_IPV4_ADDRESS); 4911 } 4912 if (stcb->asoc.scope.ipv6_addr_legal) { 4913 sup_addr->addr_type[i++] = htons(SCTP_IPV6_ADDRESS); 4914 } 4915 padding_len = 4 - 2 * i; 4916 chunk_len += parameter_len; 4917 } 4918 SCTP_BUF_LEN(m) = chunk_len; 4919 /* now the addresses */ 4920 /* 4921 * To optimize this we could put the scoping stuff into a structure 4922 * and remove the individual uint8's from the assoc structure. Then 4923 * we could just sifa in the address within the stcb. But for now 4924 * this is a quick hack to get the address stuff teased apart. 4925 */ 4926 m_last = sctp_add_addresses_to_i_ia(inp, stcb, &stcb->asoc.scope, 4927 m, cnt_inits_to, 4928 &padding_len, &chunk_len); 4929 4930 init->ch.chunk_length = htons(chunk_len); 4931 if (padding_len > 0) { 4932 if (sctp_add_pad_tombuf(m_last, padding_len) == NULL) { 4933 sctp_m_freem(m); 4934 return; 4935 } 4936 } 4937 SCTPDBG(SCTP_DEBUG_OUTPUT4, "Sending INIT - calls lowlevel_output\n"); 4938 if ((error = sctp_lowlevel_chunk_output(inp, stcb, net, 4939 (struct sockaddr *)&net->ro._l_addr, 4940 m, 0, NULL, 0, 0, 0, 0, 4941 inp->sctp_lport, stcb->rport, htonl(0), 4942 net->port, NULL, 4943 0, 0, 4944 so_locked))) { 4945 SCTPDBG(SCTP_DEBUG_OUTPUT4, "Gak send error %d\n", error); 4946 if (error == ENOBUFS) { 4947 stcb->asoc.ifp_had_enobuf = 1; 4948 SCTP_STAT_INCR(sctps_lowlevelerr); 4949 } 4950 } else { 4951 stcb->asoc.ifp_had_enobuf = 0; 4952 } 4953 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 4954 (void)SCTP_GETTIME_TIMEVAL(&net->last_sent_time); 4955 } 4956 4957 struct mbuf * 4958 sctp_arethere_unrecognized_parameters(struct mbuf *in_initpkt, 4959 int param_offset, int *abort_processing, struct sctp_chunkhdr *cp, int *nat_friendly) 4960 { 4961 /* 4962 * Given a mbuf containing an INIT or INIT-ACK with the param_offset 4963 * being equal to the beginning of the params i.e. (iphlen + 4964 * sizeof(struct sctp_init_msg) parse through the parameters to the 4965 * end of the mbuf verifying that all parameters are known. 4966 * 4967 * For unknown parameters build and return a mbuf with 4968 * UNRECOGNIZED_PARAMETER errors. If the flags indicate to stop 4969 * processing this chunk stop, and set *abort_processing to 1. 4970 * 4971 * By having param_offset be pre-set to where parameters begin it is 4972 * hoped that this routine may be reused in the future by new 4973 * features. 4974 */ 4975 struct sctp_paramhdr *phdr, params; 4976 4977 struct mbuf *mat, *op_err; 4978 char tempbuf[SCTP_PARAM_BUFFER_SIZE]; 4979 int at, limit, pad_needed; 4980 uint16_t ptype, plen, padded_size; 4981 int err_at; 4982 4983 *abort_processing = 0; 4984 mat = in_initpkt; 4985 err_at = 0; 4986 limit = ntohs(cp->chunk_length) - sizeof(struct sctp_init_chunk); 4987 at = param_offset; 4988 op_err = NULL; 4989 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Check for unrecognized param's\n"); 4990 phdr = sctp_get_next_param(mat, at, ¶ms, sizeof(params)); 4991 while ((phdr != NULL) && ((size_t)limit >= sizeof(struct sctp_paramhdr))) { 4992 ptype = ntohs(phdr->param_type); 4993 plen = ntohs(phdr->param_length); 4994 if ((plen > limit) || (plen < sizeof(struct sctp_paramhdr))) { 4995 /* wacked parameter */ 4996 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error %d\n", plen); 4997 goto invalid_size; 4998 } 4999 limit -= SCTP_SIZE32(plen); 5000 /*- 5001 * All parameters for all chunks that we know/understand are 5002 * listed here. We process them other places and make 5003 * appropriate stop actions per the upper bits. However this 5004 * is the generic routine processor's can call to get back 5005 * an operr.. to either incorporate (init-ack) or send. 5006 */ 5007 padded_size = SCTP_SIZE32(plen); 5008 switch (ptype) { 5009 /* Param's with variable size */ 5010 case SCTP_HEARTBEAT_INFO: 5011 case SCTP_STATE_COOKIE: 5012 case SCTP_UNRECOG_PARAM: 5013 case SCTP_ERROR_CAUSE_IND: 5014 /* ok skip fwd */ 5015 at += padded_size; 5016 break; 5017 /* Param's with variable size within a range */ 5018 case SCTP_CHUNK_LIST: 5019 case SCTP_SUPPORTED_CHUNK_EXT: 5020 if (padded_size > (sizeof(struct sctp_supported_chunk_types_param) + (sizeof(uint8_t) * SCTP_MAX_SUPPORTED_EXT))) { 5021 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error chklist %d\n", plen); 5022 goto invalid_size; 5023 } 5024 at += padded_size; 5025 break; 5026 case SCTP_SUPPORTED_ADDRTYPE: 5027 if (padded_size > SCTP_MAX_ADDR_PARAMS_SIZE) { 5028 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error supaddrtype %d\n", plen); 5029 goto invalid_size; 5030 } 5031 at += padded_size; 5032 break; 5033 case SCTP_RANDOM: 5034 if (padded_size > (sizeof(struct sctp_auth_random) + SCTP_RANDOM_MAX_SIZE)) { 5035 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error random %d\n", plen); 5036 goto invalid_size; 5037 } 5038 at += padded_size; 5039 break; 5040 case SCTP_SET_PRIM_ADDR: 5041 case SCTP_DEL_IP_ADDRESS: 5042 case SCTP_ADD_IP_ADDRESS: 5043 if ((padded_size != sizeof(struct sctp_asconf_addrv4_param)) && 5044 (padded_size != sizeof(struct sctp_asconf_addr_param))) { 5045 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error setprim %d\n", plen); 5046 goto invalid_size; 5047 } 5048 at += padded_size; 5049 break; 5050 /* Param's with a fixed size */ 5051 case SCTP_IPV4_ADDRESS: 5052 if (padded_size != sizeof(struct sctp_ipv4addr_param)) { 5053 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error ipv4 addr %d\n", plen); 5054 goto invalid_size; 5055 } 5056 at += padded_size; 5057 break; 5058 case SCTP_IPV6_ADDRESS: 5059 if (padded_size != sizeof(struct sctp_ipv6addr_param)) { 5060 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error ipv6 addr %d\n", plen); 5061 goto invalid_size; 5062 } 5063 at += padded_size; 5064 break; 5065 case SCTP_COOKIE_PRESERVE: 5066 if (padded_size != sizeof(struct sctp_cookie_perserve_param)) { 5067 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error cookie-preserve %d\n", plen); 5068 goto invalid_size; 5069 } 5070 at += padded_size; 5071 break; 5072 case SCTP_HAS_NAT_SUPPORT: 5073 *nat_friendly = 1; 5074 /* fall through */ 5075 case SCTP_PRSCTP_SUPPORTED: 5076 if (padded_size != sizeof(struct sctp_paramhdr)) { 5077 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error prsctp/nat support %d\n", plen); 5078 goto invalid_size; 5079 } 5080 at += padded_size; 5081 break; 5082 case SCTP_ECN_CAPABLE: 5083 if (padded_size != sizeof(struct sctp_paramhdr)) { 5084 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error ecn %d\n", plen); 5085 goto invalid_size; 5086 } 5087 at += padded_size; 5088 break; 5089 case SCTP_ULP_ADAPTATION: 5090 if (padded_size != sizeof(struct sctp_adaptation_layer_indication)) { 5091 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error adapatation %d\n", plen); 5092 goto invalid_size; 5093 } 5094 at += padded_size; 5095 break; 5096 case SCTP_SUCCESS_REPORT: 5097 if (padded_size != sizeof(struct sctp_asconf_paramhdr)) { 5098 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error success %d\n", plen); 5099 goto invalid_size; 5100 } 5101 at += padded_size; 5102 break; 5103 case SCTP_HOSTNAME_ADDRESS: 5104 { 5105 /* We can NOT handle HOST NAME addresses!! */ 5106 int l_len; 5107 5108 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Can't handle hostname addresses.. abort processing\n"); 5109 *abort_processing = 1; 5110 if (op_err == NULL) { 5111 /* Ok need to try to get a mbuf */ 5112 #ifdef INET6 5113 l_len = SCTP_MIN_OVERHEAD; 5114 #else 5115 l_len = SCTP_MIN_V4_OVERHEAD; 5116 #endif 5117 l_len += sizeof(struct sctp_chunkhdr); 5118 l_len += plen; 5119 l_len += sizeof(struct sctp_paramhdr); 5120 op_err = sctp_get_mbuf_for_msg(l_len, 0, M_NOWAIT, 1, MT_DATA); 5121 if (op_err) { 5122 SCTP_BUF_LEN(op_err) = 0; 5123 /* 5124 * pre-reserve space for ip 5125 * and sctp header and 5126 * chunk hdr 5127 */ 5128 #ifdef INET6 5129 SCTP_BUF_RESV_UF(op_err, sizeof(struct ip6_hdr)); 5130 #else 5131 SCTP_BUF_RESV_UF(op_err, sizeof(struct ip)); 5132 #endif 5133 SCTP_BUF_RESV_UF(op_err, sizeof(struct sctphdr)); 5134 SCTP_BUF_RESV_UF(op_err, sizeof(struct sctp_chunkhdr)); 5135 } 5136 } 5137 if (op_err) { 5138 /* If we have space */ 5139 struct sctp_paramhdr s; 5140 5141 if (err_at % 4) { 5142 uint32_t cpthis = 0; 5143 5144 pad_needed = 4 - (err_at % 4); 5145 m_copyback(op_err, err_at, pad_needed, (caddr_t)&cpthis); 5146 err_at += pad_needed; 5147 } 5148 s.param_type = htons(SCTP_CAUSE_UNRESOLVABLE_ADDR); 5149 s.param_length = htons(sizeof(s) + plen); 5150 m_copyback(op_err, err_at, sizeof(s), (caddr_t)&s); 5151 err_at += sizeof(s); 5152 if (plen > sizeof(tempbuf)) { 5153 plen = sizeof(tempbuf); 5154 } 5155 phdr = sctp_get_next_param(mat, at, (struct sctp_paramhdr *)tempbuf, plen); 5156 if (phdr == NULL) { 5157 sctp_m_freem(op_err); 5158 /* 5159 * we are out of memory but 5160 * we still need to have a 5161 * look at what to do (the 5162 * system is in trouble 5163 * though). 5164 */ 5165 return (NULL); 5166 } 5167 m_copyback(op_err, err_at, plen, (caddr_t)phdr); 5168 } 5169 return (op_err); 5170 break; 5171 } 5172 default: 5173 /* 5174 * we do not recognize the parameter figure out what 5175 * we do. 5176 */ 5177 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Hit default param %x\n", ptype); 5178 if ((ptype & 0x4000) == 0x4000) { 5179 /* Report bit is set?? */ 5180 SCTPDBG(SCTP_DEBUG_OUTPUT1, "report op err\n"); 5181 if (op_err == NULL) { 5182 int l_len; 5183 5184 /* Ok need to try to get an mbuf */ 5185 #ifdef INET6 5186 l_len = SCTP_MIN_OVERHEAD; 5187 #else 5188 l_len = SCTP_MIN_V4_OVERHEAD; 5189 #endif 5190 l_len += sizeof(struct sctp_chunkhdr); 5191 l_len += plen; 5192 l_len += sizeof(struct sctp_paramhdr); 5193 op_err = sctp_get_mbuf_for_msg(l_len, 0, M_NOWAIT, 1, MT_DATA); 5194 if (op_err) { 5195 SCTP_BUF_LEN(op_err) = 0; 5196 #ifdef INET6 5197 SCTP_BUF_RESV_UF(op_err, sizeof(struct ip6_hdr)); 5198 #else 5199 SCTP_BUF_RESV_UF(op_err, sizeof(struct ip)); 5200 #endif 5201 SCTP_BUF_RESV_UF(op_err, sizeof(struct sctphdr)); 5202 SCTP_BUF_RESV_UF(op_err, sizeof(struct sctp_chunkhdr)); 5203 } 5204 } 5205 if (op_err) { 5206 /* If we have space */ 5207 struct sctp_paramhdr s; 5208 5209 if (err_at % 4) { 5210 uint32_t cpthis = 0; 5211 5212 pad_needed = 4 - (err_at % 4); 5213 m_copyback(op_err, err_at, pad_needed, (caddr_t)&cpthis); 5214 err_at += pad_needed; 5215 } 5216 s.param_type = htons(SCTP_UNRECOG_PARAM); 5217 s.param_length = htons(sizeof(s) + plen); 5218 m_copyback(op_err, err_at, sizeof(s), (caddr_t)&s); 5219 err_at += sizeof(s); 5220 if (plen > sizeof(tempbuf)) { 5221 plen = sizeof(tempbuf); 5222 } 5223 phdr = sctp_get_next_param(mat, at, (struct sctp_paramhdr *)tempbuf, plen); 5224 if (phdr == NULL) { 5225 sctp_m_freem(op_err); 5226 /* 5227 * we are out of memory but 5228 * we still need to have a 5229 * look at what to do (the 5230 * system is in trouble 5231 * though). 5232 */ 5233 op_err = NULL; 5234 goto more_processing; 5235 } 5236 m_copyback(op_err, err_at, plen, (caddr_t)phdr); 5237 err_at += plen; 5238 } 5239 } 5240 more_processing: 5241 if ((ptype & 0x8000) == 0x0000) { 5242 SCTPDBG(SCTP_DEBUG_OUTPUT1, "stop proc\n"); 5243 return (op_err); 5244 } else { 5245 /* skip this chunk and continue processing */ 5246 SCTPDBG(SCTP_DEBUG_OUTPUT1, "move on\n"); 5247 at += SCTP_SIZE32(plen); 5248 } 5249 break; 5250 5251 } 5252 phdr = sctp_get_next_param(mat, at, ¶ms, sizeof(params)); 5253 } 5254 return (op_err); 5255 invalid_size: 5256 SCTPDBG(SCTP_DEBUG_OUTPUT1, "abort flag set\n"); 5257 *abort_processing = 1; 5258 if ((op_err == NULL) && phdr) { 5259 int l_len; 5260 #ifdef INET6 5261 l_len = SCTP_MIN_OVERHEAD; 5262 #else 5263 l_len = SCTP_MIN_V4_OVERHEAD; 5264 #endif 5265 l_len += sizeof(struct sctp_chunkhdr); 5266 l_len += (2 * sizeof(struct sctp_paramhdr)); 5267 op_err = sctp_get_mbuf_for_msg(l_len, 0, M_NOWAIT, 1, MT_DATA); 5268 if (op_err) { 5269 SCTP_BUF_LEN(op_err) = 0; 5270 #ifdef INET6 5271 SCTP_BUF_RESV_UF(op_err, sizeof(struct ip6_hdr)); 5272 #else 5273 SCTP_BUF_RESV_UF(op_err, sizeof(struct ip)); 5274 #endif 5275 SCTP_BUF_RESV_UF(op_err, sizeof(struct sctphdr)); 5276 SCTP_BUF_RESV_UF(op_err, sizeof(struct sctp_chunkhdr)); 5277 } 5278 } 5279 if ((op_err) && phdr) { 5280 struct sctp_paramhdr s; 5281 5282 if (err_at % 4) { 5283 uint32_t cpthis = 0; 5284 5285 pad_needed = 4 - (err_at % 4); 5286 m_copyback(op_err, err_at, pad_needed, (caddr_t)&cpthis); 5287 err_at += pad_needed; 5288 } 5289 s.param_type = htons(SCTP_CAUSE_PROTOCOL_VIOLATION); 5290 s.param_length = htons(sizeof(s) + sizeof(struct sctp_paramhdr)); 5291 m_copyback(op_err, err_at, sizeof(s), (caddr_t)&s); 5292 err_at += sizeof(s); 5293 /* Only copy back the p-hdr that caused the issue */ 5294 m_copyback(op_err, err_at, sizeof(struct sctp_paramhdr), (caddr_t)phdr); 5295 } 5296 return (op_err); 5297 } 5298 5299 static int 5300 sctp_are_there_new_addresses(struct sctp_association *asoc, 5301 struct mbuf *in_initpkt, int offset, struct sockaddr *src) 5302 { 5303 /* 5304 * Given a INIT packet, look through the packet to verify that there 5305 * are NO new addresses. As we go through the parameters add reports 5306 * of any un-understood parameters that require an error. Also we 5307 * must return (1) to drop the packet if we see a un-understood 5308 * parameter that tells us to drop the chunk. 5309 */ 5310 struct sockaddr *sa_touse; 5311 struct sockaddr *sa; 5312 struct sctp_paramhdr *phdr, params; 5313 uint16_t ptype, plen; 5314 uint8_t fnd; 5315 struct sctp_nets *net; 5316 int check_src; 5317 #ifdef INET 5318 struct sockaddr_in sin4, *sa4; 5319 #endif 5320 #ifdef INET6 5321 struct sockaddr_in6 sin6, *sa6; 5322 #endif 5323 5324 #ifdef INET 5325 memset(&sin4, 0, sizeof(sin4)); 5326 sin4.sin_family = AF_INET; 5327 sin4.sin_len = sizeof(sin4); 5328 #endif 5329 #ifdef INET6 5330 memset(&sin6, 0, sizeof(sin6)); 5331 sin6.sin6_family = AF_INET6; 5332 sin6.sin6_len = sizeof(sin6); 5333 #endif 5334 /* First what about the src address of the pkt ? */ 5335 check_src = 0; 5336 switch (src->sa_family) { 5337 #ifdef INET 5338 case AF_INET: 5339 if (asoc->scope.ipv4_addr_legal) { 5340 check_src = 1; 5341 } 5342 break; 5343 #endif 5344 #ifdef INET6 5345 case AF_INET6: 5346 if (asoc->scope.ipv6_addr_legal) { 5347 check_src = 1; 5348 } 5349 break; 5350 #endif 5351 default: 5352 /* TSNH */ 5353 break; 5354 } 5355 if (check_src) { 5356 fnd = 0; 5357 TAILQ_FOREACH(net, &asoc->nets, sctp_next) { 5358 sa = (struct sockaddr *)&net->ro._l_addr; 5359 if (sa->sa_family == src->sa_family) { 5360 #ifdef INET 5361 if (sa->sa_family == AF_INET) { 5362 struct sockaddr_in *src4; 5363 5364 sa4 = (struct sockaddr_in *)sa; 5365 src4 = (struct sockaddr_in *)src; 5366 if (sa4->sin_addr.s_addr == src4->sin_addr.s_addr) { 5367 fnd = 1; 5368 break; 5369 } 5370 } 5371 #endif 5372 #ifdef INET6 5373 if (sa->sa_family == AF_INET6) { 5374 struct sockaddr_in6 *src6; 5375 5376 sa6 = (struct sockaddr_in6 *)sa; 5377 src6 = (struct sockaddr_in6 *)src; 5378 if (SCTP6_ARE_ADDR_EQUAL(sa6, src6)) { 5379 fnd = 1; 5380 break; 5381 } 5382 } 5383 #endif 5384 } 5385 } 5386 if (fnd == 0) { 5387 /* New address added! no need to look further. */ 5388 return (1); 5389 } 5390 } 5391 /* Ok so far lets munge through the rest of the packet */ 5392 offset += sizeof(struct sctp_init_chunk); 5393 phdr = sctp_get_next_param(in_initpkt, offset, ¶ms, sizeof(params)); 5394 while (phdr) { 5395 sa_touse = NULL; 5396 ptype = ntohs(phdr->param_type); 5397 plen = ntohs(phdr->param_length); 5398 switch (ptype) { 5399 #ifdef INET 5400 case SCTP_IPV4_ADDRESS: 5401 { 5402 struct sctp_ipv4addr_param *p4, p4_buf; 5403 5404 if (plen != sizeof(struct sctp_ipv4addr_param)) { 5405 return (1); 5406 } 5407 phdr = sctp_get_next_param(in_initpkt, offset, 5408 (struct sctp_paramhdr *)&p4_buf, sizeof(p4_buf)); 5409 if (phdr == NULL) { 5410 return (1); 5411 } 5412 if (asoc->scope.ipv4_addr_legal) { 5413 p4 = (struct sctp_ipv4addr_param *)phdr; 5414 sin4.sin_addr.s_addr = p4->addr; 5415 sa_touse = (struct sockaddr *)&sin4; 5416 } 5417 break; 5418 } 5419 #endif 5420 #ifdef INET6 5421 case SCTP_IPV6_ADDRESS: 5422 { 5423 struct sctp_ipv6addr_param *p6, p6_buf; 5424 5425 if (plen != sizeof(struct sctp_ipv6addr_param)) { 5426 return (1); 5427 } 5428 phdr = sctp_get_next_param(in_initpkt, offset, 5429 (struct sctp_paramhdr *)&p6_buf, sizeof(p6_buf)); 5430 if (phdr == NULL) { 5431 return (1); 5432 } 5433 if (asoc->scope.ipv6_addr_legal) { 5434 p6 = (struct sctp_ipv6addr_param *)phdr; 5435 memcpy((caddr_t)&sin6.sin6_addr, p6->addr, 5436 sizeof(p6->addr)); 5437 sa_touse = (struct sockaddr *)&sin6; 5438 } 5439 break; 5440 } 5441 #endif 5442 default: 5443 sa_touse = NULL; 5444 break; 5445 } 5446 if (sa_touse) { 5447 /* ok, sa_touse points to one to check */ 5448 fnd = 0; 5449 TAILQ_FOREACH(net, &asoc->nets, sctp_next) { 5450 sa = (struct sockaddr *)&net->ro._l_addr; 5451 if (sa->sa_family != sa_touse->sa_family) { 5452 continue; 5453 } 5454 #ifdef INET 5455 if (sa->sa_family == AF_INET) { 5456 sa4 = (struct sockaddr_in *)sa; 5457 if (sa4->sin_addr.s_addr == 5458 sin4.sin_addr.s_addr) { 5459 fnd = 1; 5460 break; 5461 } 5462 } 5463 #endif 5464 #ifdef INET6 5465 if (sa->sa_family == AF_INET6) { 5466 sa6 = (struct sockaddr_in6 *)sa; 5467 if (SCTP6_ARE_ADDR_EQUAL( 5468 sa6, &sin6)) { 5469 fnd = 1; 5470 break; 5471 } 5472 } 5473 #endif 5474 } 5475 if (!fnd) { 5476 /* New addr added! no need to look further */ 5477 return (1); 5478 } 5479 } 5480 offset += SCTP_SIZE32(plen); 5481 phdr = sctp_get_next_param(in_initpkt, offset, ¶ms, sizeof(params)); 5482 } 5483 return (0); 5484 } 5485 5486 /* 5487 * Given a MBUF chain that was sent into us containing an INIT. Build a 5488 * INIT-ACK with COOKIE and send back. We assume that the in_initpkt has done 5489 * a pullup to include IPv6/4header, SCTP header and initial part of INIT 5490 * message (i.e. the struct sctp_init_msg). 5491 */ 5492 void 5493 sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb, 5494 struct sctp_nets *src_net, struct mbuf *init_pkt, 5495 int iphlen, int offset, 5496 struct sockaddr *src, struct sockaddr *dst, 5497 struct sctphdr *sh, struct sctp_init_chunk *init_chk, 5498 uint8_t mflowtype, uint32_t mflowid, 5499 uint32_t vrf_id, uint16_t port) 5500 { 5501 struct sctp_association *asoc; 5502 struct mbuf *m, *m_tmp, *m_last, *m_cookie, *op_err; 5503 struct sctp_init_ack_chunk *initack; 5504 struct sctp_adaptation_layer_indication *ali; 5505 struct sctp_supported_chunk_types_param *pr_supported; 5506 struct sctp_paramhdr *ph; 5507 union sctp_sockstore *over_addr; 5508 struct sctp_scoping scp; 5509 struct timeval now; 5510 #ifdef INET 5511 struct sockaddr_in *dst4 = (struct sockaddr_in *)dst; 5512 struct sockaddr_in *src4 = (struct sockaddr_in *)src; 5513 struct sockaddr_in *sin; 5514 #endif 5515 #ifdef INET6 5516 struct sockaddr_in6 *dst6 = (struct sockaddr_in6 *)dst; 5517 struct sockaddr_in6 *src6 = (struct sockaddr_in6 *)src; 5518 struct sockaddr_in6 *sin6; 5519 #endif 5520 struct sockaddr *to; 5521 struct sctp_state_cookie stc; 5522 struct sctp_nets *net = NULL; 5523 uint8_t *signature = NULL; 5524 int cnt_inits_to = 0; 5525 uint16_t his_limit, i_want; 5526 int abort_flag; 5527 int nat_friendly = 0; 5528 int error; 5529 struct socket *so; 5530 uint16_t num_ext, chunk_len, padding_len, parameter_len; 5531 5532 if (stcb) { 5533 asoc = &stcb->asoc; 5534 } else { 5535 asoc = NULL; 5536 } 5537 if ((asoc != NULL) && 5538 (SCTP_GET_STATE(asoc) != SCTP_STATE_COOKIE_WAIT)) { 5539 if (sctp_are_there_new_addresses(asoc, init_pkt, offset, src)) { 5540 /* 5541 * new addresses, out of here in non-cookie-wait 5542 * states 5543 * 5544 * Send an ABORT, without the new address error 5545 * cause. This looks no different than if no 5546 * listener was present. 5547 */ 5548 op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), 5549 "Address added"); 5550 sctp_send_abort(init_pkt, iphlen, src, dst, sh, 0, op_err, 5551 mflowtype, mflowid, inp->fibnum, 5552 vrf_id, port); 5553 return; 5554 } 5555 if (src_net != NULL && (src_net->port != port)) { 5556 /* 5557 * change of remote encapsulation port, out of here 5558 * in non-cookie-wait states 5559 * 5560 * Send an ABORT, without an specific error cause. 5561 * This looks no different than if no listener was 5562 * present. 5563 */ 5564 op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), 5565 "Remote encapsulation port changed"); 5566 sctp_send_abort(init_pkt, iphlen, src, dst, sh, 0, op_err, 5567 mflowtype, mflowid, inp->fibnum, 5568 vrf_id, port); 5569 return; 5570 } 5571 } 5572 abort_flag = 0; 5573 op_err = sctp_arethere_unrecognized_parameters(init_pkt, 5574 (offset + sizeof(struct sctp_init_chunk)), 5575 &abort_flag, (struct sctp_chunkhdr *)init_chk, &nat_friendly); 5576 if (abort_flag) { 5577 do_a_abort: 5578 if (op_err == NULL) { 5579 char msg[SCTP_DIAG_INFO_LEN]; 5580 5581 snprintf(msg, sizeof(msg), "%s:%d at %s", __FILE__, __LINE__, __func__); 5582 op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), 5583 msg); 5584 } 5585 sctp_send_abort(init_pkt, iphlen, src, dst, sh, 5586 init_chk->init.initiate_tag, op_err, 5587 mflowtype, mflowid, inp->fibnum, 5588 vrf_id, port); 5589 return; 5590 } 5591 m = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA); 5592 if (m == NULL) { 5593 /* No memory, INIT timer will re-attempt. */ 5594 if (op_err) 5595 sctp_m_freem(op_err); 5596 return; 5597 } 5598 chunk_len = (uint16_t)sizeof(struct sctp_init_ack_chunk); 5599 padding_len = 0; 5600 5601 /* 5602 * We might not overwrite the identification[] completely and on 5603 * some platforms time_entered will contain some padding. Therefore 5604 * zero out the cookie to avoid putting uninitialized memory on the 5605 * wire. 5606 */ 5607 memset(&stc, 0, sizeof(struct sctp_state_cookie)); 5608 5609 /* the time I built cookie */ 5610 (void)SCTP_GETTIME_TIMEVAL(&now); 5611 stc.time_entered.tv_sec = now.tv_sec; 5612 stc.time_entered.tv_usec = now.tv_usec; 5613 5614 /* populate any tie tags */ 5615 if (asoc != NULL) { 5616 /* unlock before tag selections */ 5617 stc.tie_tag_my_vtag = asoc->my_vtag_nonce; 5618 stc.tie_tag_peer_vtag = asoc->peer_vtag_nonce; 5619 stc.cookie_life = asoc->cookie_life; 5620 net = asoc->primary_destination; 5621 } else { 5622 stc.tie_tag_my_vtag = 0; 5623 stc.tie_tag_peer_vtag = 0; 5624 /* life I will award this cookie */ 5625 stc.cookie_life = inp->sctp_ep.def_cookie_life; 5626 } 5627 5628 /* copy in the ports for later check */ 5629 stc.myport = sh->dest_port; 5630 stc.peerport = sh->src_port; 5631 5632 /* 5633 * If we wanted to honor cookie life extensions, we would add to 5634 * stc.cookie_life. For now we should NOT honor any extension 5635 */ 5636 stc.site_scope = stc.local_scope = stc.loopback_scope = 0; 5637 if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { 5638 stc.ipv6_addr_legal = 1; 5639 if (SCTP_IPV6_V6ONLY(inp)) { 5640 stc.ipv4_addr_legal = 0; 5641 } else { 5642 stc.ipv4_addr_legal = 1; 5643 } 5644 } else { 5645 stc.ipv6_addr_legal = 0; 5646 stc.ipv4_addr_legal = 1; 5647 } 5648 stc.ipv4_scope = 0; 5649 if (net == NULL) { 5650 to = src; 5651 switch (dst->sa_family) { 5652 #ifdef INET 5653 case AF_INET: 5654 { 5655 /* lookup address */ 5656 stc.address[0] = src4->sin_addr.s_addr; 5657 stc.address[1] = 0; 5658 stc.address[2] = 0; 5659 stc.address[3] = 0; 5660 stc.addr_type = SCTP_IPV4_ADDRESS; 5661 /* local from address */ 5662 stc.laddress[0] = dst4->sin_addr.s_addr; 5663 stc.laddress[1] = 0; 5664 stc.laddress[2] = 0; 5665 stc.laddress[3] = 0; 5666 stc.laddr_type = SCTP_IPV4_ADDRESS; 5667 /* scope_id is only for v6 */ 5668 stc.scope_id = 0; 5669 if ((IN4_ISPRIVATE_ADDRESS(&src4->sin_addr)) || 5670 (IN4_ISPRIVATE_ADDRESS(&dst4->sin_addr))) { 5671 stc.ipv4_scope = 1; 5672 } 5673 /* Must use the address in this case */ 5674 if (sctp_is_address_on_local_host(src, vrf_id)) { 5675 stc.loopback_scope = 1; 5676 stc.ipv4_scope = 1; 5677 stc.site_scope = 1; 5678 stc.local_scope = 0; 5679 } 5680 break; 5681 } 5682 #endif 5683 #ifdef INET6 5684 case AF_INET6: 5685 { 5686 stc.addr_type = SCTP_IPV6_ADDRESS; 5687 memcpy(&stc.address, &src6->sin6_addr, sizeof(struct in6_addr)); 5688 stc.scope_id = ntohs(in6_getscope(&src6->sin6_addr)); 5689 if (sctp_is_address_on_local_host(src, vrf_id)) { 5690 stc.loopback_scope = 1; 5691 stc.local_scope = 0; 5692 stc.site_scope = 1; 5693 stc.ipv4_scope = 1; 5694 } else if (IN6_IS_ADDR_LINKLOCAL(&src6->sin6_addr) || 5695 IN6_IS_ADDR_LINKLOCAL(&dst6->sin6_addr)) { 5696 /* 5697 * If the new destination or source 5698 * is a LINK_LOCAL we must have 5699 * common both site and local scope. 5700 * Don't set local scope though 5701 * since we must depend on the 5702 * source to be added implicitly. We 5703 * cannot assure just because we 5704 * share one link that all links are 5705 * common. 5706 */ 5707 stc.local_scope = 0; 5708 stc.site_scope = 1; 5709 stc.ipv4_scope = 1; 5710 /* 5711 * we start counting for the private 5712 * address stuff at 1. since the 5713 * link local we source from won't 5714 * show up in our scoped count. 5715 */ 5716 cnt_inits_to = 1; 5717 /* 5718 * pull out the scope_id from 5719 * incoming pkt 5720 */ 5721 } else if (IN6_IS_ADDR_SITELOCAL(&src6->sin6_addr) || 5722 IN6_IS_ADDR_SITELOCAL(&dst6->sin6_addr)) { 5723 /* 5724 * If the new destination or source 5725 * is SITE_LOCAL then we must have 5726 * site scope in common. 5727 */ 5728 stc.site_scope = 1; 5729 } 5730 memcpy(&stc.laddress, &dst6->sin6_addr, sizeof(struct in6_addr)); 5731 stc.laddr_type = SCTP_IPV6_ADDRESS; 5732 break; 5733 } 5734 #endif 5735 default: 5736 /* TSNH */ 5737 goto do_a_abort; 5738 break; 5739 } 5740 } else { 5741 /* set the scope per the existing tcb */ 5742 5743 #ifdef INET6 5744 struct sctp_nets *lnet; 5745 #endif 5746 5747 stc.loopback_scope = asoc->scope.loopback_scope; 5748 stc.ipv4_scope = asoc->scope.ipv4_local_scope; 5749 stc.site_scope = asoc->scope.site_scope; 5750 stc.local_scope = asoc->scope.local_scope; 5751 #ifdef INET6 5752 /* Why do we not consider IPv4 LL addresses? */ 5753 TAILQ_FOREACH(lnet, &asoc->nets, sctp_next) { 5754 if (lnet->ro._l_addr.sin6.sin6_family == AF_INET6) { 5755 if (IN6_IS_ADDR_LINKLOCAL(&lnet->ro._l_addr.sin6.sin6_addr)) { 5756 /* 5757 * if we have a LL address, start 5758 * counting at 1. 5759 */ 5760 cnt_inits_to = 1; 5761 } 5762 } 5763 } 5764 #endif 5765 /* use the net pointer */ 5766 to = (struct sockaddr *)&net->ro._l_addr; 5767 switch (to->sa_family) { 5768 #ifdef INET 5769 case AF_INET: 5770 sin = (struct sockaddr_in *)to; 5771 stc.address[0] = sin->sin_addr.s_addr; 5772 stc.address[1] = 0; 5773 stc.address[2] = 0; 5774 stc.address[3] = 0; 5775 stc.addr_type = SCTP_IPV4_ADDRESS; 5776 if (net->src_addr_selected == 0) { 5777 /* 5778 * strange case here, the INIT should have 5779 * did the selection. 5780 */ 5781 net->ro._s_addr = sctp_source_address_selection(inp, 5782 stcb, (sctp_route_t *)&net->ro, 5783 net, 0, vrf_id); 5784 if (net->ro._s_addr == NULL) 5785 return; 5786 5787 net->src_addr_selected = 1; 5788 5789 } 5790 stc.laddress[0] = net->ro._s_addr->address.sin.sin_addr.s_addr; 5791 stc.laddress[1] = 0; 5792 stc.laddress[2] = 0; 5793 stc.laddress[3] = 0; 5794 stc.laddr_type = SCTP_IPV4_ADDRESS; 5795 /* scope_id is only for v6 */ 5796 stc.scope_id = 0; 5797 break; 5798 #endif 5799 #ifdef INET6 5800 case AF_INET6: 5801 sin6 = (struct sockaddr_in6 *)to; 5802 memcpy(&stc.address, &sin6->sin6_addr, 5803 sizeof(struct in6_addr)); 5804 stc.addr_type = SCTP_IPV6_ADDRESS; 5805 stc.scope_id = sin6->sin6_scope_id; 5806 if (net->src_addr_selected == 0) { 5807 /* 5808 * strange case here, the INIT should have 5809 * done the selection. 5810 */ 5811 net->ro._s_addr = sctp_source_address_selection(inp, 5812 stcb, (sctp_route_t *)&net->ro, 5813 net, 0, vrf_id); 5814 if (net->ro._s_addr == NULL) 5815 return; 5816 5817 net->src_addr_selected = 1; 5818 } 5819 memcpy(&stc.laddress, &net->ro._s_addr->address.sin6.sin6_addr, 5820 sizeof(struct in6_addr)); 5821 stc.laddr_type = SCTP_IPV6_ADDRESS; 5822 break; 5823 #endif 5824 } 5825 } 5826 /* Now lets put the SCTP header in place */ 5827 initack = mtod(m, struct sctp_init_ack_chunk *); 5828 /* Save it off for quick ref */ 5829 stc.peers_vtag = ntohl(init_chk->init.initiate_tag); 5830 /* who are we */ 5831 memcpy(stc.identification, SCTP_VERSION_STRING, 5832 min(strlen(SCTP_VERSION_STRING), sizeof(stc.identification))); 5833 memset(stc.reserved, 0, SCTP_RESERVE_SPACE); 5834 /* now the chunk header */ 5835 initack->ch.chunk_type = SCTP_INITIATION_ACK; 5836 initack->ch.chunk_flags = 0; 5837 /* fill in later from mbuf we build */ 5838 initack->ch.chunk_length = 0; 5839 /* place in my tag */ 5840 if ((asoc != NULL) && 5841 ((SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_WAIT) || 5842 (SCTP_GET_STATE(asoc) == SCTP_STATE_INUSE) || 5843 (SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_ECHOED))) { 5844 /* re-use the v-tags and init-seq here */ 5845 initack->init.initiate_tag = htonl(asoc->my_vtag); 5846 initack->init.initial_tsn = htonl(asoc->init_seq_number); 5847 } else { 5848 uint32_t vtag, itsn; 5849 5850 if (asoc) { 5851 atomic_add_int(&asoc->refcnt, 1); 5852 SCTP_TCB_UNLOCK(stcb); 5853 new_tag: 5854 vtag = sctp_select_a_tag(inp, inp->sctp_lport, sh->src_port, 1); 5855 if ((asoc->peer_supports_nat) && (vtag == asoc->my_vtag)) { 5856 /* 5857 * Got a duplicate vtag on some guy behind a 5858 * nat make sure we don't use it. 5859 */ 5860 goto new_tag; 5861 } 5862 initack->init.initiate_tag = htonl(vtag); 5863 /* get a TSN to use too */ 5864 itsn = sctp_select_initial_TSN(&inp->sctp_ep); 5865 initack->init.initial_tsn = htonl(itsn); 5866 SCTP_TCB_LOCK(stcb); 5867 atomic_add_int(&asoc->refcnt, -1); 5868 } else { 5869 SCTP_INP_INCR_REF(inp); 5870 SCTP_INP_RUNLOCK(inp); 5871 vtag = sctp_select_a_tag(inp, inp->sctp_lport, sh->src_port, 1); 5872 initack->init.initiate_tag = htonl(vtag); 5873 /* get a TSN to use too */ 5874 initack->init.initial_tsn = htonl(sctp_select_initial_TSN(&inp->sctp_ep)); 5875 SCTP_INP_RLOCK(inp); 5876 SCTP_INP_DECR_REF(inp); 5877 } 5878 } 5879 /* save away my tag to */ 5880 stc.my_vtag = initack->init.initiate_tag; 5881 5882 /* set up some of the credits. */ 5883 so = inp->sctp_socket; 5884 if (so == NULL) { 5885 /* memory problem */ 5886 sctp_m_freem(m); 5887 return; 5888 } else { 5889 initack->init.a_rwnd = htonl(max(SCTP_SB_LIMIT_RCV(so), SCTP_MINIMAL_RWND)); 5890 } 5891 /* set what I want */ 5892 his_limit = ntohs(init_chk->init.num_inbound_streams); 5893 /* choose what I want */ 5894 if (asoc != NULL) { 5895 if (asoc->streamoutcnt > asoc->pre_open_streams) { 5896 i_want = asoc->streamoutcnt; 5897 } else { 5898 i_want = asoc->pre_open_streams; 5899 } 5900 } else { 5901 i_want = inp->sctp_ep.pre_open_stream_count; 5902 } 5903 if (his_limit < i_want) { 5904 /* I Want more :< */ 5905 initack->init.num_outbound_streams = init_chk->init.num_inbound_streams; 5906 } else { 5907 /* I can have what I want :> */ 5908 initack->init.num_outbound_streams = htons(i_want); 5909 } 5910 /* tell him his limit. */ 5911 initack->init.num_inbound_streams = 5912 htons(inp->sctp_ep.max_open_streams_intome); 5913 5914 /* adaptation layer indication parameter */ 5915 if (inp->sctp_ep.adaptation_layer_indicator_provided) { 5916 parameter_len = (uint16_t)sizeof(struct sctp_adaptation_layer_indication); 5917 ali = (struct sctp_adaptation_layer_indication *)(mtod(m, caddr_t)+chunk_len); 5918 ali->ph.param_type = htons(SCTP_ULP_ADAPTATION); 5919 ali->ph.param_length = htons(parameter_len); 5920 ali->indication = htonl(inp->sctp_ep.adaptation_layer_indicator); 5921 chunk_len += parameter_len; 5922 } 5923 /* ECN parameter */ 5924 if (((asoc != NULL) && (asoc->ecn_supported == 1)) || 5925 ((asoc == NULL) && (inp->ecn_supported == 1))) { 5926 parameter_len = (uint16_t)sizeof(struct sctp_paramhdr); 5927 ph = (struct sctp_paramhdr *)(mtod(m, caddr_t)+chunk_len); 5928 ph->param_type = htons(SCTP_ECN_CAPABLE); 5929 ph->param_length = htons(parameter_len); 5930 chunk_len += parameter_len; 5931 } 5932 /* PR-SCTP supported parameter */ 5933 if (((asoc != NULL) && (asoc->prsctp_supported == 1)) || 5934 ((asoc == NULL) && (inp->prsctp_supported == 1))) { 5935 parameter_len = (uint16_t)sizeof(struct sctp_paramhdr); 5936 ph = (struct sctp_paramhdr *)(mtod(m, caddr_t)+chunk_len); 5937 ph->param_type = htons(SCTP_PRSCTP_SUPPORTED); 5938 ph->param_length = htons(parameter_len); 5939 chunk_len += parameter_len; 5940 } 5941 /* Add NAT friendly parameter */ 5942 if (nat_friendly) { 5943 parameter_len = (uint16_t)sizeof(struct sctp_paramhdr); 5944 ph = (struct sctp_paramhdr *)(mtod(m, caddr_t)+chunk_len); 5945 ph->param_type = htons(SCTP_HAS_NAT_SUPPORT); 5946 ph->param_length = htons(parameter_len); 5947 chunk_len += parameter_len; 5948 } 5949 /* And now tell the peer which extensions we support */ 5950 num_ext = 0; 5951 pr_supported = (struct sctp_supported_chunk_types_param *)(mtod(m, caddr_t)+chunk_len); 5952 if (((asoc != NULL) && (asoc->prsctp_supported == 1)) || 5953 ((asoc == NULL) && (inp->prsctp_supported == 1))) { 5954 pr_supported->chunk_types[num_ext++] = SCTP_FORWARD_CUM_TSN; 5955 if (((asoc != NULL) && (asoc->idata_supported == 1)) || 5956 ((asoc == NULL) && (inp->idata_supported == 1))) { 5957 pr_supported->chunk_types[num_ext++] = SCTP_IFORWARD_CUM_TSN; 5958 } 5959 } 5960 if (((asoc != NULL) && (asoc->auth_supported == 1)) || 5961 ((asoc == NULL) && (inp->auth_supported == 1))) { 5962 pr_supported->chunk_types[num_ext++] = SCTP_AUTHENTICATION; 5963 } 5964 if (((asoc != NULL) && (asoc->asconf_supported == 1)) || 5965 ((asoc == NULL) && (inp->asconf_supported == 1))) { 5966 pr_supported->chunk_types[num_ext++] = SCTP_ASCONF; 5967 pr_supported->chunk_types[num_ext++] = SCTP_ASCONF_ACK; 5968 } 5969 if (((asoc != NULL) && (asoc->reconfig_supported == 1)) || 5970 ((asoc == NULL) && (inp->reconfig_supported == 1))) { 5971 pr_supported->chunk_types[num_ext++] = SCTP_STREAM_RESET; 5972 } 5973 if (((asoc != NULL) && (asoc->idata_supported == 1)) || 5974 ((asoc == NULL) && (inp->idata_supported == 1))) { 5975 pr_supported->chunk_types[num_ext++] = SCTP_IDATA; 5976 } 5977 if (((asoc != NULL) && (asoc->nrsack_supported == 1)) || 5978 ((asoc == NULL) && (inp->nrsack_supported == 1))) { 5979 pr_supported->chunk_types[num_ext++] = SCTP_NR_SELECTIVE_ACK; 5980 } 5981 if (((asoc != NULL) && (asoc->pktdrop_supported == 1)) || 5982 ((asoc == NULL) && (inp->pktdrop_supported == 1))) { 5983 pr_supported->chunk_types[num_ext++] = SCTP_PACKET_DROPPED; 5984 } 5985 if (num_ext > 0) { 5986 parameter_len = (uint16_t)sizeof(struct sctp_supported_chunk_types_param) + num_ext; 5987 pr_supported->ph.param_type = htons(SCTP_SUPPORTED_CHUNK_EXT); 5988 pr_supported->ph.param_length = htons(parameter_len); 5989 padding_len = SCTP_SIZE32(parameter_len) - parameter_len; 5990 chunk_len += parameter_len; 5991 } 5992 /* add authentication parameters */ 5993 if (((asoc != NULL) && (asoc->auth_supported == 1)) || 5994 ((asoc == NULL) && (inp->auth_supported == 1))) { 5995 struct sctp_auth_random *randp; 5996 struct sctp_auth_hmac_algo *hmacs; 5997 struct sctp_auth_chunk_list *chunks; 5998 5999 if (padding_len > 0) { 6000 memset(mtod(m, caddr_t)+chunk_len, 0, padding_len); 6001 chunk_len += padding_len; 6002 padding_len = 0; 6003 } 6004 /* generate and add RANDOM parameter */ 6005 randp = (struct sctp_auth_random *)(mtod(m, caddr_t)+chunk_len); 6006 parameter_len = (uint16_t)sizeof(struct sctp_auth_random) + 6007 SCTP_AUTH_RANDOM_SIZE_DEFAULT; 6008 randp->ph.param_type = htons(SCTP_RANDOM); 6009 randp->ph.param_length = htons(parameter_len); 6010 SCTP_READ_RANDOM(randp->random_data, SCTP_AUTH_RANDOM_SIZE_DEFAULT); 6011 padding_len = SCTP_SIZE32(parameter_len) - parameter_len; 6012 chunk_len += parameter_len; 6013 6014 if (padding_len > 0) { 6015 memset(mtod(m, caddr_t)+chunk_len, 0, padding_len); 6016 chunk_len += padding_len; 6017 padding_len = 0; 6018 } 6019 /* add HMAC_ALGO parameter */ 6020 hmacs = (struct sctp_auth_hmac_algo *)(mtod(m, caddr_t)+chunk_len); 6021 parameter_len = (uint16_t)sizeof(struct sctp_auth_hmac_algo) + 6022 sctp_serialize_hmaclist(inp->sctp_ep.local_hmacs, 6023 (uint8_t *)hmacs->hmac_ids); 6024 hmacs->ph.param_type = htons(SCTP_HMAC_LIST); 6025 hmacs->ph.param_length = htons(parameter_len); 6026 padding_len = SCTP_SIZE32(parameter_len) - parameter_len; 6027 chunk_len += parameter_len; 6028 6029 if (padding_len > 0) { 6030 memset(mtod(m, caddr_t)+chunk_len, 0, padding_len); 6031 chunk_len += padding_len; 6032 padding_len = 0; 6033 } 6034 /* add CHUNKS parameter */ 6035 chunks = (struct sctp_auth_chunk_list *)(mtod(m, caddr_t)+chunk_len); 6036 parameter_len = (uint16_t)sizeof(struct sctp_auth_chunk_list) + 6037 sctp_serialize_auth_chunks(inp->sctp_ep.local_auth_chunks, 6038 chunks->chunk_types); 6039 chunks->ph.param_type = htons(SCTP_CHUNK_LIST); 6040 chunks->ph.param_length = htons(parameter_len); 6041 padding_len = SCTP_SIZE32(parameter_len) - parameter_len; 6042 chunk_len += parameter_len; 6043 } 6044 SCTP_BUF_LEN(m) = chunk_len; 6045 m_last = m; 6046 /* now the addresses */ 6047 /* 6048 * To optimize this we could put the scoping stuff into a structure 6049 * and remove the individual uint8's from the stc structure. Then we 6050 * could just sifa in the address within the stc.. but for now this 6051 * is a quick hack to get the address stuff teased apart. 6052 */ 6053 scp.ipv4_addr_legal = stc.ipv4_addr_legal; 6054 scp.ipv6_addr_legal = stc.ipv6_addr_legal; 6055 scp.loopback_scope = stc.loopback_scope; 6056 scp.ipv4_local_scope = stc.ipv4_scope; 6057 scp.local_scope = stc.local_scope; 6058 scp.site_scope = stc.site_scope; 6059 m_last = sctp_add_addresses_to_i_ia(inp, stcb, &scp, m_last, 6060 cnt_inits_to, 6061 &padding_len, &chunk_len); 6062 /* padding_len can only be positive, if no addresses have been added */ 6063 if (padding_len > 0) { 6064 memset(mtod(m, caddr_t)+chunk_len, 0, padding_len); 6065 chunk_len += padding_len; 6066 SCTP_BUF_LEN(m) += padding_len; 6067 padding_len = 0; 6068 } 6069 /* tack on the operational error if present */ 6070 if (op_err) { 6071 parameter_len = 0; 6072 for (m_tmp = op_err; m_tmp != NULL; m_tmp = SCTP_BUF_NEXT(m_tmp)) { 6073 parameter_len += SCTP_BUF_LEN(m_tmp); 6074 } 6075 padding_len = SCTP_SIZE32(parameter_len) - parameter_len; 6076 SCTP_BUF_NEXT(m_last) = op_err; 6077 while (SCTP_BUF_NEXT(m_last) != NULL) { 6078 m_last = SCTP_BUF_NEXT(m_last); 6079 } 6080 chunk_len += parameter_len; 6081 } 6082 if (padding_len > 0) { 6083 m_last = sctp_add_pad_tombuf(m_last, padding_len); 6084 if (m_last == NULL) { 6085 /* Houston we have a problem, no space */ 6086 sctp_m_freem(m); 6087 return; 6088 } 6089 chunk_len += padding_len; 6090 padding_len = 0; 6091 } 6092 /* Now we must build a cookie */ 6093 m_cookie = sctp_add_cookie(init_pkt, offset, m, 0, &stc, &signature); 6094 if (m_cookie == NULL) { 6095 /* memory problem */ 6096 sctp_m_freem(m); 6097 return; 6098 } 6099 /* Now append the cookie to the end and update the space/size */ 6100 SCTP_BUF_NEXT(m_last) = m_cookie; 6101 parameter_len = 0; 6102 for (m_tmp = m_cookie; m_tmp != NULL; m_tmp = SCTP_BUF_NEXT(m_tmp)) { 6103 parameter_len += SCTP_BUF_LEN(m_tmp); 6104 if (SCTP_BUF_NEXT(m_tmp) == NULL) { 6105 m_last = m_tmp; 6106 } 6107 } 6108 padding_len = SCTP_SIZE32(parameter_len) - parameter_len; 6109 chunk_len += parameter_len; 6110 6111 /* 6112 * Place in the size, but we don't include the last pad (if any) in 6113 * the INIT-ACK. 6114 */ 6115 initack->ch.chunk_length = htons(chunk_len); 6116 6117 /* 6118 * Time to sign the cookie, we don't sign over the cookie signature 6119 * though thus we set trailer. 6120 */ 6121 (void)sctp_hmac_m(SCTP_HMAC, 6122 (uint8_t *)inp->sctp_ep.secret_key[(int)(inp->sctp_ep.current_secret_number)], 6123 SCTP_SECRET_SIZE, m_cookie, sizeof(struct sctp_paramhdr), 6124 (uint8_t *)signature, SCTP_SIGNATURE_SIZE); 6125 /* 6126 * We sifa 0 here to NOT set IP_DF if its IPv4, we ignore the return 6127 * here since the timer will drive a retranmission. 6128 */ 6129 if (padding_len > 0) { 6130 if (sctp_add_pad_tombuf(m_last, padding_len) == NULL) { 6131 sctp_m_freem(m); 6132 return; 6133 } 6134 } 6135 if (stc.loopback_scope) { 6136 over_addr = (union sctp_sockstore *)dst; 6137 } else { 6138 over_addr = NULL; 6139 } 6140 6141 if ((error = sctp_lowlevel_chunk_output(inp, NULL, NULL, to, m, 0, NULL, 0, 0, 6142 0, 0, 6143 inp->sctp_lport, sh->src_port, init_chk->init.initiate_tag, 6144 port, over_addr, 6145 mflowtype, mflowid, 6146 SCTP_SO_NOT_LOCKED))) { 6147 SCTPDBG(SCTP_DEBUG_OUTPUT4, "Gak send error %d\n", error); 6148 if (error == ENOBUFS) { 6149 if (asoc != NULL) { 6150 asoc->ifp_had_enobuf = 1; 6151 } 6152 SCTP_STAT_INCR(sctps_lowlevelerr); 6153 } 6154 } else { 6155 if (asoc != NULL) { 6156 asoc->ifp_had_enobuf = 0; 6157 } 6158 } 6159 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 6160 } 6161 6162 6163 static void 6164 sctp_prune_prsctp(struct sctp_tcb *stcb, 6165 struct sctp_association *asoc, 6166 struct sctp_sndrcvinfo *srcv, 6167 int dataout) 6168 { 6169 int freed_spc = 0; 6170 struct sctp_tmit_chunk *chk, *nchk; 6171 6172 SCTP_TCB_LOCK_ASSERT(stcb); 6173 if ((asoc->prsctp_supported) && 6174 (asoc->sent_queue_cnt_removeable > 0)) { 6175 TAILQ_FOREACH(chk, &asoc->sent_queue, sctp_next) { 6176 /* 6177 * Look for chunks marked with the PR_SCTP flag AND 6178 * the buffer space flag. If the one being sent is 6179 * equal or greater priority then purge the old one 6180 * and free some space. 6181 */ 6182 if (PR_SCTP_BUF_ENABLED(chk->flags)) { 6183 /* 6184 * This one is PR-SCTP AND buffer space 6185 * limited type 6186 */ 6187 if (chk->rec.data.timetodrop.tv_sec >= (long)srcv->sinfo_timetolive) { 6188 /* 6189 * Lower numbers equates to higher 6190 * priority so if the one we are 6191 * looking at has a larger or equal 6192 * priority we want to drop the data 6193 * and NOT retransmit it. 6194 */ 6195 if (chk->data) { 6196 /* 6197 * We release the book_size 6198 * if the mbuf is here 6199 */ 6200 int ret_spc; 6201 uint8_t sent; 6202 6203 if (chk->sent > SCTP_DATAGRAM_UNSENT) 6204 sent = 1; 6205 else 6206 sent = 0; 6207 ret_spc = sctp_release_pr_sctp_chunk(stcb, chk, 6208 sent, 6209 SCTP_SO_LOCKED); 6210 freed_spc += ret_spc; 6211 if (freed_spc >= dataout) { 6212 return; 6213 } 6214 } /* if chunk was present */ 6215 } /* if of sufficient priority */ 6216 } /* if chunk has enabled */ 6217 } /* tailqforeach */ 6218 6219 TAILQ_FOREACH_SAFE(chk, &asoc->send_queue, sctp_next, nchk) { 6220 /* Here we must move to the sent queue and mark */ 6221 if (PR_SCTP_BUF_ENABLED(chk->flags)) { 6222 if (chk->rec.data.timetodrop.tv_sec >= (long)srcv->sinfo_timetolive) { 6223 if (chk->data) { 6224 /* 6225 * We release the book_size 6226 * if the mbuf is here 6227 */ 6228 int ret_spc; 6229 6230 ret_spc = sctp_release_pr_sctp_chunk(stcb, chk, 6231 0, SCTP_SO_LOCKED); 6232 6233 freed_spc += ret_spc; 6234 if (freed_spc >= dataout) { 6235 return; 6236 } 6237 } /* end if chk->data */ 6238 } /* end if right class */ 6239 } /* end if chk pr-sctp */ 6240 } /* tailqforeachsafe (chk) */ 6241 } /* if enabled in asoc */ 6242 } 6243 6244 int 6245 sctp_get_frag_point(struct sctp_tcb *stcb, 6246 struct sctp_association *asoc) 6247 { 6248 int siz, ovh; 6249 6250 /* 6251 * For endpoints that have both v6 and v4 addresses we must reserve 6252 * room for the ipv6 header, for those that are only dealing with V4 6253 * we use a larger frag point. 6254 */ 6255 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { 6256 ovh = SCTP_MIN_OVERHEAD; 6257 } else { 6258 ovh = SCTP_MIN_V4_OVERHEAD; 6259 } 6260 ovh += SCTP_DATA_CHUNK_OVERHEAD(stcb); 6261 if (stcb->asoc.sctp_frag_point > asoc->smallest_mtu) 6262 siz = asoc->smallest_mtu - ovh; 6263 else 6264 siz = (stcb->asoc.sctp_frag_point - ovh); 6265 /* 6266 * if (siz > (MCLBYTES-sizeof(struct sctp_data_chunk))) { 6267 */ 6268 /* A data chunk MUST fit in a cluster */ 6269 /* siz = (MCLBYTES - sizeof(struct sctp_data_chunk)); */ 6270 /* } */ 6271 6272 /* adjust for an AUTH chunk if DATA requires auth */ 6273 if (sctp_auth_is_required_chunk(SCTP_DATA, stcb->asoc.peer_auth_chunks)) 6274 siz -= sctp_get_auth_chunk_len(stcb->asoc.peer_hmac_id); 6275 6276 if (siz % 4) { 6277 /* make it an even word boundary please */ 6278 siz -= (siz % 4); 6279 } 6280 return (siz); 6281 } 6282 6283 static void 6284 sctp_set_prsctp_policy(struct sctp_stream_queue_pending *sp) 6285 { 6286 /* 6287 * We assume that the user wants PR_SCTP_TTL if the user provides a 6288 * positive lifetime but does not specify any PR_SCTP policy. 6289 */ 6290 if (PR_SCTP_ENABLED(sp->sinfo_flags)) { 6291 sp->act_flags |= PR_SCTP_POLICY(sp->sinfo_flags); 6292 } else if (sp->timetolive > 0) { 6293 sp->sinfo_flags |= SCTP_PR_SCTP_TTL; 6294 sp->act_flags |= PR_SCTP_POLICY(sp->sinfo_flags); 6295 } else { 6296 return; 6297 } 6298 switch (PR_SCTP_POLICY(sp->sinfo_flags)) { 6299 case CHUNK_FLAGS_PR_SCTP_BUF: 6300 /* 6301 * Time to live is a priority stored in tv_sec when doing 6302 * the buffer drop thing. 6303 */ 6304 sp->ts.tv_sec = sp->timetolive; 6305 sp->ts.tv_usec = 0; 6306 break; 6307 case CHUNK_FLAGS_PR_SCTP_TTL: 6308 { 6309 struct timeval tv; 6310 6311 (void)SCTP_GETTIME_TIMEVAL(&sp->ts); 6312 tv.tv_sec = sp->timetolive / 1000; 6313 tv.tv_usec = (sp->timetolive * 1000) % 1000000; 6314 /* 6315 * TODO sctp_constants.h needs alternative time 6316 * macros when _KERNEL is undefined. 6317 */ 6318 timevaladd(&sp->ts, &tv); 6319 } 6320 break; 6321 case CHUNK_FLAGS_PR_SCTP_RTX: 6322 /* 6323 * Time to live is a the number or retransmissions stored in 6324 * tv_sec. 6325 */ 6326 sp->ts.tv_sec = sp->timetolive; 6327 sp->ts.tv_usec = 0; 6328 break; 6329 default: 6330 SCTPDBG(SCTP_DEBUG_USRREQ1, 6331 "Unknown PR_SCTP policy %u.\n", 6332 PR_SCTP_POLICY(sp->sinfo_flags)); 6333 break; 6334 } 6335 } 6336 6337 static int 6338 sctp_msg_append(struct sctp_tcb *stcb, 6339 struct sctp_nets *net, 6340 struct mbuf *m, 6341 struct sctp_sndrcvinfo *srcv, int hold_stcb_lock) 6342 { 6343 int error = 0; 6344 struct mbuf *at; 6345 struct sctp_stream_queue_pending *sp = NULL; 6346 struct sctp_stream_out *strm; 6347 6348 /* 6349 * Given an mbuf chain, put it into the association send queue and 6350 * place it on the wheel 6351 */ 6352 if (srcv->sinfo_stream >= stcb->asoc.streamoutcnt) { 6353 /* Invalid stream number */ 6354 SCTP_LTRACE_ERR_RET_PKT(m, NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 6355 error = EINVAL; 6356 goto out_now; 6357 } 6358 if ((stcb->asoc.stream_locked) && 6359 (stcb->asoc.stream_locked_on != srcv->sinfo_stream)) { 6360 SCTP_LTRACE_ERR_RET_PKT(m, NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 6361 error = EINVAL; 6362 goto out_now; 6363 } 6364 strm = &stcb->asoc.strmout[srcv->sinfo_stream]; 6365 /* Now can we send this? */ 6366 if ((SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_SENT) || 6367 (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_ACK_SENT) || 6368 (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_RECEIVED) || 6369 (stcb->asoc.state & SCTP_STATE_SHUTDOWN_PENDING)) { 6370 /* got data while shutting down */ 6371 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ECONNRESET); 6372 error = ECONNRESET; 6373 goto out_now; 6374 } 6375 sctp_alloc_a_strmoq(stcb, sp); 6376 if (sp == NULL) { 6377 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 6378 error = ENOMEM; 6379 goto out_now; 6380 } 6381 sp->sinfo_flags = srcv->sinfo_flags; 6382 sp->timetolive = srcv->sinfo_timetolive; 6383 sp->ppid = srcv->sinfo_ppid; 6384 sp->context = srcv->sinfo_context; 6385 sp->fsn = 0; 6386 if (sp->sinfo_flags & SCTP_ADDR_OVER) { 6387 sp->net = net; 6388 atomic_add_int(&sp->net->ref_count, 1); 6389 } else { 6390 sp->net = NULL; 6391 } 6392 (void)SCTP_GETTIME_TIMEVAL(&sp->ts); 6393 sp->sid = srcv->sinfo_stream; 6394 sp->msg_is_complete = 1; 6395 sp->sender_all_done = 1; 6396 sp->some_taken = 0; 6397 sp->data = m; 6398 sp->tail_mbuf = NULL; 6399 sctp_set_prsctp_policy(sp); 6400 /* 6401 * We could in theory (for sendall) sifa the length in, but we would 6402 * still have to hunt through the chain since we need to setup the 6403 * tail_mbuf 6404 */ 6405 sp->length = 0; 6406 for (at = m; at; at = SCTP_BUF_NEXT(at)) { 6407 if (SCTP_BUF_NEXT(at) == NULL) 6408 sp->tail_mbuf = at; 6409 sp->length += SCTP_BUF_LEN(at); 6410 } 6411 if (srcv->sinfo_keynumber_valid) { 6412 sp->auth_keyid = srcv->sinfo_keynumber; 6413 } else { 6414 sp->auth_keyid = stcb->asoc.authinfo.active_keyid; 6415 } 6416 if (sctp_auth_is_required_chunk(SCTP_DATA, stcb->asoc.peer_auth_chunks)) { 6417 sctp_auth_key_acquire(stcb, sp->auth_keyid); 6418 sp->holds_key_ref = 1; 6419 } 6420 if (hold_stcb_lock == 0) { 6421 SCTP_TCB_SEND_LOCK(stcb); 6422 } 6423 sctp_snd_sb_alloc(stcb, sp->length); 6424 atomic_add_int(&stcb->asoc.stream_queue_cnt, 1); 6425 TAILQ_INSERT_TAIL(&strm->outqueue, sp, next); 6426 stcb->asoc.ss_functions.sctp_ss_add_to_stream(stcb, &stcb->asoc, strm, sp, 1); 6427 m = NULL; 6428 if (hold_stcb_lock == 0) { 6429 SCTP_TCB_SEND_UNLOCK(stcb); 6430 } 6431 out_now: 6432 if (m) { 6433 sctp_m_freem(m); 6434 } 6435 return (error); 6436 } 6437 6438 6439 static struct mbuf * 6440 sctp_copy_mbufchain(struct mbuf *clonechain, 6441 struct mbuf *outchain, 6442 struct mbuf **endofchain, 6443 int can_take_mbuf, 6444 int sizeofcpy, 6445 uint8_t copy_by_ref) 6446 { 6447 struct mbuf *m; 6448 struct mbuf *appendchain; 6449 caddr_t cp; 6450 int len; 6451 6452 if (endofchain == NULL) { 6453 /* error */ 6454 error_out: 6455 if (outchain) 6456 sctp_m_freem(outchain); 6457 return (NULL); 6458 } 6459 if (can_take_mbuf) { 6460 appendchain = clonechain; 6461 } else { 6462 if (!copy_by_ref && 6463 (sizeofcpy <= (int)((((SCTP_BASE_SYSCTL(sctp_mbuf_threshold_count) - 1) * MLEN) + MHLEN))) 6464 ) { 6465 /* Its not in a cluster */ 6466 if (*endofchain == NULL) { 6467 /* lets get a mbuf cluster */ 6468 if (outchain == NULL) { 6469 /* This is the general case */ 6470 new_mbuf: 6471 outchain = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_HEADER); 6472 if (outchain == NULL) { 6473 goto error_out; 6474 } 6475 SCTP_BUF_LEN(outchain) = 0; 6476 *endofchain = outchain; 6477 /* get the prepend space */ 6478 SCTP_BUF_RESV_UF(outchain, (SCTP_FIRST_MBUF_RESV + 4)); 6479 } else { 6480 /* 6481 * We really should not get a NULL 6482 * in endofchain 6483 */ 6484 /* find end */ 6485 m = outchain; 6486 while (m) { 6487 if (SCTP_BUF_NEXT(m) == NULL) { 6488 *endofchain = m; 6489 break; 6490 } 6491 m = SCTP_BUF_NEXT(m); 6492 } 6493 /* sanity */ 6494 if (*endofchain == NULL) { 6495 /* 6496 * huh, TSNH XXX maybe we 6497 * should panic 6498 */ 6499 sctp_m_freem(outchain); 6500 goto new_mbuf; 6501 } 6502 } 6503 /* get the new end of length */ 6504 len = (int)M_TRAILINGSPACE(*endofchain); 6505 } else { 6506 /* how much is left at the end? */ 6507 len = (int)M_TRAILINGSPACE(*endofchain); 6508 } 6509 /* Find the end of the data, for appending */ 6510 cp = (mtod((*endofchain), caddr_t)+SCTP_BUF_LEN((*endofchain))); 6511 6512 /* Now lets copy it out */ 6513 if (len >= sizeofcpy) { 6514 /* It all fits, copy it in */ 6515 m_copydata(clonechain, 0, sizeofcpy, cp); 6516 SCTP_BUF_LEN((*endofchain)) += sizeofcpy; 6517 } else { 6518 /* fill up the end of the chain */ 6519 if (len > 0) { 6520 m_copydata(clonechain, 0, len, cp); 6521 SCTP_BUF_LEN((*endofchain)) += len; 6522 /* now we need another one */ 6523 sizeofcpy -= len; 6524 } 6525 m = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_HEADER); 6526 if (m == NULL) { 6527 /* We failed */ 6528 goto error_out; 6529 } 6530 SCTP_BUF_NEXT((*endofchain)) = m; 6531 *endofchain = m; 6532 cp = mtod((*endofchain), caddr_t); 6533 m_copydata(clonechain, len, sizeofcpy, cp); 6534 SCTP_BUF_LEN((*endofchain)) += sizeofcpy; 6535 } 6536 return (outchain); 6537 } else { 6538 /* copy the old fashion way */ 6539 appendchain = SCTP_M_COPYM(clonechain, 0, M_COPYALL, M_NOWAIT); 6540 #ifdef SCTP_MBUF_LOGGING 6541 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { 6542 sctp_log_mbc(appendchain, SCTP_MBUF_ICOPY); 6543 } 6544 #endif 6545 } 6546 } 6547 if (appendchain == NULL) { 6548 /* error */ 6549 if (outchain) 6550 sctp_m_freem(outchain); 6551 return (NULL); 6552 } 6553 if (outchain) { 6554 /* tack on to the end */ 6555 if (*endofchain != NULL) { 6556 SCTP_BUF_NEXT(((*endofchain))) = appendchain; 6557 } else { 6558 m = outchain; 6559 while (m) { 6560 if (SCTP_BUF_NEXT(m) == NULL) { 6561 SCTP_BUF_NEXT(m) = appendchain; 6562 break; 6563 } 6564 m = SCTP_BUF_NEXT(m); 6565 } 6566 } 6567 /* 6568 * save off the end and update the end-chain position 6569 */ 6570 m = appendchain; 6571 while (m) { 6572 if (SCTP_BUF_NEXT(m) == NULL) { 6573 *endofchain = m; 6574 break; 6575 } 6576 m = SCTP_BUF_NEXT(m); 6577 } 6578 return (outchain); 6579 } else { 6580 /* save off the end and update the end-chain position */ 6581 m = appendchain; 6582 while (m) { 6583 if (SCTP_BUF_NEXT(m) == NULL) { 6584 *endofchain = m; 6585 break; 6586 } 6587 m = SCTP_BUF_NEXT(m); 6588 } 6589 return (appendchain); 6590 } 6591 } 6592 6593 static int 6594 sctp_med_chunk_output(struct sctp_inpcb *inp, 6595 struct sctp_tcb *stcb, 6596 struct sctp_association *asoc, 6597 int *num_out, 6598 int *reason_code, 6599 int control_only, int from_where, 6600 struct timeval *now, int *now_filled, int frag_point, int so_locked 6601 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 6602 SCTP_UNUSED 6603 #endif 6604 ); 6605 6606 static void 6607 sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, 6608 uint32_t val SCTP_UNUSED) 6609 { 6610 struct sctp_copy_all *ca; 6611 struct mbuf *m; 6612 int ret = 0; 6613 int added_control = 0; 6614 int un_sent, do_chunk_output = 1; 6615 struct sctp_association *asoc; 6616 struct sctp_nets *net; 6617 6618 ca = (struct sctp_copy_all *)ptr; 6619 if (ca->m == NULL) { 6620 return; 6621 } 6622 if (ca->inp != inp) { 6623 /* TSNH */ 6624 return; 6625 } 6626 if (ca->sndlen > 0) { 6627 m = SCTP_M_COPYM(ca->m, 0, M_COPYALL, M_NOWAIT); 6628 if (m == NULL) { 6629 /* can't copy so we are done */ 6630 ca->cnt_failed++; 6631 return; 6632 } 6633 #ifdef SCTP_MBUF_LOGGING 6634 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { 6635 sctp_log_mbc(m, SCTP_MBUF_ICOPY); 6636 } 6637 #endif 6638 } else { 6639 m = NULL; 6640 } 6641 SCTP_TCB_LOCK_ASSERT(stcb); 6642 if (stcb->asoc.alternate) { 6643 net = stcb->asoc.alternate; 6644 } else { 6645 net = stcb->asoc.primary_destination; 6646 } 6647 if (ca->sndrcv.sinfo_flags & SCTP_ABORT) { 6648 /* Abort this assoc with m as the user defined reason */ 6649 if (m != NULL) { 6650 SCTP_BUF_PREPEND(m, sizeof(struct sctp_paramhdr), M_NOWAIT); 6651 } else { 6652 m = sctp_get_mbuf_for_msg(sizeof(struct sctp_paramhdr), 6653 0, M_NOWAIT, 1, MT_DATA); 6654 SCTP_BUF_LEN(m) = sizeof(struct sctp_paramhdr); 6655 } 6656 if (m != NULL) { 6657 struct sctp_paramhdr *ph; 6658 6659 ph = mtod(m, struct sctp_paramhdr *); 6660 ph->param_type = htons(SCTP_CAUSE_USER_INITIATED_ABT); 6661 ph->param_length = htons((uint16_t)(sizeof(struct sctp_paramhdr) + ca->sndlen)); 6662 } 6663 /* 6664 * We add one here to keep the assoc from dis-appearing on 6665 * us. 6666 */ 6667 atomic_add_int(&stcb->asoc.refcnt, 1); 6668 sctp_abort_an_association(inp, stcb, m, SCTP_SO_NOT_LOCKED); 6669 /* 6670 * sctp_abort_an_association calls sctp_free_asoc() free 6671 * association will NOT free it since we incremented the 6672 * refcnt .. we do this to prevent it being freed and things 6673 * getting tricky since we could end up (from free_asoc) 6674 * calling inpcb_free which would get a recursive lock call 6675 * to the iterator lock.. But as a consequence of that the 6676 * stcb will return to us un-locked.. since free_asoc 6677 * returns with either no TCB or the TCB unlocked, we must 6678 * relock.. to unlock in the iterator timer :-0 6679 */ 6680 SCTP_TCB_LOCK(stcb); 6681 atomic_add_int(&stcb->asoc.refcnt, -1); 6682 goto no_chunk_output; 6683 } else { 6684 if (m) { 6685 ret = sctp_msg_append(stcb, net, m, 6686 &ca->sndrcv, 1); 6687 } 6688 asoc = &stcb->asoc; 6689 if (ca->sndrcv.sinfo_flags & SCTP_EOF) { 6690 /* shutdown this assoc */ 6691 if (TAILQ_EMPTY(&asoc->send_queue) && 6692 TAILQ_EMPTY(&asoc->sent_queue) && 6693 sctp_is_there_unsent_data(stcb, SCTP_SO_NOT_LOCKED) == 0) { 6694 if ((*asoc->ss_functions.sctp_ss_is_user_msgs_incomplete) (stcb, asoc)) { 6695 goto abort_anyway; 6696 } 6697 /* 6698 * there is nothing queued to send, so I'm 6699 * done... 6700 */ 6701 if ((SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) && 6702 (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_RECEIVED) && 6703 (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { 6704 /* 6705 * only send SHUTDOWN the first time 6706 * through 6707 */ 6708 if (SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) { 6709 SCTP_STAT_DECR_GAUGE32(sctps_currestab); 6710 } 6711 SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); 6712 SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); 6713 sctp_stop_timers_for_shutdown(stcb); 6714 sctp_send_shutdown(stcb, net); 6715 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb, 6716 net); 6717 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, 6718 asoc->primary_destination); 6719 added_control = 1; 6720 do_chunk_output = 0; 6721 } 6722 } else { 6723 /* 6724 * we still got (or just got) data to send, 6725 * so set SHUTDOWN_PENDING 6726 */ 6727 /* 6728 * XXX sockets draft says that SCTP_EOF 6729 * should be sent with no data. currently, 6730 * we will allow user data to be sent first 6731 * and move to SHUTDOWN-PENDING 6732 */ 6733 if ((SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) && 6734 (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_RECEIVED) && 6735 (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { 6736 if ((*asoc->ss_functions.sctp_ss_is_user_msgs_incomplete) (stcb, asoc)) { 6737 asoc->state |= SCTP_STATE_PARTIAL_MSG_LEFT; 6738 } 6739 asoc->state |= SCTP_STATE_SHUTDOWN_PENDING; 6740 if (TAILQ_EMPTY(&asoc->send_queue) && 6741 TAILQ_EMPTY(&asoc->sent_queue) && 6742 (asoc->state & SCTP_STATE_PARTIAL_MSG_LEFT)) { 6743 struct mbuf *op_err; 6744 char msg[SCTP_DIAG_INFO_LEN]; 6745 6746 abort_anyway: 6747 snprintf(msg, sizeof(msg), 6748 "%s:%d at %s", __FILE__, __LINE__, __func__); 6749 op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), 6750 msg); 6751 atomic_add_int(&stcb->asoc.refcnt, 1); 6752 sctp_abort_an_association(stcb->sctp_ep, stcb, 6753 op_err, SCTP_SO_NOT_LOCKED); 6754 atomic_add_int(&stcb->asoc.refcnt, -1); 6755 goto no_chunk_output; 6756 } 6757 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, 6758 asoc->primary_destination); 6759 } 6760 } 6761 6762 } 6763 } 6764 un_sent = ((stcb->asoc.total_output_queue_size - stcb->asoc.total_flight) + 6765 (stcb->asoc.stream_queue_cnt * SCTP_DATA_CHUNK_OVERHEAD(stcb))); 6766 6767 if ((sctp_is_feature_off(inp, SCTP_PCB_FLAGS_NODELAY)) && 6768 (stcb->asoc.total_flight > 0) && 6769 (un_sent < (int)(stcb->asoc.smallest_mtu - SCTP_MIN_OVERHEAD))) { 6770 do_chunk_output = 0; 6771 } 6772 if (do_chunk_output) 6773 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_NOT_LOCKED); 6774 else if (added_control) { 6775 int num_out, reason, now_filled = 0; 6776 struct timeval now; 6777 int frag_point; 6778 6779 frag_point = sctp_get_frag_point(stcb, &stcb->asoc); 6780 (void)sctp_med_chunk_output(inp, stcb, &stcb->asoc, &num_out, 6781 &reason, 1, 1, &now, &now_filled, frag_point, SCTP_SO_NOT_LOCKED); 6782 } 6783 no_chunk_output: 6784 if (ret) { 6785 ca->cnt_failed++; 6786 } else { 6787 ca->cnt_sent++; 6788 } 6789 } 6790 6791 static void 6792 sctp_sendall_completes(void *ptr, uint32_t val SCTP_UNUSED) 6793 { 6794 struct sctp_copy_all *ca; 6795 6796 ca = (struct sctp_copy_all *)ptr; 6797 /* 6798 * Do a notify here? Kacheong suggests that the notify be done at 6799 * the send time.. so you would push up a notification if any send 6800 * failed. Don't know if this is feasible since the only failures we 6801 * have is "memory" related and if you cannot get an mbuf to send 6802 * the data you surely can't get an mbuf to send up to notify the 6803 * user you can't send the data :-> 6804 */ 6805 6806 /* now free everything */ 6807 sctp_m_freem(ca->m); 6808 SCTP_FREE(ca, SCTP_M_COPYAL); 6809 } 6810 6811 static struct mbuf * 6812 sctp_copy_out_all(struct uio *uio, int len) 6813 { 6814 struct mbuf *ret, *at; 6815 int left, willcpy, cancpy, error; 6816 6817 ret = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_WAITOK, 1, MT_DATA); 6818 if (ret == NULL) { 6819 /* TSNH */ 6820 return (NULL); 6821 } 6822 left = len; 6823 SCTP_BUF_LEN(ret) = 0; 6824 /* save space for the data chunk header */ 6825 cancpy = (int)M_TRAILINGSPACE(ret); 6826 willcpy = min(cancpy, left); 6827 at = ret; 6828 while (left > 0) { 6829 /* Align data to the end */ 6830 error = uiomove(mtod(at, caddr_t), willcpy, uio); 6831 if (error) { 6832 err_out_now: 6833 sctp_m_freem(at); 6834 return (NULL); 6835 } 6836 SCTP_BUF_LEN(at) = willcpy; 6837 SCTP_BUF_NEXT_PKT(at) = SCTP_BUF_NEXT(at) = 0; 6838 left -= willcpy; 6839 if (left > 0) { 6840 SCTP_BUF_NEXT(at) = sctp_get_mbuf_for_msg(left, 0, M_WAITOK, 1, MT_DATA); 6841 if (SCTP_BUF_NEXT(at) == NULL) { 6842 goto err_out_now; 6843 } 6844 at = SCTP_BUF_NEXT(at); 6845 SCTP_BUF_LEN(at) = 0; 6846 cancpy = (int)M_TRAILINGSPACE(at); 6847 willcpy = min(cancpy, left); 6848 } 6849 } 6850 return (ret); 6851 } 6852 6853 static int 6854 sctp_sendall(struct sctp_inpcb *inp, struct uio *uio, struct mbuf *m, 6855 struct sctp_sndrcvinfo *srcv) 6856 { 6857 int ret; 6858 struct sctp_copy_all *ca; 6859 6860 SCTP_MALLOC(ca, struct sctp_copy_all *, sizeof(struct sctp_copy_all), 6861 SCTP_M_COPYAL); 6862 if (ca == NULL) { 6863 sctp_m_freem(m); 6864 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 6865 return (ENOMEM); 6866 } 6867 memset(ca, 0, sizeof(struct sctp_copy_all)); 6868 6869 ca->inp = inp; 6870 if (srcv) { 6871 memcpy(&ca->sndrcv, srcv, sizeof(struct sctp_nonpad_sndrcvinfo)); 6872 } 6873 /* 6874 * take off the sendall flag, it would be bad if we failed to do 6875 * this :-0 6876 */ 6877 ca->sndrcv.sinfo_flags &= ~SCTP_SENDALL; 6878 /* get length and mbuf chain */ 6879 if (uio) { 6880 ca->sndlen = (int)uio->uio_resid; 6881 ca->m = sctp_copy_out_all(uio, ca->sndlen); 6882 if (ca->m == NULL) { 6883 SCTP_FREE(ca, SCTP_M_COPYAL); 6884 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 6885 return (ENOMEM); 6886 } 6887 } else { 6888 /* Gather the length of the send */ 6889 struct mbuf *mat; 6890 6891 ca->sndlen = 0; 6892 for (mat = m; mat; mat = SCTP_BUF_NEXT(mat)) { 6893 ca->sndlen += SCTP_BUF_LEN(mat); 6894 } 6895 } 6896 ret = sctp_initiate_iterator(NULL, sctp_sendall_iterator, NULL, 6897 SCTP_PCB_ANY_FLAGS, SCTP_PCB_ANY_FEATURES, 6898 SCTP_ASOC_ANY_STATE, 6899 (void *)ca, 0, 6900 sctp_sendall_completes, inp, 1); 6901 if (ret) { 6902 SCTP_PRINTF("Failed to initiate iterator for sendall\n"); 6903 SCTP_FREE(ca, SCTP_M_COPYAL); 6904 SCTP_LTRACE_ERR_RET_PKT(m, inp, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EFAULT); 6905 return (EFAULT); 6906 } 6907 return (0); 6908 } 6909 6910 6911 void 6912 sctp_toss_old_cookies(struct sctp_tcb *stcb, struct sctp_association *asoc) 6913 { 6914 struct sctp_tmit_chunk *chk, *nchk; 6915 6916 TAILQ_FOREACH_SAFE(chk, &asoc->control_send_queue, sctp_next, nchk) { 6917 if (chk->rec.chunk_id.id == SCTP_COOKIE_ECHO) { 6918 TAILQ_REMOVE(&asoc->control_send_queue, chk, sctp_next); 6919 if (chk->data) { 6920 sctp_m_freem(chk->data); 6921 chk->data = NULL; 6922 } 6923 asoc->ctrl_queue_cnt--; 6924 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); 6925 } 6926 } 6927 } 6928 6929 void 6930 sctp_toss_old_asconf(struct sctp_tcb *stcb) 6931 { 6932 struct sctp_association *asoc; 6933 struct sctp_tmit_chunk *chk, *nchk; 6934 struct sctp_asconf_chunk *acp; 6935 6936 asoc = &stcb->asoc; 6937 TAILQ_FOREACH_SAFE(chk, &asoc->asconf_send_queue, sctp_next, nchk) { 6938 /* find SCTP_ASCONF chunk in queue */ 6939 if (chk->rec.chunk_id.id == SCTP_ASCONF) { 6940 if (chk->data) { 6941 acp = mtod(chk->data, struct sctp_asconf_chunk *); 6942 if (SCTP_TSN_GT(ntohl(acp->serial_number), asoc->asconf_seq_out_acked)) { 6943 /* Not Acked yet */ 6944 break; 6945 } 6946 } 6947 TAILQ_REMOVE(&asoc->asconf_send_queue, chk, sctp_next); 6948 if (chk->data) { 6949 sctp_m_freem(chk->data); 6950 chk->data = NULL; 6951 } 6952 asoc->ctrl_queue_cnt--; 6953 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); 6954 } 6955 } 6956 } 6957 6958 6959 static void 6960 sctp_clean_up_datalist(struct sctp_tcb *stcb, 6961 struct sctp_association *asoc, 6962 struct sctp_tmit_chunk **data_list, 6963 int bundle_at, 6964 struct sctp_nets *net) 6965 { 6966 int i; 6967 struct sctp_tmit_chunk *tp1; 6968 6969 for (i = 0; i < bundle_at; i++) { 6970 /* off of the send queue */ 6971 TAILQ_REMOVE(&asoc->send_queue, data_list[i], sctp_next); 6972 asoc->send_queue_cnt--; 6973 if (i > 0) { 6974 /* 6975 * Any chunk NOT 0 you zap the time chunk 0 gets 6976 * zapped or set based on if a RTO measurment is 6977 * needed. 6978 */ 6979 data_list[i]->do_rtt = 0; 6980 } 6981 /* record time */ 6982 data_list[i]->sent_rcv_time = net->last_sent_time; 6983 data_list[i]->rec.data.cwnd_at_send = net->cwnd; 6984 data_list[i]->rec.data.fast_retran_tsn = data_list[i]->rec.data.tsn; 6985 if (data_list[i]->whoTo == NULL) { 6986 data_list[i]->whoTo = net; 6987 atomic_add_int(&net->ref_count, 1); 6988 } 6989 /* on to the sent queue */ 6990 tp1 = TAILQ_LAST(&asoc->sent_queue, sctpchunk_listhead); 6991 if ((tp1) && SCTP_TSN_GT(tp1->rec.data.tsn, data_list[i]->rec.data.tsn)) { 6992 struct sctp_tmit_chunk *tpp; 6993 6994 /* need to move back */ 6995 back_up_more: 6996 tpp = TAILQ_PREV(tp1, sctpchunk_listhead, sctp_next); 6997 if (tpp == NULL) { 6998 TAILQ_INSERT_BEFORE(tp1, data_list[i], sctp_next); 6999 goto all_done; 7000 } 7001 tp1 = tpp; 7002 if (SCTP_TSN_GT(tp1->rec.data.tsn, data_list[i]->rec.data.tsn)) { 7003 goto back_up_more; 7004 } 7005 TAILQ_INSERT_AFTER(&asoc->sent_queue, tp1, data_list[i], sctp_next); 7006 } else { 7007 TAILQ_INSERT_TAIL(&asoc->sent_queue, 7008 data_list[i], 7009 sctp_next); 7010 } 7011 all_done: 7012 /* This does not lower until the cum-ack passes it */ 7013 asoc->sent_queue_cnt++; 7014 if ((asoc->peers_rwnd <= 0) && 7015 (asoc->total_flight == 0) && 7016 (bundle_at == 1)) { 7017 /* Mark the chunk as being a window probe */ 7018 SCTP_STAT_INCR(sctps_windowprobed); 7019 } 7020 #ifdef SCTP_AUDITING_ENABLED 7021 sctp_audit_log(0xC2, 3); 7022 #endif 7023 data_list[i]->sent = SCTP_DATAGRAM_SENT; 7024 data_list[i]->snd_count = 1; 7025 data_list[i]->rec.data.chunk_was_revoked = 0; 7026 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) { 7027 sctp_misc_ints(SCTP_FLIGHT_LOG_UP, 7028 data_list[i]->whoTo->flight_size, 7029 data_list[i]->book_size, 7030 (uint32_t)(uintptr_t)data_list[i]->whoTo, 7031 data_list[i]->rec.data.tsn); 7032 } 7033 sctp_flight_size_increase(data_list[i]); 7034 sctp_total_flight_increase(stcb, data_list[i]); 7035 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) { 7036 sctp_log_rwnd(SCTP_DECREASE_PEER_RWND, 7037 asoc->peers_rwnd, data_list[i]->send_size, SCTP_BASE_SYSCTL(sctp_peer_chunk_oh)); 7038 } 7039 asoc->peers_rwnd = sctp_sbspace_sub(asoc->peers_rwnd, 7040 (uint32_t)(data_list[i]->send_size + SCTP_BASE_SYSCTL(sctp_peer_chunk_oh))); 7041 if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) { 7042 /* SWS sender side engages */ 7043 asoc->peers_rwnd = 0; 7044 } 7045 } 7046 if (asoc->cc_functions.sctp_cwnd_update_packet_transmitted) { 7047 (*asoc->cc_functions.sctp_cwnd_update_packet_transmitted) (stcb, net); 7048 } 7049 } 7050 7051 static void 7052 sctp_clean_up_ctl(struct sctp_tcb *stcb, struct sctp_association *asoc, int so_locked 7053 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 7054 SCTP_UNUSED 7055 #endif 7056 ) 7057 { 7058 struct sctp_tmit_chunk *chk, *nchk; 7059 7060 TAILQ_FOREACH_SAFE(chk, &asoc->control_send_queue, sctp_next, nchk) { 7061 if ((chk->rec.chunk_id.id == SCTP_SELECTIVE_ACK) || 7062 (chk->rec.chunk_id.id == SCTP_NR_SELECTIVE_ACK) || /* EY */ 7063 (chk->rec.chunk_id.id == SCTP_HEARTBEAT_REQUEST) || 7064 (chk->rec.chunk_id.id == SCTP_HEARTBEAT_ACK) || 7065 (chk->rec.chunk_id.id == SCTP_FORWARD_CUM_TSN) || 7066 (chk->rec.chunk_id.id == SCTP_SHUTDOWN) || 7067 (chk->rec.chunk_id.id == SCTP_SHUTDOWN_ACK) || 7068 (chk->rec.chunk_id.id == SCTP_OPERATION_ERROR) || 7069 (chk->rec.chunk_id.id == SCTP_PACKET_DROPPED) || 7070 (chk->rec.chunk_id.id == SCTP_COOKIE_ACK) || 7071 (chk->rec.chunk_id.id == SCTP_ECN_CWR) || 7072 (chk->rec.chunk_id.id == SCTP_ASCONF_ACK)) { 7073 /* Stray chunks must be cleaned up */ 7074 clean_up_anyway: 7075 TAILQ_REMOVE(&asoc->control_send_queue, chk, sctp_next); 7076 if (chk->data) { 7077 sctp_m_freem(chk->data); 7078 chk->data = NULL; 7079 } 7080 asoc->ctrl_queue_cnt--; 7081 if (chk->rec.chunk_id.id == SCTP_FORWARD_CUM_TSN) 7082 asoc->fwd_tsn_cnt--; 7083 sctp_free_a_chunk(stcb, chk, so_locked); 7084 } else if (chk->rec.chunk_id.id == SCTP_STREAM_RESET) { 7085 /* special handling, we must look into the param */ 7086 if (chk != asoc->str_reset) { 7087 goto clean_up_anyway; 7088 } 7089 } 7090 } 7091 } 7092 7093 static uint32_t 7094 sctp_can_we_split_this(struct sctp_tcb *stcb, uint32_t length, 7095 uint32_t space_left, uint32_t frag_point, int eeor_on) 7096 { 7097 /* 7098 * Make a decision on if I should split a msg into multiple parts. 7099 * This is only asked of incomplete messages. 7100 */ 7101 if (eeor_on) { 7102 /* 7103 * If we are doing EEOR we need to always send it if its the 7104 * entire thing, since it might be all the guy is putting in 7105 * the hopper. 7106 */ 7107 if (space_left >= length) { 7108 /*- 7109 * If we have data outstanding, 7110 * we get another chance when the sack 7111 * arrives to transmit - wait for more data 7112 */ 7113 if (stcb->asoc.total_flight == 0) { 7114 /* 7115 * If nothing is in flight, we zero the 7116 * packet counter. 7117 */ 7118 return (length); 7119 } 7120 return (0); 7121 7122 } else { 7123 /* You can fill the rest */ 7124 return (space_left); 7125 } 7126 } 7127 /*- 7128 * For those strange folk that make the send buffer 7129 * smaller than our fragmentation point, we can't 7130 * get a full msg in so we have to allow splitting. 7131 */ 7132 if (SCTP_SB_LIMIT_SND(stcb->sctp_socket) < frag_point) { 7133 return (length); 7134 } 7135 if ((length <= space_left) || 7136 ((length - space_left) < SCTP_BASE_SYSCTL(sctp_min_residual))) { 7137 /* Sub-optimial residual don't split in non-eeor mode. */ 7138 return (0); 7139 } 7140 /* 7141 * If we reach here length is larger than the space_left. Do we wish 7142 * to split it for the sake of packet putting together? 7143 */ 7144 if (space_left >= min(SCTP_BASE_SYSCTL(sctp_min_split_point), frag_point)) { 7145 /* Its ok to split it */ 7146 return (min(space_left, frag_point)); 7147 } 7148 /* Nope, can't split */ 7149 return (0); 7150 } 7151 7152 static uint32_t 7153 sctp_move_to_outqueue(struct sctp_tcb *stcb, 7154 struct sctp_stream_out *strq, 7155 uint32_t space_left, 7156 uint32_t frag_point, 7157 int *giveup, 7158 int eeor_mode, 7159 int *bail, 7160 int so_locked 7161 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 7162 SCTP_UNUSED 7163 #endif 7164 ) 7165 { 7166 /* Move from the stream to the send_queue keeping track of the total */ 7167 struct sctp_association *asoc; 7168 struct sctp_stream_queue_pending *sp; 7169 struct sctp_tmit_chunk *chk; 7170 struct sctp_data_chunk *dchkh = NULL; 7171 struct sctp_idata_chunk *ndchkh = NULL; 7172 uint32_t to_move, length; 7173 int leading; 7174 uint8_t rcv_flags = 0; 7175 uint8_t some_taken; 7176 uint8_t send_lock_up = 0; 7177 7178 SCTP_TCB_LOCK_ASSERT(stcb); 7179 asoc = &stcb->asoc; 7180 one_more_time: 7181 /* sa_ignore FREED_MEMORY */ 7182 sp = TAILQ_FIRST(&strq->outqueue); 7183 if (sp == NULL) { 7184 if (send_lock_up == 0) { 7185 SCTP_TCB_SEND_LOCK(stcb); 7186 send_lock_up = 1; 7187 } 7188 sp = TAILQ_FIRST(&strq->outqueue); 7189 if (sp) { 7190 goto one_more_time; 7191 } 7192 if ((sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_EXPLICIT_EOR) == 0) && 7193 (stcb->asoc.idata_supported == 0) && 7194 (strq->last_msg_incomplete)) { 7195 SCTP_PRINTF("Huh? Stream:%d lm_in_c=%d but queue is NULL\n", 7196 strq->sid, 7197 strq->last_msg_incomplete); 7198 strq->last_msg_incomplete = 0; 7199 } 7200 to_move = 0; 7201 if (send_lock_up) { 7202 SCTP_TCB_SEND_UNLOCK(stcb); 7203 send_lock_up = 0; 7204 } 7205 goto out_of; 7206 } 7207 if ((sp->msg_is_complete) && (sp->length == 0)) { 7208 if (sp->sender_all_done) { 7209 /* 7210 * We are doing differed cleanup. Last time through 7211 * when we took all the data the sender_all_done was 7212 * not set. 7213 */ 7214 if ((sp->put_last_out == 0) && (sp->discard_rest == 0)) { 7215 SCTP_PRINTF("Gak, put out entire msg with NO end!-1\n"); 7216 SCTP_PRINTF("sender_done:%d len:%d msg_comp:%d put_last_out:%d send_lock:%d\n", 7217 sp->sender_all_done, 7218 sp->length, 7219 sp->msg_is_complete, 7220 sp->put_last_out, 7221 send_lock_up); 7222 } 7223 if ((TAILQ_NEXT(sp, next) == NULL) && (send_lock_up == 0)) { 7224 SCTP_TCB_SEND_LOCK(stcb); 7225 send_lock_up = 1; 7226 } 7227 atomic_subtract_int(&asoc->stream_queue_cnt, 1); 7228 TAILQ_REMOVE(&strq->outqueue, sp, next); 7229 stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, strq, sp, send_lock_up); 7230 if ((strq->state == SCTP_STREAM_RESET_PENDING) && 7231 (strq->chunks_on_queues == 0) && 7232 TAILQ_EMPTY(&strq->outqueue)) { 7233 stcb->asoc.trigger_reset = 1; 7234 } 7235 if (sp->net) { 7236 sctp_free_remote_addr(sp->net); 7237 sp->net = NULL; 7238 } 7239 if (sp->data) { 7240 sctp_m_freem(sp->data); 7241 sp->data = NULL; 7242 } 7243 sctp_free_a_strmoq(stcb, sp, so_locked); 7244 /* we can't be locked to it */ 7245 if (send_lock_up) { 7246 SCTP_TCB_SEND_UNLOCK(stcb); 7247 send_lock_up = 0; 7248 } 7249 /* back to get the next msg */ 7250 goto one_more_time; 7251 } else { 7252 /* 7253 * sender just finished this but still holds a 7254 * reference 7255 */ 7256 *giveup = 1; 7257 to_move = 0; 7258 goto out_of; 7259 } 7260 } else { 7261 /* is there some to get */ 7262 if (sp->length == 0) { 7263 /* no */ 7264 *giveup = 1; 7265 to_move = 0; 7266 goto out_of; 7267 } else if (sp->discard_rest) { 7268 if (send_lock_up == 0) { 7269 SCTP_TCB_SEND_LOCK(stcb); 7270 send_lock_up = 1; 7271 } 7272 /* Whack down the size */ 7273 atomic_subtract_int(&stcb->asoc.total_output_queue_size, sp->length); 7274 if ((stcb->sctp_socket != NULL) && 7275 ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || 7276 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL))) { 7277 atomic_subtract_int(&stcb->sctp_socket->so_snd.sb_cc, sp->length); 7278 } 7279 if (sp->data) { 7280 sctp_m_freem(sp->data); 7281 sp->data = NULL; 7282 sp->tail_mbuf = NULL; 7283 } 7284 sp->length = 0; 7285 sp->some_taken = 1; 7286 *giveup = 1; 7287 to_move = 0; 7288 goto out_of; 7289 } 7290 } 7291 some_taken = sp->some_taken; 7292 re_look: 7293 length = sp->length; 7294 if (sp->msg_is_complete) { 7295 /* The message is complete */ 7296 to_move = min(length, frag_point); 7297 if (to_move == length) { 7298 /* All of it fits in the MTU */ 7299 if (sp->some_taken) { 7300 rcv_flags |= SCTP_DATA_LAST_FRAG; 7301 } else { 7302 rcv_flags |= SCTP_DATA_NOT_FRAG; 7303 } 7304 sp->put_last_out = 1; 7305 if (sp->sinfo_flags & SCTP_SACK_IMMEDIATELY) { 7306 rcv_flags |= SCTP_DATA_SACK_IMMEDIATELY; 7307 } 7308 } else { 7309 /* Not all of it fits, we fragment */ 7310 if (sp->some_taken == 0) { 7311 rcv_flags |= SCTP_DATA_FIRST_FRAG; 7312 } 7313 sp->some_taken = 1; 7314 } 7315 } else { 7316 to_move = sctp_can_we_split_this(stcb, length, space_left, frag_point, eeor_mode); 7317 if (to_move) { 7318 /*- 7319 * We use a snapshot of length in case it 7320 * is expanding during the compare. 7321 */ 7322 uint32_t llen; 7323 7324 llen = length; 7325 if (to_move >= llen) { 7326 to_move = llen; 7327 if (send_lock_up == 0) { 7328 /*- 7329 * We are taking all of an incomplete msg 7330 * thus we need a send lock. 7331 */ 7332 SCTP_TCB_SEND_LOCK(stcb); 7333 send_lock_up = 1; 7334 if (sp->msg_is_complete) { 7335 /* 7336 * the sender finished the 7337 * msg 7338 */ 7339 goto re_look; 7340 } 7341 } 7342 } 7343 if (sp->some_taken == 0) { 7344 rcv_flags |= SCTP_DATA_FIRST_FRAG; 7345 sp->some_taken = 1; 7346 } 7347 } else { 7348 /* Nothing to take. */ 7349 *giveup = 1; 7350 to_move = 0; 7351 goto out_of; 7352 } 7353 } 7354 7355 /* If we reach here, we can copy out a chunk */ 7356 sctp_alloc_a_chunk(stcb, chk); 7357 if (chk == NULL) { 7358 /* No chunk memory */ 7359 *giveup = 1; 7360 to_move = 0; 7361 goto out_of; 7362 } 7363 /* 7364 * Setup for unordered if needed by looking at the user sent info 7365 * flags. 7366 */ 7367 if (sp->sinfo_flags & SCTP_UNORDERED) { 7368 rcv_flags |= SCTP_DATA_UNORDERED; 7369 } 7370 if (SCTP_BASE_SYSCTL(sctp_enable_sack_immediately) && 7371 (sp->sinfo_flags & SCTP_EOF) == SCTP_EOF) { 7372 rcv_flags |= SCTP_DATA_SACK_IMMEDIATELY; 7373 } 7374 /* clear out the chunk before setting up */ 7375 memset(chk, 0, sizeof(*chk)); 7376 chk->rec.data.rcv_flags = rcv_flags; 7377 7378 if (to_move >= length) { 7379 /* we think we can steal the whole thing */ 7380 if ((sp->sender_all_done == 0) && (send_lock_up == 0)) { 7381 SCTP_TCB_SEND_LOCK(stcb); 7382 send_lock_up = 1; 7383 } 7384 if (to_move < sp->length) { 7385 /* bail, it changed */ 7386 goto dont_do_it; 7387 } 7388 chk->data = sp->data; 7389 chk->last_mbuf = sp->tail_mbuf; 7390 /* register the stealing */ 7391 sp->data = sp->tail_mbuf = NULL; 7392 } else { 7393 struct mbuf *m; 7394 7395 dont_do_it: 7396 chk->data = SCTP_M_COPYM(sp->data, 0, to_move, M_NOWAIT); 7397 chk->last_mbuf = NULL; 7398 if (chk->data == NULL) { 7399 sp->some_taken = some_taken; 7400 sctp_free_a_chunk(stcb, chk, so_locked); 7401 *bail = 1; 7402 to_move = 0; 7403 goto out_of; 7404 } 7405 #ifdef SCTP_MBUF_LOGGING 7406 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { 7407 sctp_log_mbc(chk->data, SCTP_MBUF_ICOPY); 7408 } 7409 #endif 7410 /* Pull off the data */ 7411 m_adj(sp->data, to_move); 7412 /* Now lets work our way down and compact it */ 7413 m = sp->data; 7414 while (m && (SCTP_BUF_LEN(m) == 0)) { 7415 sp->data = SCTP_BUF_NEXT(m); 7416 SCTP_BUF_NEXT(m) = NULL; 7417 if (sp->tail_mbuf == m) { 7418 /*- 7419 * Freeing tail? TSNH since 7420 * we supposedly were taking less 7421 * than the sp->length. 7422 */ 7423 #ifdef INVARIANTS 7424 panic("Huh, freing tail? - TSNH"); 7425 #else 7426 SCTP_PRINTF("Huh, freeing tail? - TSNH\n"); 7427 sp->tail_mbuf = sp->data = NULL; 7428 sp->length = 0; 7429 #endif 7430 7431 } 7432 sctp_m_free(m); 7433 m = sp->data; 7434 } 7435 } 7436 if (SCTP_BUF_IS_EXTENDED(chk->data)) { 7437 chk->copy_by_ref = 1; 7438 } else { 7439 chk->copy_by_ref = 0; 7440 } 7441 /* 7442 * get last_mbuf and counts of mb usage This is ugly but hopefully 7443 * its only one mbuf. 7444 */ 7445 if (chk->last_mbuf == NULL) { 7446 chk->last_mbuf = chk->data; 7447 while (SCTP_BUF_NEXT(chk->last_mbuf) != NULL) { 7448 chk->last_mbuf = SCTP_BUF_NEXT(chk->last_mbuf); 7449 } 7450 } 7451 if (to_move > length) { 7452 /*- This should not happen either 7453 * since we always lower to_move to the size 7454 * of sp->length if its larger. 7455 */ 7456 #ifdef INVARIANTS 7457 panic("Huh, how can to_move be larger?"); 7458 #else 7459 SCTP_PRINTF("Huh, how can to_move be larger?\n"); 7460 sp->length = 0; 7461 #endif 7462 } else { 7463 atomic_subtract_int(&sp->length, to_move); 7464 } 7465 leading = SCTP_DATA_CHUNK_OVERHEAD(stcb); 7466 if (M_LEADINGSPACE(chk->data) < leading) { 7467 /* Not enough room for a chunk header, get some */ 7468 struct mbuf *m; 7469 7470 m = sctp_get_mbuf_for_msg(1, 0, M_NOWAIT, 0, MT_DATA); 7471 if (m == NULL) { 7472 /* 7473 * we're in trouble here. _PREPEND below will free 7474 * all the data if there is no leading space, so we 7475 * must put the data back and restore. 7476 */ 7477 if (send_lock_up == 0) { 7478 SCTP_TCB_SEND_LOCK(stcb); 7479 send_lock_up = 1; 7480 } 7481 if (sp->data == NULL) { 7482 /* unsteal the data */ 7483 sp->data = chk->data; 7484 sp->tail_mbuf = chk->last_mbuf; 7485 } else { 7486 struct mbuf *m_tmp; 7487 7488 /* reassemble the data */ 7489 m_tmp = sp->data; 7490 sp->data = chk->data; 7491 SCTP_BUF_NEXT(chk->last_mbuf) = m_tmp; 7492 } 7493 sp->some_taken = some_taken; 7494 atomic_add_int(&sp->length, to_move); 7495 chk->data = NULL; 7496 *bail = 1; 7497 sctp_free_a_chunk(stcb, chk, so_locked); 7498 to_move = 0; 7499 goto out_of; 7500 } else { 7501 SCTP_BUF_LEN(m) = 0; 7502 SCTP_BUF_NEXT(m) = chk->data; 7503 chk->data = m; 7504 M_ALIGN(chk->data, 4); 7505 } 7506 } 7507 SCTP_BUF_PREPEND(chk->data, SCTP_DATA_CHUNK_OVERHEAD(stcb), M_NOWAIT); 7508 if (chk->data == NULL) { 7509 /* HELP, TSNH since we assured it would not above? */ 7510 #ifdef INVARIANTS 7511 panic("prepend failes HELP?"); 7512 #else 7513 SCTP_PRINTF("prepend fails HELP?\n"); 7514 sctp_free_a_chunk(stcb, chk, so_locked); 7515 #endif 7516 *bail = 1; 7517 to_move = 0; 7518 goto out_of; 7519 } 7520 sctp_snd_sb_alloc(stcb, SCTP_DATA_CHUNK_OVERHEAD(stcb)); 7521 chk->book_size = chk->send_size = (uint16_t)(to_move + SCTP_DATA_CHUNK_OVERHEAD(stcb)); 7522 chk->book_size_scale = 0; 7523 chk->sent = SCTP_DATAGRAM_UNSENT; 7524 7525 chk->flags = 0; 7526 chk->asoc = &stcb->asoc; 7527 chk->pad_inplace = 0; 7528 chk->no_fr_allowed = 0; 7529 if (stcb->asoc.idata_supported == 0) { 7530 if (rcv_flags & SCTP_DATA_UNORDERED) { 7531 /* Just use 0. The receiver ignores the values. */ 7532 chk->rec.data.mid = 0; 7533 } else { 7534 chk->rec.data.mid = strq->next_mid_ordered; 7535 if (rcv_flags & SCTP_DATA_LAST_FRAG) { 7536 strq->next_mid_ordered++; 7537 } 7538 } 7539 } else { 7540 if (rcv_flags & SCTP_DATA_UNORDERED) { 7541 chk->rec.data.mid = strq->next_mid_unordered; 7542 if (rcv_flags & SCTP_DATA_LAST_FRAG) { 7543 strq->next_mid_unordered++; 7544 } 7545 } else { 7546 chk->rec.data.mid = strq->next_mid_ordered; 7547 if (rcv_flags & SCTP_DATA_LAST_FRAG) { 7548 strq->next_mid_ordered++; 7549 } 7550 } 7551 } 7552 chk->rec.data.sid = sp->sid; 7553 chk->rec.data.ppid = sp->ppid; 7554 chk->rec.data.context = sp->context; 7555 chk->rec.data.doing_fast_retransmit = 0; 7556 7557 chk->rec.data.timetodrop = sp->ts; 7558 chk->flags = sp->act_flags; 7559 7560 if (sp->net) { 7561 chk->whoTo = sp->net; 7562 atomic_add_int(&chk->whoTo->ref_count, 1); 7563 } else 7564 chk->whoTo = NULL; 7565 7566 if (sp->holds_key_ref) { 7567 chk->auth_keyid = sp->auth_keyid; 7568 sctp_auth_key_acquire(stcb, chk->auth_keyid); 7569 chk->holds_key_ref = 1; 7570 } 7571 chk->rec.data.tsn = atomic_fetchadd_int(&asoc->sending_seq, 1); 7572 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_AT_SEND_2_OUTQ) { 7573 sctp_misc_ints(SCTP_STRMOUT_LOG_SEND, 7574 (uint32_t)(uintptr_t)stcb, sp->length, 7575 (uint32_t)((chk->rec.data.sid << 16) | (0x0000ffff & chk->rec.data.mid)), 7576 chk->rec.data.tsn); 7577 } 7578 if (stcb->asoc.idata_supported == 0) { 7579 dchkh = mtod(chk->data, struct sctp_data_chunk *); 7580 } else { 7581 ndchkh = mtod(chk->data, struct sctp_idata_chunk *); 7582 } 7583 /* 7584 * Put the rest of the things in place now. Size was done earlier in 7585 * previous loop prior to padding. 7586 */ 7587 7588 #ifdef SCTP_ASOCLOG_OF_TSNS 7589 SCTP_TCB_LOCK_ASSERT(stcb); 7590 if (asoc->tsn_out_at >= SCTP_TSN_LOG_SIZE) { 7591 asoc->tsn_out_at = 0; 7592 asoc->tsn_out_wrapped = 1; 7593 } 7594 asoc->out_tsnlog[asoc->tsn_out_at].tsn = chk->rec.data.tsn; 7595 asoc->out_tsnlog[asoc->tsn_out_at].strm = chk->rec.data.sid; 7596 asoc->out_tsnlog[asoc->tsn_out_at].seq = chk->rec.data.mid; 7597 asoc->out_tsnlog[asoc->tsn_out_at].sz = chk->send_size; 7598 asoc->out_tsnlog[asoc->tsn_out_at].flgs = chk->rec.data.rcv_flags; 7599 asoc->out_tsnlog[asoc->tsn_out_at].stcb = (void *)stcb; 7600 asoc->out_tsnlog[asoc->tsn_out_at].in_pos = asoc->tsn_out_at; 7601 asoc->out_tsnlog[asoc->tsn_out_at].in_out = 2; 7602 asoc->tsn_out_at++; 7603 #endif 7604 if (stcb->asoc.idata_supported == 0) { 7605 dchkh->ch.chunk_type = SCTP_DATA; 7606 dchkh->ch.chunk_flags = chk->rec.data.rcv_flags; 7607 dchkh->dp.tsn = htonl(chk->rec.data.tsn); 7608 dchkh->dp.sid = htons(strq->sid); 7609 dchkh->dp.ssn = htons((uint16_t)chk->rec.data.mid); 7610 dchkh->dp.ppid = chk->rec.data.ppid; 7611 dchkh->ch.chunk_length = htons(chk->send_size); 7612 } else { 7613 ndchkh->ch.chunk_type = SCTP_IDATA; 7614 ndchkh->ch.chunk_flags = chk->rec.data.rcv_flags; 7615 ndchkh->dp.tsn = htonl(chk->rec.data.tsn); 7616 ndchkh->dp.sid = htons(strq->sid); 7617 ndchkh->dp.reserved = htons(0); 7618 ndchkh->dp.mid = htonl(chk->rec.data.mid); 7619 if (sp->fsn == 0) 7620 ndchkh->dp.ppid_fsn.ppid = chk->rec.data.ppid; 7621 else 7622 ndchkh->dp.ppid_fsn.fsn = htonl(sp->fsn); 7623 sp->fsn++; 7624 ndchkh->ch.chunk_length = htons(chk->send_size); 7625 } 7626 /* Now advance the chk->send_size by the actual pad needed. */ 7627 if (chk->send_size < SCTP_SIZE32(chk->book_size)) { 7628 /* need a pad */ 7629 struct mbuf *lm; 7630 int pads; 7631 7632 pads = SCTP_SIZE32(chk->book_size) - chk->send_size; 7633 lm = sctp_pad_lastmbuf(chk->data, pads, chk->last_mbuf); 7634 if (lm != NULL) { 7635 chk->last_mbuf = lm; 7636 chk->pad_inplace = 1; 7637 } 7638 chk->send_size += pads; 7639 } 7640 if (PR_SCTP_ENABLED(chk->flags)) { 7641 asoc->pr_sctp_cnt++; 7642 } 7643 if (sp->msg_is_complete && (sp->length == 0) && (sp->sender_all_done)) { 7644 /* All done pull and kill the message */ 7645 if (sp->put_last_out == 0) { 7646 SCTP_PRINTF("Gak, put out entire msg with NO end!-2\n"); 7647 SCTP_PRINTF("sender_done:%d len:%d msg_comp:%d put_last_out:%d send_lock:%d\n", 7648 sp->sender_all_done, 7649 sp->length, 7650 sp->msg_is_complete, 7651 sp->put_last_out, 7652 send_lock_up); 7653 } 7654 if ((send_lock_up == 0) && (TAILQ_NEXT(sp, next) == NULL)) { 7655 SCTP_TCB_SEND_LOCK(stcb); 7656 send_lock_up = 1; 7657 } 7658 atomic_subtract_int(&asoc->stream_queue_cnt, 1); 7659 TAILQ_REMOVE(&strq->outqueue, sp, next); 7660 stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, strq, sp, send_lock_up); 7661 if ((strq->state == SCTP_STREAM_RESET_PENDING) && 7662 (strq->chunks_on_queues == 0) && 7663 TAILQ_EMPTY(&strq->outqueue)) { 7664 stcb->asoc.trigger_reset = 1; 7665 } 7666 if (sp->net) { 7667 sctp_free_remote_addr(sp->net); 7668 sp->net = NULL; 7669 } 7670 if (sp->data) { 7671 sctp_m_freem(sp->data); 7672 sp->data = NULL; 7673 } 7674 sctp_free_a_strmoq(stcb, sp, so_locked); 7675 } 7676 asoc->chunks_on_out_queue++; 7677 strq->chunks_on_queues++; 7678 TAILQ_INSERT_TAIL(&asoc->send_queue, chk, sctp_next); 7679 asoc->send_queue_cnt++; 7680 out_of: 7681 if (send_lock_up) { 7682 SCTP_TCB_SEND_UNLOCK(stcb); 7683 } 7684 return (to_move); 7685 } 7686 7687 7688 static void 7689 sctp_fill_outqueue(struct sctp_tcb *stcb, 7690 struct sctp_nets *net, int frag_point, int eeor_mode, int *quit_now, int so_locked 7691 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 7692 SCTP_UNUSED 7693 #endif 7694 ) 7695 { 7696 struct sctp_association *asoc; 7697 struct sctp_stream_out *strq; 7698 uint32_t space_left, moved, total_moved; 7699 int bail, giveup; 7700 7701 SCTP_TCB_LOCK_ASSERT(stcb); 7702 asoc = &stcb->asoc; 7703 total_moved = 0; 7704 switch (net->ro._l_addr.sa.sa_family) { 7705 #ifdef INET 7706 case AF_INET: 7707 space_left = net->mtu - SCTP_MIN_V4_OVERHEAD; 7708 break; 7709 #endif 7710 #ifdef INET6 7711 case AF_INET6: 7712 space_left = net->mtu - SCTP_MIN_OVERHEAD; 7713 break; 7714 #endif 7715 default: 7716 /* TSNH */ 7717 space_left = net->mtu; 7718 break; 7719 } 7720 /* Need an allowance for the data chunk header too */ 7721 space_left -= SCTP_DATA_CHUNK_OVERHEAD(stcb); 7722 7723 /* must make even word boundary */ 7724 space_left &= 0xfffffffc; 7725 strq = stcb->asoc.ss_functions.sctp_ss_select_stream(stcb, net, asoc); 7726 giveup = 0; 7727 bail = 0; 7728 while ((space_left > 0) && (strq != NULL)) { 7729 moved = sctp_move_to_outqueue(stcb, strq, space_left, frag_point, 7730 &giveup, eeor_mode, &bail, so_locked); 7731 stcb->asoc.ss_functions.sctp_ss_scheduled(stcb, net, asoc, strq, moved); 7732 if ((giveup != 0) || (bail != 0)) { 7733 break; 7734 } 7735 strq = stcb->asoc.ss_functions.sctp_ss_select_stream(stcb, net, asoc); 7736 total_moved += moved; 7737 space_left -= moved; 7738 if (space_left >= SCTP_DATA_CHUNK_OVERHEAD(stcb)) { 7739 space_left -= SCTP_DATA_CHUNK_OVERHEAD(stcb); 7740 } else { 7741 space_left = 0; 7742 } 7743 space_left &= 0xfffffffc; 7744 } 7745 if (bail != 0) 7746 *quit_now = 1; 7747 7748 stcb->asoc.ss_functions.sctp_ss_packet_done(stcb, net, asoc); 7749 7750 if (total_moved == 0) { 7751 if ((stcb->asoc.sctp_cmt_on_off == 0) && 7752 (net == stcb->asoc.primary_destination)) { 7753 /* ran dry for primary network net */ 7754 SCTP_STAT_INCR(sctps_primary_randry); 7755 } else if (stcb->asoc.sctp_cmt_on_off > 0) { 7756 /* ran dry with CMT on */ 7757 SCTP_STAT_INCR(sctps_cmt_randry); 7758 } 7759 } 7760 } 7761 7762 void 7763 sctp_fix_ecn_echo(struct sctp_association *asoc) 7764 { 7765 struct sctp_tmit_chunk *chk; 7766 7767 TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { 7768 if (chk->rec.chunk_id.id == SCTP_ECN_ECHO) { 7769 chk->sent = SCTP_DATAGRAM_UNSENT; 7770 } 7771 } 7772 } 7773 7774 void 7775 sctp_move_chunks_from_net(struct sctp_tcb *stcb, struct sctp_nets *net) 7776 { 7777 struct sctp_association *asoc; 7778 struct sctp_tmit_chunk *chk; 7779 struct sctp_stream_queue_pending *sp; 7780 unsigned int i; 7781 7782 if (net == NULL) { 7783 return; 7784 } 7785 asoc = &stcb->asoc; 7786 for (i = 0; i < stcb->asoc.streamoutcnt; i++) { 7787 TAILQ_FOREACH(sp, &stcb->asoc.strmout[i].outqueue, next) { 7788 if (sp->net == net) { 7789 sctp_free_remote_addr(sp->net); 7790 sp->net = NULL; 7791 } 7792 } 7793 } 7794 TAILQ_FOREACH(chk, &asoc->send_queue, sctp_next) { 7795 if (chk->whoTo == net) { 7796 sctp_free_remote_addr(chk->whoTo); 7797 chk->whoTo = NULL; 7798 } 7799 } 7800 } 7801 7802 int 7803 sctp_med_chunk_output(struct sctp_inpcb *inp, 7804 struct sctp_tcb *stcb, 7805 struct sctp_association *asoc, 7806 int *num_out, 7807 int *reason_code, 7808 int control_only, int from_where, 7809 struct timeval *now, int *now_filled, int frag_point, int so_locked 7810 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 7811 SCTP_UNUSED 7812 #endif 7813 ) 7814 { 7815 /** 7816 * Ok this is the generic chunk service queue. we must do the 7817 * following: 7818 * - Service the stream queue that is next, moving any 7819 * message (note I must get a complete message i.e. FIRST/MIDDLE and 7820 * LAST to the out queue in one pass) and assigning TSN's. This 7821 * only applys though if the peer does not support NDATA. For NDATA 7822 * chunks its ok to not send the entire message ;-) 7823 * - Check to see if the cwnd/rwnd allows any output, if so we go ahead and 7824 * fomulate and send the low level chunks. Making sure to combine 7825 * any control in the control chunk queue also. 7826 */ 7827 struct sctp_nets *net, *start_at, *sack_goes_to = NULL, *old_start_at = NULL; 7828 struct mbuf *outchain, *endoutchain; 7829 struct sctp_tmit_chunk *chk, *nchk; 7830 7831 /* temp arrays for unlinking */ 7832 struct sctp_tmit_chunk *data_list[SCTP_MAX_DATA_BUNDLING]; 7833 int no_fragmentflg, error; 7834 unsigned int max_rwnd_per_dest, max_send_per_dest; 7835 int one_chunk, hbflag, skip_data_for_this_net; 7836 int asconf, cookie, no_out_cnt; 7837 int bundle_at, ctl_cnt, no_data_chunks, eeor_mode; 7838 unsigned int mtu, r_mtu, omtu, mx_mtu, to_out; 7839 int tsns_sent = 0; 7840 uint32_t auth_offset = 0; 7841 struct sctp_auth_chunk *auth = NULL; 7842 uint16_t auth_keyid; 7843 int override_ok = 1; 7844 int skip_fill_up = 0; 7845 int data_auth_reqd = 0; 7846 7847 /* 7848 * JRS 5/14/07 - Add flag for whether a heartbeat is sent to the 7849 * destination. 7850 */ 7851 int quit_now = 0; 7852 7853 *num_out = 0; 7854 *reason_code = 0; 7855 auth_keyid = stcb->asoc.authinfo.active_keyid; 7856 if ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) || 7857 (asoc->state & SCTP_STATE_SHUTDOWN_RECEIVED) || 7858 (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXPLICIT_EOR))) { 7859 eeor_mode = 1; 7860 } else { 7861 eeor_mode = 0; 7862 } 7863 ctl_cnt = no_out_cnt = asconf = cookie = 0; 7864 /* 7865 * First lets prime the pump. For each destination, if there is room 7866 * in the flight size, attempt to pull an MTU's worth out of the 7867 * stream queues into the general send_queue 7868 */ 7869 #ifdef SCTP_AUDITING_ENABLED 7870 sctp_audit_log(0xC2, 2); 7871 #endif 7872 SCTP_TCB_LOCK_ASSERT(stcb); 7873 hbflag = 0; 7874 if (control_only) 7875 no_data_chunks = 1; 7876 else 7877 no_data_chunks = 0; 7878 7879 /* Nothing to possible to send? */ 7880 if ((TAILQ_EMPTY(&asoc->control_send_queue) || 7881 (asoc->ctrl_queue_cnt == stcb->asoc.ecn_echo_cnt_onq)) && 7882 TAILQ_EMPTY(&asoc->asconf_send_queue) && 7883 TAILQ_EMPTY(&asoc->send_queue) && 7884 sctp_is_there_unsent_data(stcb, so_locked) == 0) { 7885 nothing_to_send: 7886 *reason_code = 9; 7887 return (0); 7888 } 7889 if (asoc->peers_rwnd == 0) { 7890 /* No room in peers rwnd */ 7891 *reason_code = 1; 7892 if (asoc->total_flight > 0) { 7893 /* we are allowed one chunk in flight */ 7894 no_data_chunks = 1; 7895 } 7896 } 7897 if (stcb->asoc.ecn_echo_cnt_onq) { 7898 /* Record where a sack goes, if any */ 7899 if (no_data_chunks && 7900 (asoc->ctrl_queue_cnt == stcb->asoc.ecn_echo_cnt_onq)) { 7901 /* Nothing but ECNe to send - we don't do that */ 7902 goto nothing_to_send; 7903 } 7904 TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { 7905 if ((chk->rec.chunk_id.id == SCTP_SELECTIVE_ACK) || 7906 (chk->rec.chunk_id.id == SCTP_NR_SELECTIVE_ACK)) { 7907 sack_goes_to = chk->whoTo; 7908 break; 7909 } 7910 } 7911 } 7912 max_rwnd_per_dest = ((asoc->peers_rwnd + asoc->total_flight) / asoc->numnets); 7913 if (stcb->sctp_socket) 7914 max_send_per_dest = SCTP_SB_LIMIT_SND(stcb->sctp_socket) / asoc->numnets; 7915 else 7916 max_send_per_dest = 0; 7917 if (no_data_chunks == 0) { 7918 /* How many non-directed chunks are there? */ 7919 TAILQ_FOREACH(chk, &asoc->send_queue, sctp_next) { 7920 if (chk->whoTo == NULL) { 7921 /* 7922 * We already have non-directed chunks on 7923 * the queue, no need to do a fill-up. 7924 */ 7925 skip_fill_up = 1; 7926 break; 7927 } 7928 } 7929 7930 } 7931 if ((no_data_chunks == 0) && 7932 (skip_fill_up == 0) && 7933 (!stcb->asoc.ss_functions.sctp_ss_is_empty(stcb, asoc))) { 7934 TAILQ_FOREACH(net, &asoc->nets, sctp_next) { 7935 /* 7936 * This for loop we are in takes in each net, if 7937 * its's got space in cwnd and has data sent to it 7938 * (when CMT is off) then it calls 7939 * sctp_fill_outqueue for the net. This gets data on 7940 * the send queue for that network. 7941 * 7942 * In sctp_fill_outqueue TSN's are assigned and data 7943 * is copied out of the stream buffers. Note mostly 7944 * copy by reference (we hope). 7945 */ 7946 net->window_probe = 0; 7947 if ((net != stcb->asoc.alternate) && 7948 ((net->dest_state & SCTP_ADDR_PF) || 7949 (!(net->dest_state & SCTP_ADDR_REACHABLE)) || 7950 (net->dest_state & SCTP_ADDR_UNCONFIRMED))) { 7951 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { 7952 sctp_log_cwnd(stcb, net, 1, 7953 SCTP_CWND_LOG_FILL_OUTQ_CALLED); 7954 } 7955 continue; 7956 } 7957 if ((stcb->asoc.cc_functions.sctp_cwnd_new_transmission_begins) && 7958 (net->flight_size == 0)) { 7959 (*stcb->asoc.cc_functions.sctp_cwnd_new_transmission_begins) (stcb, net); 7960 } 7961 if (net->flight_size >= net->cwnd) { 7962 /* skip this network, no room - can't fill */ 7963 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { 7964 sctp_log_cwnd(stcb, net, 3, 7965 SCTP_CWND_LOG_FILL_OUTQ_CALLED); 7966 } 7967 continue; 7968 } 7969 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { 7970 sctp_log_cwnd(stcb, net, 4, SCTP_CWND_LOG_FILL_OUTQ_CALLED); 7971 } 7972 sctp_fill_outqueue(stcb, net, frag_point, eeor_mode, &quit_now, so_locked); 7973 if (quit_now) { 7974 /* memory alloc failure */ 7975 no_data_chunks = 1; 7976 break; 7977 } 7978 } 7979 } 7980 /* now service each destination and send out what we can for it */ 7981 /* Nothing to send? */ 7982 if (TAILQ_EMPTY(&asoc->control_send_queue) && 7983 TAILQ_EMPTY(&asoc->asconf_send_queue) && 7984 TAILQ_EMPTY(&asoc->send_queue)) { 7985 *reason_code = 8; 7986 return (0); 7987 } 7988 if (asoc->sctp_cmt_on_off > 0) { 7989 /* get the last start point */ 7990 start_at = asoc->last_net_cmt_send_started; 7991 if (start_at == NULL) { 7992 /* null so to beginning */ 7993 start_at = TAILQ_FIRST(&asoc->nets); 7994 } else { 7995 start_at = TAILQ_NEXT(asoc->last_net_cmt_send_started, sctp_next); 7996 if (start_at == NULL) { 7997 start_at = TAILQ_FIRST(&asoc->nets); 7998 } 7999 } 8000 asoc->last_net_cmt_send_started = start_at; 8001 } else { 8002 start_at = TAILQ_FIRST(&asoc->nets); 8003 } 8004 TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { 8005 if (chk->whoTo == NULL) { 8006 if (asoc->alternate) { 8007 chk->whoTo = asoc->alternate; 8008 } else { 8009 chk->whoTo = asoc->primary_destination; 8010 } 8011 atomic_add_int(&chk->whoTo->ref_count, 1); 8012 } 8013 } 8014 old_start_at = NULL; 8015 again_one_more_time: 8016 for (net = start_at; net != NULL; net = TAILQ_NEXT(net, sctp_next)) { 8017 /* how much can we send? */ 8018 /* SCTPDBG("Examine for sending net:%x\n", (uint32_t)net); */ 8019 if (old_start_at && (old_start_at == net)) { 8020 /* through list ocmpletely. */ 8021 break; 8022 } 8023 tsns_sent = 0xa; 8024 if (TAILQ_EMPTY(&asoc->control_send_queue) && 8025 TAILQ_EMPTY(&asoc->asconf_send_queue) && 8026 (net->flight_size >= net->cwnd)) { 8027 /* 8028 * Nothing on control or asconf and flight is full, 8029 * we can skip even in the CMT case. 8030 */ 8031 continue; 8032 } 8033 bundle_at = 0; 8034 endoutchain = outchain = NULL; 8035 no_fragmentflg = 1; 8036 one_chunk = 0; 8037 if (net->dest_state & SCTP_ADDR_UNCONFIRMED) { 8038 skip_data_for_this_net = 1; 8039 } else { 8040 skip_data_for_this_net = 0; 8041 } 8042 switch (((struct sockaddr *)&net->ro._l_addr)->sa_family) { 8043 #ifdef INET 8044 case AF_INET: 8045 mtu = net->mtu - SCTP_MIN_V4_OVERHEAD; 8046 break; 8047 #endif 8048 #ifdef INET6 8049 case AF_INET6: 8050 mtu = net->mtu - SCTP_MIN_OVERHEAD; 8051 break; 8052 #endif 8053 default: 8054 /* TSNH */ 8055 mtu = net->mtu; 8056 break; 8057 } 8058 mx_mtu = mtu; 8059 to_out = 0; 8060 if (mtu > asoc->peers_rwnd) { 8061 if (asoc->total_flight > 0) { 8062 /* We have a packet in flight somewhere */ 8063 r_mtu = asoc->peers_rwnd; 8064 } else { 8065 /* We are always allowed to send one MTU out */ 8066 one_chunk = 1; 8067 r_mtu = mtu; 8068 } 8069 } else { 8070 r_mtu = mtu; 8071 } 8072 error = 0; 8073 /************************/ 8074 /* ASCONF transmission */ 8075 /************************/ 8076 /* Now first lets go through the asconf queue */ 8077 TAILQ_FOREACH_SAFE(chk, &asoc->asconf_send_queue, sctp_next, nchk) { 8078 if (chk->rec.chunk_id.id != SCTP_ASCONF) { 8079 continue; 8080 } 8081 if (chk->whoTo == NULL) { 8082 if (asoc->alternate == NULL) { 8083 if (asoc->primary_destination != net) { 8084 break; 8085 } 8086 } else { 8087 if (asoc->alternate != net) { 8088 break; 8089 } 8090 } 8091 } else { 8092 if (chk->whoTo != net) { 8093 break; 8094 } 8095 } 8096 if (chk->data == NULL) { 8097 break; 8098 } 8099 if (chk->sent != SCTP_DATAGRAM_UNSENT && 8100 chk->sent != SCTP_DATAGRAM_RESEND) { 8101 break; 8102 } 8103 /* 8104 * if no AUTH is yet included and this chunk 8105 * requires it, make sure to account for it. We 8106 * don't apply the size until the AUTH chunk is 8107 * actually added below in case there is no room for 8108 * this chunk. NOTE: we overload the use of "omtu" 8109 * here 8110 */ 8111 if ((auth == NULL) && 8112 sctp_auth_is_required_chunk(chk->rec.chunk_id.id, 8113 stcb->asoc.peer_auth_chunks)) { 8114 omtu = sctp_get_auth_chunk_len(stcb->asoc.peer_hmac_id); 8115 } else 8116 omtu = 0; 8117 /* Here we do NOT factor the r_mtu */ 8118 if ((chk->send_size < (int)(mtu - omtu)) || 8119 (chk->flags & CHUNK_FLAGS_FRAGMENT_OK)) { 8120 /* 8121 * We probably should glom the mbuf chain 8122 * from the chk->data for control but the 8123 * problem is it becomes yet one more level 8124 * of tracking to do if for some reason 8125 * output fails. Then I have got to 8126 * reconstruct the merged control chain.. el 8127 * yucko.. for now we take the easy way and 8128 * do the copy 8129 */ 8130 /* 8131 * Add an AUTH chunk, if chunk requires it 8132 * save the offset into the chain for AUTH 8133 */ 8134 if ((auth == NULL) && 8135 (sctp_auth_is_required_chunk(chk->rec.chunk_id.id, 8136 stcb->asoc.peer_auth_chunks))) { 8137 outchain = sctp_add_auth_chunk(outchain, 8138 &endoutchain, 8139 &auth, 8140 &auth_offset, 8141 stcb, 8142 chk->rec.chunk_id.id); 8143 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 8144 } 8145 outchain = sctp_copy_mbufchain(chk->data, outchain, &endoutchain, 8146 (int)chk->rec.chunk_id.can_take_data, 8147 chk->send_size, chk->copy_by_ref); 8148 if (outchain == NULL) { 8149 *reason_code = 8; 8150 SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 8151 return (ENOMEM); 8152 } 8153 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 8154 /* update our MTU size */ 8155 if (mtu > (chk->send_size + omtu)) 8156 mtu -= (chk->send_size + omtu); 8157 else 8158 mtu = 0; 8159 to_out += (chk->send_size + omtu); 8160 /* Do clear IP_DF ? */ 8161 if (chk->flags & CHUNK_FLAGS_FRAGMENT_OK) { 8162 no_fragmentflg = 0; 8163 } 8164 if (chk->rec.chunk_id.can_take_data) 8165 chk->data = NULL; 8166 /* 8167 * set hb flag since we can use these for 8168 * RTO 8169 */ 8170 hbflag = 1; 8171 asconf = 1; 8172 /* 8173 * should sysctl this: don't bundle data 8174 * with ASCONF since it requires AUTH 8175 */ 8176 no_data_chunks = 1; 8177 chk->sent = SCTP_DATAGRAM_SENT; 8178 if (chk->whoTo == NULL) { 8179 chk->whoTo = net; 8180 atomic_add_int(&net->ref_count, 1); 8181 } 8182 chk->snd_count++; 8183 if (mtu == 0) { 8184 /* 8185 * Ok we are out of room but we can 8186 * output without effecting the 8187 * flight size since this little guy 8188 * is a control only packet. 8189 */ 8190 sctp_timer_start(SCTP_TIMER_TYPE_ASCONF, inp, stcb, net); 8191 /* 8192 * do NOT clear the asconf flag as 8193 * it is used to do appropriate 8194 * source address selection. 8195 */ 8196 if (*now_filled == 0) { 8197 (void)SCTP_GETTIME_TIMEVAL(now); 8198 *now_filled = 1; 8199 } 8200 net->last_sent_time = *now; 8201 hbflag = 0; 8202 if ((error = sctp_lowlevel_chunk_output(inp, stcb, net, 8203 (struct sockaddr *)&net->ro._l_addr, 8204 outchain, auth_offset, auth, 8205 stcb->asoc.authinfo.active_keyid, 8206 no_fragmentflg, 0, asconf, 8207 inp->sctp_lport, stcb->rport, 8208 htonl(stcb->asoc.peer_vtag), 8209 net->port, NULL, 8210 0, 0, 8211 so_locked))) { 8212 /* 8213 * error, we could not 8214 * output 8215 */ 8216 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Gak send error %d\n", error); 8217 if (from_where == 0) { 8218 SCTP_STAT_INCR(sctps_lowlevelerrusr); 8219 } 8220 if (error == ENOBUFS) { 8221 asoc->ifp_had_enobuf = 1; 8222 SCTP_STAT_INCR(sctps_lowlevelerr); 8223 } 8224 /* error, could not output */ 8225 if (error == EHOSTUNREACH) { 8226 /* 8227 * Destination went 8228 * unreachable 8229 * during this send 8230 */ 8231 sctp_move_chunks_from_net(stcb, net); 8232 } 8233 *reason_code = 7; 8234 break; 8235 } else { 8236 asoc->ifp_had_enobuf = 0; 8237 } 8238 /* 8239 * increase the number we sent, if a 8240 * cookie is sent we don't tell them 8241 * any was sent out. 8242 */ 8243 outchain = endoutchain = NULL; 8244 auth = NULL; 8245 auth_offset = 0; 8246 if (!no_out_cnt) 8247 *num_out += ctl_cnt; 8248 /* recalc a clean slate and setup */ 8249 switch (net->ro._l_addr.sa.sa_family) { 8250 #ifdef INET 8251 case AF_INET: 8252 mtu = net->mtu - SCTP_MIN_V4_OVERHEAD; 8253 break; 8254 #endif 8255 #ifdef INET6 8256 case AF_INET6: 8257 mtu = net->mtu - SCTP_MIN_OVERHEAD; 8258 break; 8259 #endif 8260 default: 8261 /* TSNH */ 8262 mtu = net->mtu; 8263 break; 8264 } 8265 to_out = 0; 8266 no_fragmentflg = 1; 8267 } 8268 } 8269 } 8270 if (error != 0) { 8271 /* try next net */ 8272 continue; 8273 } 8274 /************************/ 8275 /* Control transmission */ 8276 /************************/ 8277 /* Now first lets go through the control queue */ 8278 TAILQ_FOREACH_SAFE(chk, &asoc->control_send_queue, sctp_next, nchk) { 8279 if ((sack_goes_to) && 8280 (chk->rec.chunk_id.id == SCTP_ECN_ECHO) && 8281 (chk->whoTo != sack_goes_to)) { 8282 /* 8283 * if we have a sack in queue, and we are 8284 * looking at an ecn echo that is NOT queued 8285 * to where the sack is going.. 8286 */ 8287 if (chk->whoTo == net) { 8288 /* 8289 * Don't transmit it to where its 8290 * going (current net) 8291 */ 8292 continue; 8293 } else if (sack_goes_to == net) { 8294 /* 8295 * But do transmit it to this 8296 * address 8297 */ 8298 goto skip_net_check; 8299 } 8300 } 8301 if (chk->whoTo == NULL) { 8302 if (asoc->alternate == NULL) { 8303 if (asoc->primary_destination != net) { 8304 continue; 8305 } 8306 } else { 8307 if (asoc->alternate != net) { 8308 continue; 8309 } 8310 } 8311 } else { 8312 if (chk->whoTo != net) { 8313 continue; 8314 } 8315 } 8316 skip_net_check: 8317 if (chk->data == NULL) { 8318 continue; 8319 } 8320 if (chk->sent != SCTP_DATAGRAM_UNSENT) { 8321 /* 8322 * It must be unsent. Cookies and ASCONF's 8323 * hang around but there timers will force 8324 * when marked for resend. 8325 */ 8326 continue; 8327 } 8328 /* 8329 * if no AUTH is yet included and this chunk 8330 * requires it, make sure to account for it. We 8331 * don't apply the size until the AUTH chunk is 8332 * actually added below in case there is no room for 8333 * this chunk. NOTE: we overload the use of "omtu" 8334 * here 8335 */ 8336 if ((auth == NULL) && 8337 sctp_auth_is_required_chunk(chk->rec.chunk_id.id, 8338 stcb->asoc.peer_auth_chunks)) { 8339 omtu = sctp_get_auth_chunk_len(stcb->asoc.peer_hmac_id); 8340 } else 8341 omtu = 0; 8342 /* Here we do NOT factor the r_mtu */ 8343 if ((chk->send_size <= (int)(mtu - omtu)) || 8344 (chk->flags & CHUNK_FLAGS_FRAGMENT_OK)) { 8345 /* 8346 * We probably should glom the mbuf chain 8347 * from the chk->data for control but the 8348 * problem is it becomes yet one more level 8349 * of tracking to do if for some reason 8350 * output fails. Then I have got to 8351 * reconstruct the merged control chain.. el 8352 * yucko.. for now we take the easy way and 8353 * do the copy 8354 */ 8355 /* 8356 * Add an AUTH chunk, if chunk requires it 8357 * save the offset into the chain for AUTH 8358 */ 8359 if ((auth == NULL) && 8360 (sctp_auth_is_required_chunk(chk->rec.chunk_id.id, 8361 stcb->asoc.peer_auth_chunks))) { 8362 outchain = sctp_add_auth_chunk(outchain, 8363 &endoutchain, 8364 &auth, 8365 &auth_offset, 8366 stcb, 8367 chk->rec.chunk_id.id); 8368 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 8369 } 8370 outchain = sctp_copy_mbufchain(chk->data, outchain, &endoutchain, 8371 (int)chk->rec.chunk_id.can_take_data, 8372 chk->send_size, chk->copy_by_ref); 8373 if (outchain == NULL) { 8374 *reason_code = 8; 8375 SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 8376 return (ENOMEM); 8377 } 8378 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 8379 /* update our MTU size */ 8380 if (mtu > (chk->send_size + omtu)) 8381 mtu -= (chk->send_size + omtu); 8382 else 8383 mtu = 0; 8384 to_out += (chk->send_size + omtu); 8385 /* Do clear IP_DF ? */ 8386 if (chk->flags & CHUNK_FLAGS_FRAGMENT_OK) { 8387 no_fragmentflg = 0; 8388 } 8389 if (chk->rec.chunk_id.can_take_data) 8390 chk->data = NULL; 8391 /* Mark things to be removed, if needed */ 8392 if ((chk->rec.chunk_id.id == SCTP_SELECTIVE_ACK) || 8393 (chk->rec.chunk_id.id == SCTP_NR_SELECTIVE_ACK) || /* EY */ 8394 (chk->rec.chunk_id.id == SCTP_HEARTBEAT_REQUEST) || 8395 (chk->rec.chunk_id.id == SCTP_HEARTBEAT_ACK) || 8396 (chk->rec.chunk_id.id == SCTP_SHUTDOWN) || 8397 (chk->rec.chunk_id.id == SCTP_SHUTDOWN_ACK) || 8398 (chk->rec.chunk_id.id == SCTP_OPERATION_ERROR) || 8399 (chk->rec.chunk_id.id == SCTP_COOKIE_ACK) || 8400 (chk->rec.chunk_id.id == SCTP_ECN_CWR) || 8401 (chk->rec.chunk_id.id == SCTP_PACKET_DROPPED) || 8402 (chk->rec.chunk_id.id == SCTP_ASCONF_ACK)) { 8403 if (chk->rec.chunk_id.id == SCTP_HEARTBEAT_REQUEST) { 8404 hbflag = 1; 8405 } 8406 /* remove these chunks at the end */ 8407 if ((chk->rec.chunk_id.id == SCTP_SELECTIVE_ACK) || 8408 (chk->rec.chunk_id.id == SCTP_NR_SELECTIVE_ACK)) { 8409 /* turn off the timer */ 8410 if (SCTP_OS_TIMER_PENDING(&stcb->asoc.dack_timer.timer)) { 8411 sctp_timer_stop(SCTP_TIMER_TYPE_RECV, 8412 inp, stcb, net, 8413 SCTP_FROM_SCTP_OUTPUT + SCTP_LOC_1); 8414 } 8415 } 8416 ctl_cnt++; 8417 } else { 8418 /* 8419 * Other chunks, since they have 8420 * timers running (i.e. COOKIE) we 8421 * just "trust" that it gets sent or 8422 * retransmitted. 8423 */ 8424 ctl_cnt++; 8425 if (chk->rec.chunk_id.id == SCTP_COOKIE_ECHO) { 8426 cookie = 1; 8427 no_out_cnt = 1; 8428 } else if (chk->rec.chunk_id.id == SCTP_ECN_ECHO) { 8429 /* 8430 * Increment ecne send count 8431 * here this means we may be 8432 * over-zealous in our 8433 * counting if the send 8434 * fails, but its the best 8435 * place to do it (we used 8436 * to do it in the queue of 8437 * the chunk, but that did 8438 * not tell how many times 8439 * it was sent. 8440 */ 8441 SCTP_STAT_INCR(sctps_sendecne); 8442 } 8443 chk->sent = SCTP_DATAGRAM_SENT; 8444 if (chk->whoTo == NULL) { 8445 chk->whoTo = net; 8446 atomic_add_int(&net->ref_count, 1); 8447 } 8448 chk->snd_count++; 8449 } 8450 if (mtu == 0) { 8451 /* 8452 * Ok we are out of room but we can 8453 * output without effecting the 8454 * flight size since this little guy 8455 * is a control only packet. 8456 */ 8457 if (asconf) { 8458 sctp_timer_start(SCTP_TIMER_TYPE_ASCONF, inp, stcb, net); 8459 /* 8460 * do NOT clear the asconf 8461 * flag as it is used to do 8462 * appropriate source 8463 * address selection. 8464 */ 8465 } 8466 if (cookie) { 8467 sctp_timer_start(SCTP_TIMER_TYPE_COOKIE, inp, stcb, net); 8468 cookie = 0; 8469 } 8470 /* Only HB or ASCONF advances time */ 8471 if (hbflag) { 8472 if (*now_filled == 0) { 8473 (void)SCTP_GETTIME_TIMEVAL(now); 8474 *now_filled = 1; 8475 } 8476 net->last_sent_time = *now; 8477 hbflag = 0; 8478 } 8479 if ((error = sctp_lowlevel_chunk_output(inp, stcb, net, 8480 (struct sockaddr *)&net->ro._l_addr, 8481 outchain, 8482 auth_offset, auth, 8483 stcb->asoc.authinfo.active_keyid, 8484 no_fragmentflg, 0, asconf, 8485 inp->sctp_lport, stcb->rport, 8486 htonl(stcb->asoc.peer_vtag), 8487 net->port, NULL, 8488 0, 0, 8489 so_locked))) { 8490 /* 8491 * error, we could not 8492 * output 8493 */ 8494 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Gak send error %d\n", error); 8495 if (from_where == 0) { 8496 SCTP_STAT_INCR(sctps_lowlevelerrusr); 8497 } 8498 if (error == ENOBUFS) { 8499 asoc->ifp_had_enobuf = 1; 8500 SCTP_STAT_INCR(sctps_lowlevelerr); 8501 } 8502 if (error == EHOSTUNREACH) { 8503 /* 8504 * Destination went 8505 * unreachable 8506 * during this send 8507 */ 8508 sctp_move_chunks_from_net(stcb, net); 8509 } 8510 *reason_code = 7; 8511 break; 8512 } else { 8513 asoc->ifp_had_enobuf = 0; 8514 } 8515 /* 8516 * increase the number we sent, if a 8517 * cookie is sent we don't tell them 8518 * any was sent out. 8519 */ 8520 outchain = endoutchain = NULL; 8521 auth = NULL; 8522 auth_offset = 0; 8523 if (!no_out_cnt) 8524 *num_out += ctl_cnt; 8525 /* recalc a clean slate and setup */ 8526 switch (net->ro._l_addr.sa.sa_family) { 8527 #ifdef INET 8528 case AF_INET: 8529 mtu = net->mtu - SCTP_MIN_V4_OVERHEAD; 8530 break; 8531 #endif 8532 #ifdef INET6 8533 case AF_INET6: 8534 mtu = net->mtu - SCTP_MIN_OVERHEAD; 8535 break; 8536 #endif 8537 default: 8538 /* TSNH */ 8539 mtu = net->mtu; 8540 break; 8541 } 8542 to_out = 0; 8543 no_fragmentflg = 1; 8544 } 8545 } 8546 } 8547 if (error != 0) { 8548 /* try next net */ 8549 continue; 8550 } 8551 /* JRI: if dest is in PF state, do not send data to it */ 8552 if ((asoc->sctp_cmt_on_off > 0) && 8553 (net != stcb->asoc.alternate) && 8554 (net->dest_state & SCTP_ADDR_PF)) { 8555 goto no_data_fill; 8556 } 8557 if (net->flight_size >= net->cwnd) { 8558 goto no_data_fill; 8559 } 8560 if ((asoc->sctp_cmt_on_off > 0) && 8561 (SCTP_BASE_SYSCTL(sctp_buffer_splitting) & SCTP_RECV_BUFFER_SPLITTING) && 8562 (net->flight_size > max_rwnd_per_dest)) { 8563 goto no_data_fill; 8564 } 8565 /* 8566 * We need a specific accounting for the usage of the send 8567 * buffer. We also need to check the number of messages per 8568 * net. For now, this is better than nothing and it disabled 8569 * by default... 8570 */ 8571 if ((asoc->sctp_cmt_on_off > 0) && 8572 (SCTP_BASE_SYSCTL(sctp_buffer_splitting) & SCTP_SEND_BUFFER_SPLITTING) && 8573 (max_send_per_dest > 0) && 8574 (net->flight_size > max_send_per_dest)) { 8575 goto no_data_fill; 8576 } 8577 /*********************/ 8578 /* Data transmission */ 8579 /*********************/ 8580 /* 8581 * if AUTH for DATA is required and no AUTH has been added 8582 * yet, account for this in the mtu now... if no data can be 8583 * bundled, this adjustment won't matter anyways since the 8584 * packet will be going out... 8585 */ 8586 data_auth_reqd = sctp_auth_is_required_chunk(SCTP_DATA, 8587 stcb->asoc.peer_auth_chunks); 8588 if (data_auth_reqd && (auth == NULL)) { 8589 mtu -= sctp_get_auth_chunk_len(stcb->asoc.peer_hmac_id); 8590 } 8591 /* now lets add any data within the MTU constraints */ 8592 switch (((struct sockaddr *)&net->ro._l_addr)->sa_family) { 8593 #ifdef INET 8594 case AF_INET: 8595 if (net->mtu > SCTP_MIN_V4_OVERHEAD) 8596 omtu = net->mtu - SCTP_MIN_V4_OVERHEAD; 8597 else 8598 omtu = 0; 8599 break; 8600 #endif 8601 #ifdef INET6 8602 case AF_INET6: 8603 if (net->mtu > SCTP_MIN_OVERHEAD) 8604 omtu = net->mtu - SCTP_MIN_OVERHEAD; 8605 else 8606 omtu = 0; 8607 break; 8608 #endif 8609 default: 8610 /* TSNH */ 8611 omtu = 0; 8612 break; 8613 } 8614 if ((((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || 8615 (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) && 8616 (skip_data_for_this_net == 0)) || 8617 (cookie)) { 8618 TAILQ_FOREACH_SAFE(chk, &asoc->send_queue, sctp_next, nchk) { 8619 if (no_data_chunks) { 8620 /* let only control go out */ 8621 *reason_code = 1; 8622 break; 8623 } 8624 if (net->flight_size >= net->cwnd) { 8625 /* skip this net, no room for data */ 8626 *reason_code = 2; 8627 break; 8628 } 8629 if ((chk->whoTo != NULL) && 8630 (chk->whoTo != net)) { 8631 /* Don't send the chunk on this net */ 8632 continue; 8633 } 8634 if (asoc->sctp_cmt_on_off == 0) { 8635 if ((asoc->alternate) && 8636 (asoc->alternate != net) && 8637 (chk->whoTo == NULL)) { 8638 continue; 8639 } else if ((net != asoc->primary_destination) && 8640 (asoc->alternate == NULL) && 8641 (chk->whoTo == NULL)) { 8642 continue; 8643 } 8644 } 8645 if ((chk->send_size > omtu) && ((chk->flags & CHUNK_FLAGS_FRAGMENT_OK) == 0)) { 8646 /*- 8647 * strange, we have a chunk that is 8648 * to big for its destination and 8649 * yet no fragment ok flag. 8650 * Something went wrong when the 8651 * PMTU changed...we did not mark 8652 * this chunk for some reason?? I 8653 * will fix it here by letting IP 8654 * fragment it for now and printing 8655 * a warning. This really should not 8656 * happen ... 8657 */ 8658 SCTP_PRINTF("Warning chunk of %d bytes > mtu:%d and yet PMTU disc missed\n", 8659 chk->send_size, mtu); 8660 chk->flags |= CHUNK_FLAGS_FRAGMENT_OK; 8661 } 8662 if (SCTP_BASE_SYSCTL(sctp_enable_sack_immediately) && 8663 ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) == SCTP_STATE_SHUTDOWN_PENDING)) { 8664 struct sctp_data_chunk *dchkh; 8665 8666 dchkh = mtod(chk->data, struct sctp_data_chunk *); 8667 dchkh->ch.chunk_flags |= SCTP_DATA_SACK_IMMEDIATELY; 8668 } 8669 if (((chk->send_size <= mtu) && (chk->send_size <= r_mtu)) || 8670 ((chk->flags & CHUNK_FLAGS_FRAGMENT_OK) && (chk->send_size <= asoc->peers_rwnd))) { 8671 /* ok we will add this one */ 8672 8673 /* 8674 * Add an AUTH chunk, if chunk 8675 * requires it, save the offset into 8676 * the chain for AUTH 8677 */ 8678 if (data_auth_reqd) { 8679 if (auth == NULL) { 8680 outchain = sctp_add_auth_chunk(outchain, 8681 &endoutchain, 8682 &auth, 8683 &auth_offset, 8684 stcb, 8685 SCTP_DATA); 8686 auth_keyid = chk->auth_keyid; 8687 override_ok = 0; 8688 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 8689 } else if (override_ok) { 8690 /* 8691 * use this data's 8692 * keyid 8693 */ 8694 auth_keyid = chk->auth_keyid; 8695 override_ok = 0; 8696 } else if (auth_keyid != chk->auth_keyid) { 8697 /* 8698 * different keyid, 8699 * so done bundling 8700 */ 8701 break; 8702 } 8703 } 8704 outchain = sctp_copy_mbufchain(chk->data, outchain, &endoutchain, 0, 8705 chk->send_size, chk->copy_by_ref); 8706 if (outchain == NULL) { 8707 SCTPDBG(SCTP_DEBUG_OUTPUT3, "No memory?\n"); 8708 if (!SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { 8709 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net); 8710 } 8711 *reason_code = 3; 8712 SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 8713 return (ENOMEM); 8714 } 8715 /* upate our MTU size */ 8716 /* Do clear IP_DF ? */ 8717 if (chk->flags & CHUNK_FLAGS_FRAGMENT_OK) { 8718 no_fragmentflg = 0; 8719 } 8720 /* unsigned subtraction of mtu */ 8721 if (mtu > chk->send_size) 8722 mtu -= chk->send_size; 8723 else 8724 mtu = 0; 8725 /* unsigned subtraction of r_mtu */ 8726 if (r_mtu > chk->send_size) 8727 r_mtu -= chk->send_size; 8728 else 8729 r_mtu = 0; 8730 8731 to_out += chk->send_size; 8732 if ((to_out > mx_mtu) && no_fragmentflg) { 8733 #ifdef INVARIANTS 8734 panic("Exceeding mtu of %d out size is %d", mx_mtu, to_out); 8735 #else 8736 SCTP_PRINTF("Exceeding mtu of %d out size is %d\n", 8737 mx_mtu, to_out); 8738 #endif 8739 } 8740 chk->window_probe = 0; 8741 data_list[bundle_at++] = chk; 8742 if (bundle_at >= SCTP_MAX_DATA_BUNDLING) { 8743 break; 8744 } 8745 if (chk->sent == SCTP_DATAGRAM_UNSENT) { 8746 if ((chk->rec.data.rcv_flags & SCTP_DATA_UNORDERED) == 0) { 8747 SCTP_STAT_INCR_COUNTER64(sctps_outorderchunks); 8748 } else { 8749 SCTP_STAT_INCR_COUNTER64(sctps_outunorderchunks); 8750 } 8751 if (((chk->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) == SCTP_DATA_LAST_FRAG) && 8752 ((chk->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG) == 0)) 8753 /* 8754 * Count number of 8755 * user msg's that 8756 * were fragmented 8757 * we do this by 8758 * counting when we 8759 * see a LAST 8760 * fragment only. 8761 */ 8762 SCTP_STAT_INCR_COUNTER64(sctps_fragusrmsgs); 8763 } 8764 if ((mtu == 0) || (r_mtu == 0) || (one_chunk)) { 8765 if ((one_chunk) && (stcb->asoc.total_flight == 0)) { 8766 data_list[0]->window_probe = 1; 8767 net->window_probe = 1; 8768 } 8769 break; 8770 } 8771 } else { 8772 /* 8773 * Must be sent in order of the 8774 * TSN's (on a network) 8775 */ 8776 break; 8777 } 8778 } /* for (chunk gather loop for this net) */ 8779 } /* if asoc.state OPEN */ 8780 no_data_fill: 8781 /* Is there something to send for this destination? */ 8782 if (outchain) { 8783 /* We may need to start a control timer or two */ 8784 if (asconf) { 8785 sctp_timer_start(SCTP_TIMER_TYPE_ASCONF, inp, 8786 stcb, net); 8787 /* 8788 * do NOT clear the asconf flag as it is 8789 * used to do appropriate source address 8790 * selection. 8791 */ 8792 } 8793 if (cookie) { 8794 sctp_timer_start(SCTP_TIMER_TYPE_COOKIE, inp, stcb, net); 8795 cookie = 0; 8796 } 8797 /* must start a send timer if data is being sent */ 8798 if (bundle_at && (!SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer))) { 8799 /* 8800 * no timer running on this destination 8801 * restart it. 8802 */ 8803 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net); 8804 } 8805 if (bundle_at || hbflag) { 8806 /* For data/asconf and hb set time */ 8807 if (*now_filled == 0) { 8808 (void)SCTP_GETTIME_TIMEVAL(now); 8809 *now_filled = 1; 8810 } 8811 net->last_sent_time = *now; 8812 } 8813 /* Now send it, if there is anything to send :> */ 8814 if ((error = sctp_lowlevel_chunk_output(inp, 8815 stcb, 8816 net, 8817 (struct sockaddr *)&net->ro._l_addr, 8818 outchain, 8819 auth_offset, 8820 auth, 8821 auth_keyid, 8822 no_fragmentflg, 8823 bundle_at, 8824 asconf, 8825 inp->sctp_lport, stcb->rport, 8826 htonl(stcb->asoc.peer_vtag), 8827 net->port, NULL, 8828 0, 0, 8829 so_locked))) { 8830 /* error, we could not output */ 8831 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Gak send error %d\n", error); 8832 if (from_where == 0) { 8833 SCTP_STAT_INCR(sctps_lowlevelerrusr); 8834 } 8835 if (error == ENOBUFS) { 8836 asoc->ifp_had_enobuf = 1; 8837 SCTP_STAT_INCR(sctps_lowlevelerr); 8838 } 8839 if (error == EHOSTUNREACH) { 8840 /* 8841 * Destination went unreachable 8842 * during this send 8843 */ 8844 sctp_move_chunks_from_net(stcb, net); 8845 } 8846 *reason_code = 6; 8847 /*- 8848 * I add this line to be paranoid. As far as 8849 * I can tell the continue, takes us back to 8850 * the top of the for, but just to make sure 8851 * I will reset these again here. 8852 */ 8853 ctl_cnt = bundle_at = 0; 8854 continue; /* This takes us back to the 8855 * for() for the nets. */ 8856 } else { 8857 asoc->ifp_had_enobuf = 0; 8858 } 8859 endoutchain = NULL; 8860 auth = NULL; 8861 auth_offset = 0; 8862 if (!no_out_cnt) { 8863 *num_out += (ctl_cnt + bundle_at); 8864 } 8865 if (bundle_at) { 8866 /* setup for a RTO measurement */ 8867 tsns_sent = data_list[0]->rec.data.tsn; 8868 /* fill time if not already filled */ 8869 if (*now_filled == 0) { 8870 (void)SCTP_GETTIME_TIMEVAL(&asoc->time_last_sent); 8871 *now_filled = 1; 8872 *now = asoc->time_last_sent; 8873 } else { 8874 asoc->time_last_sent = *now; 8875 } 8876 if (net->rto_needed) { 8877 data_list[0]->do_rtt = 1; 8878 net->rto_needed = 0; 8879 } 8880 SCTP_STAT_INCR_BY(sctps_senddata, bundle_at); 8881 sctp_clean_up_datalist(stcb, asoc, data_list, bundle_at, net); 8882 } 8883 if (one_chunk) { 8884 break; 8885 } 8886 } 8887 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { 8888 sctp_log_cwnd(stcb, net, tsns_sent, SCTP_CWND_LOG_FROM_SEND); 8889 } 8890 } 8891 if (old_start_at == NULL) { 8892 old_start_at = start_at; 8893 start_at = TAILQ_FIRST(&asoc->nets); 8894 if (old_start_at) 8895 goto again_one_more_time; 8896 } 8897 /* 8898 * At the end there should be no NON timed chunks hanging on this 8899 * queue. 8900 */ 8901 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { 8902 sctp_log_cwnd(stcb, net, *num_out, SCTP_CWND_LOG_FROM_SEND); 8903 } 8904 if ((*num_out == 0) && (*reason_code == 0)) { 8905 *reason_code = 4; 8906 } else { 8907 *reason_code = 5; 8908 } 8909 sctp_clean_up_ctl(stcb, asoc, so_locked); 8910 return (0); 8911 } 8912 8913 void 8914 sctp_queue_op_err(struct sctp_tcb *stcb, struct mbuf *op_err) 8915 { 8916 /*- 8917 * Prepend a OPERATIONAL_ERROR chunk header and put on the end of 8918 * the control chunk queue. 8919 */ 8920 struct sctp_chunkhdr *hdr; 8921 struct sctp_tmit_chunk *chk; 8922 struct mbuf *mat, *last_mbuf; 8923 uint32_t chunk_length; 8924 uint16_t padding_length; 8925 8926 SCTP_TCB_LOCK_ASSERT(stcb); 8927 SCTP_BUF_PREPEND(op_err, sizeof(struct sctp_chunkhdr), M_NOWAIT); 8928 if (op_err == NULL) { 8929 return; 8930 } 8931 last_mbuf = NULL; 8932 chunk_length = 0; 8933 for (mat = op_err; mat != NULL; mat = SCTP_BUF_NEXT(mat)) { 8934 chunk_length += SCTP_BUF_LEN(mat); 8935 if (SCTP_BUF_NEXT(mat) == NULL) { 8936 last_mbuf = mat; 8937 } 8938 } 8939 if (chunk_length > SCTP_MAX_CHUNK_LENGTH) { 8940 sctp_m_freem(op_err); 8941 return; 8942 } 8943 padding_length = chunk_length % 4; 8944 if (padding_length != 0) { 8945 padding_length = 4 - padding_length; 8946 } 8947 if (padding_length != 0) { 8948 if (sctp_add_pad_tombuf(last_mbuf, padding_length) == NULL) { 8949 sctp_m_freem(op_err); 8950 return; 8951 } 8952 } 8953 sctp_alloc_a_chunk(stcb, chk); 8954 if (chk == NULL) { 8955 /* no memory */ 8956 sctp_m_freem(op_err); 8957 return; 8958 } 8959 chk->copy_by_ref = 0; 8960 chk->send_size = (uint16_t)chunk_length; 8961 chk->sent = SCTP_DATAGRAM_UNSENT; 8962 chk->snd_count = 0; 8963 chk->asoc = &stcb->asoc; 8964 chk->data = op_err; 8965 chk->whoTo = NULL; 8966 chk->rec.chunk_id.id = SCTP_OPERATION_ERROR; 8967 chk->rec.chunk_id.can_take_data = 0; 8968 hdr = mtod(op_err, struct sctp_chunkhdr *); 8969 hdr->chunk_type = SCTP_OPERATION_ERROR; 8970 hdr->chunk_flags = 0; 8971 hdr->chunk_length = htons(chk->send_size); 8972 TAILQ_INSERT_TAIL(&chk->asoc->control_send_queue, chk, sctp_next); 8973 chk->asoc->ctrl_queue_cnt++; 8974 } 8975 8976 int 8977 sctp_send_cookie_echo(struct mbuf *m, 8978 int offset, 8979 struct sctp_tcb *stcb, 8980 struct sctp_nets *net) 8981 { 8982 /*- 8983 * pull out the cookie and put it at the front of the control chunk 8984 * queue. 8985 */ 8986 int at; 8987 struct mbuf *cookie; 8988 struct sctp_paramhdr param, *phdr; 8989 struct sctp_chunkhdr *hdr; 8990 struct sctp_tmit_chunk *chk; 8991 uint16_t ptype, plen; 8992 8993 SCTP_TCB_LOCK_ASSERT(stcb); 8994 /* First find the cookie in the param area */ 8995 cookie = NULL; 8996 at = offset + sizeof(struct sctp_init_chunk); 8997 for (;;) { 8998 phdr = sctp_get_next_param(m, at, ¶m, sizeof(param)); 8999 if (phdr == NULL) { 9000 return (-3); 9001 } 9002 ptype = ntohs(phdr->param_type); 9003 plen = ntohs(phdr->param_length); 9004 if (ptype == SCTP_STATE_COOKIE) { 9005 int pad; 9006 9007 /* found the cookie */ 9008 if ((pad = (plen % 4))) { 9009 plen += 4 - pad; 9010 } 9011 cookie = SCTP_M_COPYM(m, at, plen, M_NOWAIT); 9012 if (cookie == NULL) { 9013 /* No memory */ 9014 return (-2); 9015 } 9016 #ifdef SCTP_MBUF_LOGGING 9017 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { 9018 sctp_log_mbc(cookie, SCTP_MBUF_ICOPY); 9019 } 9020 #endif 9021 break; 9022 } 9023 at += SCTP_SIZE32(plen); 9024 } 9025 /* ok, we got the cookie lets change it into a cookie echo chunk */ 9026 /* first the change from param to cookie */ 9027 hdr = mtod(cookie, struct sctp_chunkhdr *); 9028 hdr->chunk_type = SCTP_COOKIE_ECHO; 9029 hdr->chunk_flags = 0; 9030 /* get the chunk stuff now and place it in the FRONT of the queue */ 9031 sctp_alloc_a_chunk(stcb, chk); 9032 if (chk == NULL) { 9033 /* no memory */ 9034 sctp_m_freem(cookie); 9035 return (-5); 9036 } 9037 chk->copy_by_ref = 0; 9038 chk->rec.chunk_id.id = SCTP_COOKIE_ECHO; 9039 chk->rec.chunk_id.can_take_data = 0; 9040 chk->flags = CHUNK_FLAGS_FRAGMENT_OK; 9041 chk->send_size = plen; 9042 chk->sent = SCTP_DATAGRAM_UNSENT; 9043 chk->snd_count = 0; 9044 chk->asoc = &stcb->asoc; 9045 chk->data = cookie; 9046 chk->whoTo = net; 9047 atomic_add_int(&chk->whoTo->ref_count, 1); 9048 TAILQ_INSERT_HEAD(&chk->asoc->control_send_queue, chk, sctp_next); 9049 chk->asoc->ctrl_queue_cnt++; 9050 return (0); 9051 } 9052 9053 void 9054 sctp_send_heartbeat_ack(struct sctp_tcb *stcb, 9055 struct mbuf *m, 9056 int offset, 9057 int chk_length, 9058 struct sctp_nets *net) 9059 { 9060 /* 9061 * take a HB request and make it into a HB ack and send it. 9062 */ 9063 struct mbuf *outchain; 9064 struct sctp_chunkhdr *chdr; 9065 struct sctp_tmit_chunk *chk; 9066 9067 9068 if (net == NULL) 9069 /* must have a net pointer */ 9070 return; 9071 9072 outchain = SCTP_M_COPYM(m, offset, chk_length, M_NOWAIT); 9073 if (outchain == NULL) { 9074 /* gak out of memory */ 9075 return; 9076 } 9077 #ifdef SCTP_MBUF_LOGGING 9078 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { 9079 sctp_log_mbc(outchain, SCTP_MBUF_ICOPY); 9080 } 9081 #endif 9082 chdr = mtod(outchain, struct sctp_chunkhdr *); 9083 chdr->chunk_type = SCTP_HEARTBEAT_ACK; 9084 chdr->chunk_flags = 0; 9085 if (chk_length % 4) { 9086 /* need pad */ 9087 uint32_t cpthis = 0; 9088 int padlen; 9089 9090 padlen = 4 - (chk_length % 4); 9091 m_copyback(outchain, chk_length, padlen, (caddr_t)&cpthis); 9092 } 9093 sctp_alloc_a_chunk(stcb, chk); 9094 if (chk == NULL) { 9095 /* no memory */ 9096 sctp_m_freem(outchain); 9097 return; 9098 } 9099 chk->copy_by_ref = 0; 9100 chk->rec.chunk_id.id = SCTP_HEARTBEAT_ACK; 9101 chk->rec.chunk_id.can_take_data = 1; 9102 chk->flags = 0; 9103 chk->send_size = chk_length; 9104 chk->sent = SCTP_DATAGRAM_UNSENT; 9105 chk->snd_count = 0; 9106 chk->asoc = &stcb->asoc; 9107 chk->data = outchain; 9108 chk->whoTo = net; 9109 atomic_add_int(&chk->whoTo->ref_count, 1); 9110 TAILQ_INSERT_TAIL(&chk->asoc->control_send_queue, chk, sctp_next); 9111 chk->asoc->ctrl_queue_cnt++; 9112 } 9113 9114 void 9115 sctp_send_cookie_ack(struct sctp_tcb *stcb) 9116 { 9117 /* formulate and queue a cookie-ack back to sender */ 9118 struct mbuf *cookie_ack; 9119 struct sctp_chunkhdr *hdr; 9120 struct sctp_tmit_chunk *chk; 9121 9122 SCTP_TCB_LOCK_ASSERT(stcb); 9123 9124 cookie_ack = sctp_get_mbuf_for_msg(sizeof(struct sctp_chunkhdr), 0, M_NOWAIT, 1, MT_HEADER); 9125 if (cookie_ack == NULL) { 9126 /* no mbuf's */ 9127 return; 9128 } 9129 SCTP_BUF_RESV_UF(cookie_ack, SCTP_MIN_OVERHEAD); 9130 sctp_alloc_a_chunk(stcb, chk); 9131 if (chk == NULL) { 9132 /* no memory */ 9133 sctp_m_freem(cookie_ack); 9134 return; 9135 } 9136 chk->copy_by_ref = 0; 9137 chk->rec.chunk_id.id = SCTP_COOKIE_ACK; 9138 chk->rec.chunk_id.can_take_data = 1; 9139 chk->flags = 0; 9140 chk->send_size = sizeof(struct sctp_chunkhdr); 9141 chk->sent = SCTP_DATAGRAM_UNSENT; 9142 chk->snd_count = 0; 9143 chk->asoc = &stcb->asoc; 9144 chk->data = cookie_ack; 9145 if (chk->asoc->last_control_chunk_from != NULL) { 9146 chk->whoTo = chk->asoc->last_control_chunk_from; 9147 atomic_add_int(&chk->whoTo->ref_count, 1); 9148 } else { 9149 chk->whoTo = NULL; 9150 } 9151 hdr = mtod(cookie_ack, struct sctp_chunkhdr *); 9152 hdr->chunk_type = SCTP_COOKIE_ACK; 9153 hdr->chunk_flags = 0; 9154 hdr->chunk_length = htons(chk->send_size); 9155 SCTP_BUF_LEN(cookie_ack) = chk->send_size; 9156 TAILQ_INSERT_TAIL(&chk->asoc->control_send_queue, chk, sctp_next); 9157 chk->asoc->ctrl_queue_cnt++; 9158 return; 9159 } 9160 9161 9162 void 9163 sctp_send_shutdown_ack(struct sctp_tcb *stcb, struct sctp_nets *net) 9164 { 9165 /* formulate and queue a SHUTDOWN-ACK back to the sender */ 9166 struct mbuf *m_shutdown_ack; 9167 struct sctp_shutdown_ack_chunk *ack_cp; 9168 struct sctp_tmit_chunk *chk; 9169 9170 m_shutdown_ack = sctp_get_mbuf_for_msg(sizeof(struct sctp_shutdown_ack_chunk), 0, M_NOWAIT, 1, MT_HEADER); 9171 if (m_shutdown_ack == NULL) { 9172 /* no mbuf's */ 9173 return; 9174 } 9175 SCTP_BUF_RESV_UF(m_shutdown_ack, SCTP_MIN_OVERHEAD); 9176 sctp_alloc_a_chunk(stcb, chk); 9177 if (chk == NULL) { 9178 /* no memory */ 9179 sctp_m_freem(m_shutdown_ack); 9180 return; 9181 } 9182 chk->copy_by_ref = 0; 9183 chk->rec.chunk_id.id = SCTP_SHUTDOWN_ACK; 9184 chk->rec.chunk_id.can_take_data = 1; 9185 chk->flags = 0; 9186 chk->send_size = sizeof(struct sctp_chunkhdr); 9187 chk->sent = SCTP_DATAGRAM_UNSENT; 9188 chk->snd_count = 0; 9189 chk->flags = 0; 9190 chk->asoc = &stcb->asoc; 9191 chk->data = m_shutdown_ack; 9192 chk->whoTo = net; 9193 if (chk->whoTo) { 9194 atomic_add_int(&chk->whoTo->ref_count, 1); 9195 } 9196 ack_cp = mtod(m_shutdown_ack, struct sctp_shutdown_ack_chunk *); 9197 ack_cp->ch.chunk_type = SCTP_SHUTDOWN_ACK; 9198 ack_cp->ch.chunk_flags = 0; 9199 ack_cp->ch.chunk_length = htons(chk->send_size); 9200 SCTP_BUF_LEN(m_shutdown_ack) = chk->send_size; 9201 TAILQ_INSERT_TAIL(&chk->asoc->control_send_queue, chk, sctp_next); 9202 chk->asoc->ctrl_queue_cnt++; 9203 return; 9204 } 9205 9206 void 9207 sctp_send_shutdown(struct sctp_tcb *stcb, struct sctp_nets *net) 9208 { 9209 /* formulate and queue a SHUTDOWN to the sender */ 9210 struct mbuf *m_shutdown; 9211 struct sctp_shutdown_chunk *shutdown_cp; 9212 struct sctp_tmit_chunk *chk; 9213 9214 TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) { 9215 if (chk->rec.chunk_id.id == SCTP_SHUTDOWN) { 9216 /* We already have a SHUTDOWN queued. Reuse it. */ 9217 if (chk->whoTo) { 9218 sctp_free_remote_addr(chk->whoTo); 9219 chk->whoTo = NULL; 9220 } 9221 break; 9222 } 9223 } 9224 if (chk == NULL) { 9225 m_shutdown = sctp_get_mbuf_for_msg(sizeof(struct sctp_shutdown_chunk), 0, M_NOWAIT, 1, MT_HEADER); 9226 if (m_shutdown == NULL) { 9227 /* no mbuf's */ 9228 return; 9229 } 9230 SCTP_BUF_RESV_UF(m_shutdown, SCTP_MIN_OVERHEAD); 9231 sctp_alloc_a_chunk(stcb, chk); 9232 if (chk == NULL) { 9233 /* no memory */ 9234 sctp_m_freem(m_shutdown); 9235 return; 9236 } 9237 chk->copy_by_ref = 0; 9238 chk->rec.chunk_id.id = SCTP_SHUTDOWN; 9239 chk->rec.chunk_id.can_take_data = 1; 9240 chk->flags = 0; 9241 chk->send_size = sizeof(struct sctp_shutdown_chunk); 9242 chk->sent = SCTP_DATAGRAM_UNSENT; 9243 chk->snd_count = 0; 9244 chk->flags = 0; 9245 chk->asoc = &stcb->asoc; 9246 chk->data = m_shutdown; 9247 chk->whoTo = net; 9248 if (chk->whoTo) { 9249 atomic_add_int(&chk->whoTo->ref_count, 1); 9250 } 9251 shutdown_cp = mtod(m_shutdown, struct sctp_shutdown_chunk *); 9252 shutdown_cp->ch.chunk_type = SCTP_SHUTDOWN; 9253 shutdown_cp->ch.chunk_flags = 0; 9254 shutdown_cp->ch.chunk_length = htons(chk->send_size); 9255 shutdown_cp->cumulative_tsn_ack = htonl(stcb->asoc.cumulative_tsn); 9256 SCTP_BUF_LEN(m_shutdown) = chk->send_size; 9257 TAILQ_INSERT_TAIL(&chk->asoc->control_send_queue, chk, sctp_next); 9258 chk->asoc->ctrl_queue_cnt++; 9259 } else { 9260 TAILQ_REMOVE(&stcb->asoc.control_send_queue, chk, sctp_next); 9261 chk->whoTo = net; 9262 if (chk->whoTo) { 9263 atomic_add_int(&chk->whoTo->ref_count, 1); 9264 } 9265 shutdown_cp = mtod(chk->data, struct sctp_shutdown_chunk *); 9266 shutdown_cp->cumulative_tsn_ack = htonl(stcb->asoc.cumulative_tsn); 9267 TAILQ_INSERT_TAIL(&stcb->asoc.control_send_queue, chk, sctp_next); 9268 } 9269 return; 9270 } 9271 9272 void 9273 sctp_send_asconf(struct sctp_tcb *stcb, struct sctp_nets *net, int addr_locked) 9274 { 9275 /* 9276 * formulate and queue an ASCONF to the peer. ASCONF parameters 9277 * should be queued on the assoc queue. 9278 */ 9279 struct sctp_tmit_chunk *chk; 9280 struct mbuf *m_asconf; 9281 int len; 9282 9283 SCTP_TCB_LOCK_ASSERT(stcb); 9284 9285 if ((!TAILQ_EMPTY(&stcb->asoc.asconf_send_queue)) && 9286 (!sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_MULTIPLE_ASCONFS))) { 9287 /* can't send a new one if there is one in flight already */ 9288 return; 9289 } 9290 /* compose an ASCONF chunk, maximum length is PMTU */ 9291 m_asconf = sctp_compose_asconf(stcb, &len, addr_locked); 9292 if (m_asconf == NULL) { 9293 return; 9294 } 9295 sctp_alloc_a_chunk(stcb, chk); 9296 if (chk == NULL) { 9297 /* no memory */ 9298 sctp_m_freem(m_asconf); 9299 return; 9300 } 9301 chk->copy_by_ref = 0; 9302 chk->rec.chunk_id.id = SCTP_ASCONF; 9303 chk->rec.chunk_id.can_take_data = 0; 9304 chk->flags = CHUNK_FLAGS_FRAGMENT_OK; 9305 chk->data = m_asconf; 9306 chk->send_size = len; 9307 chk->sent = SCTP_DATAGRAM_UNSENT; 9308 chk->snd_count = 0; 9309 chk->asoc = &stcb->asoc; 9310 chk->whoTo = net; 9311 if (chk->whoTo) { 9312 atomic_add_int(&chk->whoTo->ref_count, 1); 9313 } 9314 TAILQ_INSERT_TAIL(&chk->asoc->asconf_send_queue, chk, sctp_next); 9315 chk->asoc->ctrl_queue_cnt++; 9316 return; 9317 } 9318 9319 void 9320 sctp_send_asconf_ack(struct sctp_tcb *stcb) 9321 { 9322 /* 9323 * formulate and queue a asconf-ack back to sender. the asconf-ack 9324 * must be stored in the tcb. 9325 */ 9326 struct sctp_tmit_chunk *chk; 9327 struct sctp_asconf_ack *ack, *latest_ack; 9328 struct mbuf *m_ack; 9329 struct sctp_nets *net = NULL; 9330 9331 SCTP_TCB_LOCK_ASSERT(stcb); 9332 /* Get the latest ASCONF-ACK */ 9333 latest_ack = TAILQ_LAST(&stcb->asoc.asconf_ack_sent, sctp_asconf_ackhead); 9334 if (latest_ack == NULL) { 9335 return; 9336 } 9337 if (latest_ack->last_sent_to != NULL && 9338 latest_ack->last_sent_to == stcb->asoc.last_control_chunk_from) { 9339 /* we're doing a retransmission */ 9340 net = sctp_find_alternate_net(stcb, stcb->asoc.last_control_chunk_from, 0); 9341 if (net == NULL) { 9342 /* no alternate */ 9343 if (stcb->asoc.last_control_chunk_from == NULL) { 9344 if (stcb->asoc.alternate) { 9345 net = stcb->asoc.alternate; 9346 } else { 9347 net = stcb->asoc.primary_destination; 9348 } 9349 } else { 9350 net = stcb->asoc.last_control_chunk_from; 9351 } 9352 } 9353 } else { 9354 /* normal case */ 9355 if (stcb->asoc.last_control_chunk_from == NULL) { 9356 if (stcb->asoc.alternate) { 9357 net = stcb->asoc.alternate; 9358 } else { 9359 net = stcb->asoc.primary_destination; 9360 } 9361 } else { 9362 net = stcb->asoc.last_control_chunk_from; 9363 } 9364 } 9365 latest_ack->last_sent_to = net; 9366 9367 TAILQ_FOREACH(ack, &stcb->asoc.asconf_ack_sent, next) { 9368 if (ack->data == NULL) { 9369 continue; 9370 } 9371 /* copy the asconf_ack */ 9372 m_ack = SCTP_M_COPYM(ack->data, 0, M_COPYALL, M_NOWAIT); 9373 if (m_ack == NULL) { 9374 /* couldn't copy it */ 9375 return; 9376 } 9377 #ifdef SCTP_MBUF_LOGGING 9378 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { 9379 sctp_log_mbc(m_ack, SCTP_MBUF_ICOPY); 9380 } 9381 #endif 9382 9383 sctp_alloc_a_chunk(stcb, chk); 9384 if (chk == NULL) { 9385 /* no memory */ 9386 if (m_ack) 9387 sctp_m_freem(m_ack); 9388 return; 9389 } 9390 chk->copy_by_ref = 0; 9391 chk->rec.chunk_id.id = SCTP_ASCONF_ACK; 9392 chk->rec.chunk_id.can_take_data = 1; 9393 chk->flags = CHUNK_FLAGS_FRAGMENT_OK; 9394 chk->whoTo = net; 9395 if (chk->whoTo) { 9396 atomic_add_int(&chk->whoTo->ref_count, 1); 9397 } 9398 chk->data = m_ack; 9399 chk->send_size = ack->len; 9400 chk->sent = SCTP_DATAGRAM_UNSENT; 9401 chk->snd_count = 0; 9402 chk->asoc = &stcb->asoc; 9403 9404 TAILQ_INSERT_TAIL(&chk->asoc->control_send_queue, chk, sctp_next); 9405 chk->asoc->ctrl_queue_cnt++; 9406 } 9407 return; 9408 } 9409 9410 9411 static int 9412 sctp_chunk_retransmission(struct sctp_inpcb *inp, 9413 struct sctp_tcb *stcb, 9414 struct sctp_association *asoc, 9415 int *cnt_out, struct timeval *now, int *now_filled, int *fr_done, int so_locked 9416 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 9417 SCTP_UNUSED 9418 #endif 9419 ) 9420 { 9421 /*- 9422 * send out one MTU of retransmission. If fast_retransmit is 9423 * happening we ignore the cwnd. Otherwise we obey the cwnd and 9424 * rwnd. For a Cookie or Asconf in the control chunk queue we 9425 * retransmit them by themselves. 9426 * 9427 * For data chunks we will pick out the lowest TSN's in the sent_queue 9428 * marked for resend and bundle them all together (up to a MTU of 9429 * destination). The address to send to should have been 9430 * selected/changed where the retransmission was marked (i.e. in FR 9431 * or t3-timeout routines). 9432 */ 9433 struct sctp_tmit_chunk *data_list[SCTP_MAX_DATA_BUNDLING]; 9434 struct sctp_tmit_chunk *chk, *fwd; 9435 struct mbuf *m, *endofchain; 9436 struct sctp_nets *net = NULL; 9437 uint32_t tsns_sent = 0; 9438 int no_fragmentflg, bundle_at, cnt_thru; 9439 unsigned int mtu; 9440 int error, i, one_chunk, fwd_tsn, ctl_cnt, tmr_started; 9441 struct sctp_auth_chunk *auth = NULL; 9442 uint32_t auth_offset = 0; 9443 uint16_t auth_keyid; 9444 int override_ok = 1; 9445 int data_auth_reqd = 0; 9446 uint32_t dmtu = 0; 9447 9448 SCTP_TCB_LOCK_ASSERT(stcb); 9449 tmr_started = ctl_cnt = bundle_at = error = 0; 9450 no_fragmentflg = 1; 9451 fwd_tsn = 0; 9452 *cnt_out = 0; 9453 fwd = NULL; 9454 endofchain = m = NULL; 9455 auth_keyid = stcb->asoc.authinfo.active_keyid; 9456 #ifdef SCTP_AUDITING_ENABLED 9457 sctp_audit_log(0xC3, 1); 9458 #endif 9459 if ((TAILQ_EMPTY(&asoc->sent_queue)) && 9460 (TAILQ_EMPTY(&asoc->control_send_queue))) { 9461 SCTPDBG(SCTP_DEBUG_OUTPUT1, "SCTP hits empty queue with cnt set to %d?\n", 9462 asoc->sent_queue_retran_cnt); 9463 asoc->sent_queue_cnt = 0; 9464 asoc->sent_queue_cnt_removeable = 0; 9465 /* send back 0/0 so we enter normal transmission */ 9466 *cnt_out = 0; 9467 return (0); 9468 } 9469 TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { 9470 if ((chk->rec.chunk_id.id == SCTP_COOKIE_ECHO) || 9471 (chk->rec.chunk_id.id == SCTP_STREAM_RESET) || 9472 (chk->rec.chunk_id.id == SCTP_FORWARD_CUM_TSN)) { 9473 if (chk->sent != SCTP_DATAGRAM_RESEND) { 9474 continue; 9475 } 9476 if (chk->rec.chunk_id.id == SCTP_STREAM_RESET) { 9477 if (chk != asoc->str_reset) { 9478 /* 9479 * not eligible for retran if its 9480 * not ours 9481 */ 9482 continue; 9483 } 9484 } 9485 ctl_cnt++; 9486 if (chk->rec.chunk_id.id == SCTP_FORWARD_CUM_TSN) { 9487 fwd_tsn = 1; 9488 } 9489 /* 9490 * Add an AUTH chunk, if chunk requires it save the 9491 * offset into the chain for AUTH 9492 */ 9493 if ((auth == NULL) && 9494 (sctp_auth_is_required_chunk(chk->rec.chunk_id.id, 9495 stcb->asoc.peer_auth_chunks))) { 9496 m = sctp_add_auth_chunk(m, &endofchain, 9497 &auth, &auth_offset, 9498 stcb, 9499 chk->rec.chunk_id.id); 9500 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 9501 } 9502 m = sctp_copy_mbufchain(chk->data, m, &endofchain, 0, chk->send_size, chk->copy_by_ref); 9503 break; 9504 } 9505 } 9506 one_chunk = 0; 9507 cnt_thru = 0; 9508 /* do we have control chunks to retransmit? */ 9509 if (m != NULL) { 9510 /* Start a timer no matter if we succeed or fail */ 9511 if (chk->rec.chunk_id.id == SCTP_COOKIE_ECHO) { 9512 sctp_timer_start(SCTP_TIMER_TYPE_COOKIE, inp, stcb, chk->whoTo); 9513 } else if (chk->rec.chunk_id.id == SCTP_ASCONF) 9514 sctp_timer_start(SCTP_TIMER_TYPE_ASCONF, inp, stcb, chk->whoTo); 9515 chk->snd_count++; /* update our count */ 9516 if ((error = sctp_lowlevel_chunk_output(inp, stcb, chk->whoTo, 9517 (struct sockaddr *)&chk->whoTo->ro._l_addr, m, 9518 auth_offset, auth, stcb->asoc.authinfo.active_keyid, 9519 no_fragmentflg, 0, 0, 9520 inp->sctp_lport, stcb->rport, htonl(stcb->asoc.peer_vtag), 9521 chk->whoTo->port, NULL, 9522 0, 0, 9523 so_locked))) { 9524 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Gak send error %d\n", error); 9525 if (error == ENOBUFS) { 9526 asoc->ifp_had_enobuf = 1; 9527 SCTP_STAT_INCR(sctps_lowlevelerr); 9528 } 9529 return (error); 9530 } else { 9531 asoc->ifp_had_enobuf = 0; 9532 } 9533 endofchain = NULL; 9534 auth = NULL; 9535 auth_offset = 0; 9536 /* 9537 * We don't want to mark the net->sent time here since this 9538 * we use this for HB and retrans cannot measure RTT 9539 */ 9540 /* (void)SCTP_GETTIME_TIMEVAL(&chk->whoTo->last_sent_time); */ 9541 *cnt_out += 1; 9542 chk->sent = SCTP_DATAGRAM_SENT; 9543 sctp_ucount_decr(stcb->asoc.sent_queue_retran_cnt); 9544 if (fwd_tsn == 0) { 9545 return (0); 9546 } else { 9547 /* Clean up the fwd-tsn list */ 9548 sctp_clean_up_ctl(stcb, asoc, so_locked); 9549 return (0); 9550 } 9551 } 9552 /* 9553 * Ok, it is just data retransmission we need to do or that and a 9554 * fwd-tsn with it all. 9555 */ 9556 if (TAILQ_EMPTY(&asoc->sent_queue)) { 9557 return (SCTP_RETRAN_DONE); 9558 } 9559 if ((SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_ECHOED) || 9560 (SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_WAIT)) { 9561 /* not yet open, resend the cookie and that is it */ 9562 return (1); 9563 } 9564 #ifdef SCTP_AUDITING_ENABLED 9565 sctp_auditing(20, inp, stcb, NULL); 9566 #endif 9567 data_auth_reqd = sctp_auth_is_required_chunk(SCTP_DATA, stcb->asoc.peer_auth_chunks); 9568 TAILQ_FOREACH(chk, &asoc->sent_queue, sctp_next) { 9569 if (chk->sent != SCTP_DATAGRAM_RESEND) { 9570 /* No, not sent to this net or not ready for rtx */ 9571 continue; 9572 } 9573 if (chk->data == NULL) { 9574 SCTP_PRINTF("TSN:%x chk->snd_count:%d chk->sent:%d can't retran - no data\n", 9575 chk->rec.data.tsn, chk->snd_count, chk->sent); 9576 continue; 9577 } 9578 if ((SCTP_BASE_SYSCTL(sctp_max_retran_chunk)) && 9579 (chk->snd_count >= SCTP_BASE_SYSCTL(sctp_max_retran_chunk))) { 9580 struct mbuf *op_err; 9581 char msg[SCTP_DIAG_INFO_LEN]; 9582 9583 snprintf(msg, sizeof(msg), "TSN %8.8x retransmitted %d times, giving up", 9584 chk->rec.data.tsn, chk->snd_count); 9585 op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), 9586 msg); 9587 atomic_add_int(&stcb->asoc.refcnt, 1); 9588 sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, 9589 so_locked); 9590 SCTP_TCB_LOCK(stcb); 9591 atomic_subtract_int(&stcb->asoc.refcnt, 1); 9592 return (SCTP_RETRAN_EXIT); 9593 } 9594 /* pick up the net */ 9595 net = chk->whoTo; 9596 switch (net->ro._l_addr.sa.sa_family) { 9597 #ifdef INET 9598 case AF_INET: 9599 mtu = net->mtu - SCTP_MIN_V4_OVERHEAD; 9600 break; 9601 #endif 9602 #ifdef INET6 9603 case AF_INET6: 9604 mtu = net->mtu - SCTP_MIN_OVERHEAD; 9605 break; 9606 #endif 9607 default: 9608 /* TSNH */ 9609 mtu = net->mtu; 9610 break; 9611 } 9612 9613 if ((asoc->peers_rwnd < mtu) && (asoc->total_flight > 0)) { 9614 /* No room in peers rwnd */ 9615 uint32_t tsn; 9616 9617 tsn = asoc->last_acked_seq + 1; 9618 if (tsn == chk->rec.data.tsn) { 9619 /* 9620 * we make a special exception for this 9621 * case. The peer has no rwnd but is missing 9622 * the lowest chunk.. which is probably what 9623 * is holding up the rwnd. 9624 */ 9625 goto one_chunk_around; 9626 } 9627 return (1); 9628 } 9629 one_chunk_around: 9630 if (asoc->peers_rwnd < mtu) { 9631 one_chunk = 1; 9632 if ((asoc->peers_rwnd == 0) && 9633 (asoc->total_flight == 0)) { 9634 chk->window_probe = 1; 9635 chk->whoTo->window_probe = 1; 9636 } 9637 } 9638 #ifdef SCTP_AUDITING_ENABLED 9639 sctp_audit_log(0xC3, 2); 9640 #endif 9641 bundle_at = 0; 9642 m = NULL; 9643 net->fast_retran_ip = 0; 9644 if (chk->rec.data.doing_fast_retransmit == 0) { 9645 /* 9646 * if no FR in progress skip destination that have 9647 * flight_size > cwnd. 9648 */ 9649 if (net->flight_size >= net->cwnd) { 9650 continue; 9651 } 9652 } else { 9653 /* 9654 * Mark the destination net to have FR recovery 9655 * limits put on it. 9656 */ 9657 *fr_done = 1; 9658 net->fast_retran_ip = 1; 9659 } 9660 9661 /* 9662 * if no AUTH is yet included and this chunk requires it, 9663 * make sure to account for it. We don't apply the size 9664 * until the AUTH chunk is actually added below in case 9665 * there is no room for this chunk. 9666 */ 9667 if (data_auth_reqd && (auth == NULL)) { 9668 dmtu = sctp_get_auth_chunk_len(stcb->asoc.peer_hmac_id); 9669 } else 9670 dmtu = 0; 9671 9672 if ((chk->send_size <= (mtu - dmtu)) || 9673 (chk->flags & CHUNK_FLAGS_FRAGMENT_OK)) { 9674 /* ok we will add this one */ 9675 if (data_auth_reqd) { 9676 if (auth == NULL) { 9677 m = sctp_add_auth_chunk(m, 9678 &endofchain, 9679 &auth, 9680 &auth_offset, 9681 stcb, 9682 SCTP_DATA); 9683 auth_keyid = chk->auth_keyid; 9684 override_ok = 0; 9685 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 9686 } else if (override_ok) { 9687 auth_keyid = chk->auth_keyid; 9688 override_ok = 0; 9689 } else if (chk->auth_keyid != auth_keyid) { 9690 /* different keyid, so done bundling */ 9691 break; 9692 } 9693 } 9694 m = sctp_copy_mbufchain(chk->data, m, &endofchain, 0, chk->send_size, chk->copy_by_ref); 9695 if (m == NULL) { 9696 SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 9697 return (ENOMEM); 9698 } 9699 /* Do clear IP_DF ? */ 9700 if (chk->flags & CHUNK_FLAGS_FRAGMENT_OK) { 9701 no_fragmentflg = 0; 9702 } 9703 /* upate our MTU size */ 9704 if (mtu > (chk->send_size + dmtu)) 9705 mtu -= (chk->send_size + dmtu); 9706 else 9707 mtu = 0; 9708 data_list[bundle_at++] = chk; 9709 if (one_chunk && (asoc->total_flight <= 0)) { 9710 SCTP_STAT_INCR(sctps_windowprobed); 9711 } 9712 } 9713 if (one_chunk == 0) { 9714 /* 9715 * now are there anymore forward from chk to pick 9716 * up? 9717 */ 9718 for (fwd = TAILQ_NEXT(chk, sctp_next); fwd != NULL; fwd = TAILQ_NEXT(fwd, sctp_next)) { 9719 if (fwd->sent != SCTP_DATAGRAM_RESEND) { 9720 /* Nope, not for retran */ 9721 continue; 9722 } 9723 if (fwd->whoTo != net) { 9724 /* Nope, not the net in question */ 9725 continue; 9726 } 9727 if (data_auth_reqd && (auth == NULL)) { 9728 dmtu = sctp_get_auth_chunk_len(stcb->asoc.peer_hmac_id); 9729 } else 9730 dmtu = 0; 9731 if (fwd->send_size <= (mtu - dmtu)) { 9732 if (data_auth_reqd) { 9733 if (auth == NULL) { 9734 m = sctp_add_auth_chunk(m, 9735 &endofchain, 9736 &auth, 9737 &auth_offset, 9738 stcb, 9739 SCTP_DATA); 9740 auth_keyid = fwd->auth_keyid; 9741 override_ok = 0; 9742 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 9743 } else if (override_ok) { 9744 auth_keyid = fwd->auth_keyid; 9745 override_ok = 0; 9746 } else if (fwd->auth_keyid != auth_keyid) { 9747 /* 9748 * different keyid, 9749 * so done bundling 9750 */ 9751 break; 9752 } 9753 } 9754 m = sctp_copy_mbufchain(fwd->data, m, &endofchain, 0, fwd->send_size, fwd->copy_by_ref); 9755 if (m == NULL) { 9756 SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 9757 return (ENOMEM); 9758 } 9759 /* Do clear IP_DF ? */ 9760 if (fwd->flags & CHUNK_FLAGS_FRAGMENT_OK) { 9761 no_fragmentflg = 0; 9762 } 9763 /* upate our MTU size */ 9764 if (mtu > (fwd->send_size + dmtu)) 9765 mtu -= (fwd->send_size + dmtu); 9766 else 9767 mtu = 0; 9768 data_list[bundle_at++] = fwd; 9769 if (bundle_at >= SCTP_MAX_DATA_BUNDLING) { 9770 break; 9771 } 9772 } else { 9773 /* can't fit so we are done */ 9774 break; 9775 } 9776 } 9777 } 9778 /* Is there something to send for this destination? */ 9779 if (m) { 9780 /* 9781 * No matter if we fail/or succeed we should start a 9782 * timer. A failure is like a lost IP packet :-) 9783 */ 9784 if (!SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { 9785 /* 9786 * no timer running on this destination 9787 * restart it. 9788 */ 9789 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net); 9790 tmr_started = 1; 9791 } 9792 /* Now lets send it, if there is anything to send :> */ 9793 if ((error = sctp_lowlevel_chunk_output(inp, stcb, net, 9794 (struct sockaddr *)&net->ro._l_addr, m, 9795 auth_offset, auth, auth_keyid, 9796 no_fragmentflg, 0, 0, 9797 inp->sctp_lport, stcb->rport, htonl(stcb->asoc.peer_vtag), 9798 net->port, NULL, 9799 0, 0, 9800 so_locked))) { 9801 /* error, we could not output */ 9802 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Gak send error %d\n", error); 9803 if (error == ENOBUFS) { 9804 asoc->ifp_had_enobuf = 1; 9805 SCTP_STAT_INCR(sctps_lowlevelerr); 9806 } 9807 return (error); 9808 } else { 9809 asoc->ifp_had_enobuf = 0; 9810 } 9811 endofchain = NULL; 9812 auth = NULL; 9813 auth_offset = 0; 9814 /* For HB's */ 9815 /* 9816 * We don't want to mark the net->sent time here 9817 * since this we use this for HB and retrans cannot 9818 * measure RTT 9819 */ 9820 /* (void)SCTP_GETTIME_TIMEVAL(&net->last_sent_time); */ 9821 9822 /* For auto-close */ 9823 cnt_thru++; 9824 if (*now_filled == 0) { 9825 (void)SCTP_GETTIME_TIMEVAL(&asoc->time_last_sent); 9826 *now = asoc->time_last_sent; 9827 *now_filled = 1; 9828 } else { 9829 asoc->time_last_sent = *now; 9830 } 9831 *cnt_out += bundle_at; 9832 #ifdef SCTP_AUDITING_ENABLED 9833 sctp_audit_log(0xC4, bundle_at); 9834 #endif 9835 if (bundle_at) { 9836 tsns_sent = data_list[0]->rec.data.tsn; 9837 } 9838 for (i = 0; i < bundle_at; i++) { 9839 SCTP_STAT_INCR(sctps_sendretransdata); 9840 data_list[i]->sent = SCTP_DATAGRAM_SENT; 9841 /* 9842 * When we have a revoked data, and we 9843 * retransmit it, then we clear the revoked 9844 * flag since this flag dictates if we 9845 * subtracted from the fs 9846 */ 9847 if (data_list[i]->rec.data.chunk_was_revoked) { 9848 /* Deflate the cwnd */ 9849 data_list[i]->whoTo->cwnd -= data_list[i]->book_size; 9850 data_list[i]->rec.data.chunk_was_revoked = 0; 9851 } 9852 data_list[i]->snd_count++; 9853 sctp_ucount_decr(asoc->sent_queue_retran_cnt); 9854 /* record the time */ 9855 data_list[i]->sent_rcv_time = asoc->time_last_sent; 9856 if (data_list[i]->book_size_scale) { 9857 /* 9858 * need to double the book size on 9859 * this one 9860 */ 9861 data_list[i]->book_size_scale = 0; 9862 /* 9863 * Since we double the booksize, we 9864 * must also double the output queue 9865 * size, since this get shrunk when 9866 * we free by this amount. 9867 */ 9868 atomic_add_int(&((asoc)->total_output_queue_size), data_list[i]->book_size); 9869 data_list[i]->book_size *= 2; 9870 9871 9872 } else { 9873 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) { 9874 sctp_log_rwnd(SCTP_DECREASE_PEER_RWND, 9875 asoc->peers_rwnd, data_list[i]->send_size, SCTP_BASE_SYSCTL(sctp_peer_chunk_oh)); 9876 } 9877 asoc->peers_rwnd = sctp_sbspace_sub(asoc->peers_rwnd, 9878 (uint32_t)(data_list[i]->send_size + 9879 SCTP_BASE_SYSCTL(sctp_peer_chunk_oh))); 9880 } 9881 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) { 9882 sctp_misc_ints(SCTP_FLIGHT_LOG_UP_RSND, 9883 data_list[i]->whoTo->flight_size, 9884 data_list[i]->book_size, 9885 (uint32_t)(uintptr_t)data_list[i]->whoTo, 9886 data_list[i]->rec.data.tsn); 9887 } 9888 sctp_flight_size_increase(data_list[i]); 9889 sctp_total_flight_increase(stcb, data_list[i]); 9890 if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) { 9891 /* SWS sender side engages */ 9892 asoc->peers_rwnd = 0; 9893 } 9894 if ((i == 0) && 9895 (data_list[i]->rec.data.doing_fast_retransmit)) { 9896 SCTP_STAT_INCR(sctps_sendfastretrans); 9897 if ((data_list[i] == TAILQ_FIRST(&asoc->sent_queue)) && 9898 (tmr_started == 0)) { 9899 /*- 9900 * ok we just fast-retrans'd 9901 * the lowest TSN, i.e the 9902 * first on the list. In 9903 * this case we want to give 9904 * some more time to get a 9905 * SACK back without a 9906 * t3-expiring. 9907 */ 9908 sctp_timer_stop(SCTP_TIMER_TYPE_SEND, inp, stcb, net, 9909 SCTP_FROM_SCTP_OUTPUT + SCTP_LOC_2); 9910 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net); 9911 } 9912 } 9913 } 9914 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { 9915 sctp_log_cwnd(stcb, net, tsns_sent, SCTP_CWND_LOG_FROM_RESEND); 9916 } 9917 #ifdef SCTP_AUDITING_ENABLED 9918 sctp_auditing(21, inp, stcb, NULL); 9919 #endif 9920 } else { 9921 /* None will fit */ 9922 return (1); 9923 } 9924 if (asoc->sent_queue_retran_cnt <= 0) { 9925 /* all done we have no more to retran */ 9926 asoc->sent_queue_retran_cnt = 0; 9927 break; 9928 } 9929 if (one_chunk) { 9930 /* No more room in rwnd */ 9931 return (1); 9932 } 9933 /* stop the for loop here. we sent out a packet */ 9934 break; 9935 } 9936 return (0); 9937 } 9938 9939 static void 9940 sctp_timer_validation(struct sctp_inpcb *inp, 9941 struct sctp_tcb *stcb, 9942 struct sctp_association *asoc) 9943 { 9944 struct sctp_nets *net; 9945 9946 /* Validate that a timer is running somewhere */ 9947 TAILQ_FOREACH(net, &asoc->nets, sctp_next) { 9948 if (SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { 9949 /* Here is a timer */ 9950 return; 9951 } 9952 } 9953 SCTP_TCB_LOCK_ASSERT(stcb); 9954 /* Gak, we did not have a timer somewhere */ 9955 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Deadlock avoided starting timer on a dest at retran\n"); 9956 if (asoc->alternate) { 9957 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, asoc->alternate); 9958 } else { 9959 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, asoc->primary_destination); 9960 } 9961 return; 9962 } 9963 9964 void 9965 sctp_chunk_output(struct sctp_inpcb *inp, 9966 struct sctp_tcb *stcb, 9967 int from_where, 9968 int so_locked 9969 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 9970 SCTP_UNUSED 9971 #endif 9972 ) 9973 { 9974 /*- 9975 * Ok this is the generic chunk service queue. we must do the 9976 * following: 9977 * - See if there are retransmits pending, if so we must 9978 * do these first. 9979 * - Service the stream queue that is next, moving any 9980 * message (note I must get a complete message i.e. 9981 * FIRST/MIDDLE and LAST to the out queue in one pass) and assigning 9982 * TSN's 9983 * - Check to see if the cwnd/rwnd allows any output, if so we 9984 * go ahead and fomulate and send the low level chunks. Making sure 9985 * to combine any control in the control chunk queue also. 9986 */ 9987 struct sctp_association *asoc; 9988 struct sctp_nets *net; 9989 int error = 0, num_out, tot_out = 0, ret = 0, reason_code; 9990 unsigned int burst_cnt = 0; 9991 struct timeval now; 9992 int now_filled = 0; 9993 int nagle_on; 9994 int frag_point = sctp_get_frag_point(stcb, &stcb->asoc); 9995 int un_sent = 0; 9996 int fr_done; 9997 unsigned int tot_frs = 0; 9998 9999 asoc = &stcb->asoc; 10000 do_it_again: 10001 /* The Nagle algorithm is only applied when handling a send call. */ 10002 if (from_where == SCTP_OUTPUT_FROM_USR_SEND) { 10003 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NODELAY)) { 10004 nagle_on = 0; 10005 } else { 10006 nagle_on = 1; 10007 } 10008 } else { 10009 nagle_on = 0; 10010 } 10011 SCTP_TCB_LOCK_ASSERT(stcb); 10012 10013 un_sent = (stcb->asoc.total_output_queue_size - stcb->asoc.total_flight); 10014 10015 if ((un_sent <= 0) && 10016 (TAILQ_EMPTY(&asoc->control_send_queue)) && 10017 (TAILQ_EMPTY(&asoc->asconf_send_queue)) && 10018 (asoc->sent_queue_retran_cnt == 0) && 10019 (asoc->trigger_reset == 0)) { 10020 /* Nothing to do unless there is something to be sent left */ 10021 return; 10022 } 10023 /* 10024 * Do we have something to send, data or control AND a sack timer 10025 * running, if so piggy-back the sack. 10026 */ 10027 if (SCTP_OS_TIMER_PENDING(&stcb->asoc.dack_timer.timer)) { 10028 sctp_send_sack(stcb, so_locked); 10029 (void)SCTP_OS_TIMER_STOP(&stcb->asoc.dack_timer.timer); 10030 } 10031 while (asoc->sent_queue_retran_cnt) { 10032 /*- 10033 * Ok, it is retransmission time only, we send out only ONE 10034 * packet with a single call off to the retran code. 10035 */ 10036 if (from_where == SCTP_OUTPUT_FROM_COOKIE_ACK) { 10037 /*- 10038 * Special hook for handling cookiess discarded 10039 * by peer that carried data. Send cookie-ack only 10040 * and then the next call with get the retran's. 10041 */ 10042 (void)sctp_med_chunk_output(inp, stcb, asoc, &num_out, &reason_code, 1, 10043 from_where, 10044 &now, &now_filled, frag_point, so_locked); 10045 return; 10046 } else if (from_where != SCTP_OUTPUT_FROM_HB_TMR) { 10047 /* if its not from a HB then do it */ 10048 fr_done = 0; 10049 ret = sctp_chunk_retransmission(inp, stcb, asoc, &num_out, &now, &now_filled, &fr_done, so_locked); 10050 if (fr_done) { 10051 tot_frs++; 10052 } 10053 } else { 10054 /* 10055 * its from any other place, we don't allow retran 10056 * output (only control) 10057 */ 10058 ret = 1; 10059 } 10060 if (ret > 0) { 10061 /* Can't send anymore */ 10062 /*- 10063 * now lets push out control by calling med-level 10064 * output once. this assures that we WILL send HB's 10065 * if queued too. 10066 */ 10067 (void)sctp_med_chunk_output(inp, stcb, asoc, &num_out, &reason_code, 1, 10068 from_where, 10069 &now, &now_filled, frag_point, so_locked); 10070 #ifdef SCTP_AUDITING_ENABLED 10071 sctp_auditing(8, inp, stcb, NULL); 10072 #endif 10073 sctp_timer_validation(inp, stcb, asoc); 10074 return; 10075 } 10076 if (ret < 0) { 10077 /*- 10078 * The count was off.. retran is not happening so do 10079 * the normal retransmission. 10080 */ 10081 #ifdef SCTP_AUDITING_ENABLED 10082 sctp_auditing(9, inp, stcb, NULL); 10083 #endif 10084 if (ret == SCTP_RETRAN_EXIT) { 10085 return; 10086 } 10087 break; 10088 } 10089 if (from_where == SCTP_OUTPUT_FROM_T3) { 10090 /* Only one transmission allowed out of a timeout */ 10091 #ifdef SCTP_AUDITING_ENABLED 10092 sctp_auditing(10, inp, stcb, NULL); 10093 #endif 10094 /* Push out any control */ 10095 (void)sctp_med_chunk_output(inp, stcb, asoc, &num_out, &reason_code, 1, from_where, 10096 &now, &now_filled, frag_point, so_locked); 10097 return; 10098 } 10099 if ((asoc->fr_max_burst > 0) && (tot_frs >= asoc->fr_max_burst)) { 10100 /* Hit FR burst limit */ 10101 return; 10102 } 10103 if ((num_out == 0) && (ret == 0)) { 10104 /* No more retrans to send */ 10105 break; 10106 } 10107 } 10108 #ifdef SCTP_AUDITING_ENABLED 10109 sctp_auditing(12, inp, stcb, NULL); 10110 #endif 10111 /* Check for bad destinations, if they exist move chunks around. */ 10112 TAILQ_FOREACH(net, &asoc->nets, sctp_next) { 10113 if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { 10114 /*- 10115 * if possible move things off of this address we 10116 * still may send below due to the dormant state but 10117 * we try to find an alternate address to send to 10118 * and if we have one we move all queued data on the 10119 * out wheel to this alternate address. 10120 */ 10121 if (net->ref_count > 1) 10122 sctp_move_chunks_from_net(stcb, net); 10123 } else { 10124 /*- 10125 * if ((asoc->sat_network) || (net->addr_is_local)) 10126 * { burst_limit = asoc->max_burst * 10127 * SCTP_SAT_NETWORK_BURST_INCR; } 10128 */ 10129 if (asoc->max_burst > 0) { 10130 if (SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst)) { 10131 if ((net->flight_size + (asoc->max_burst * net->mtu)) < net->cwnd) { 10132 /* 10133 * JRS - Use the congestion 10134 * control given in the 10135 * congestion control module 10136 */ 10137 asoc->cc_functions.sctp_cwnd_update_after_output(stcb, net, asoc->max_burst); 10138 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_MAXBURST_ENABLE) { 10139 sctp_log_maxburst(stcb, net, 0, asoc->max_burst, SCTP_MAX_BURST_APPLIED); 10140 } 10141 SCTP_STAT_INCR(sctps_maxburstqueued); 10142 } 10143 net->fast_retran_ip = 0; 10144 } else { 10145 if (net->flight_size == 0) { 10146 /* 10147 * Should be decaying the 10148 * cwnd here 10149 */ 10150 ; 10151 } 10152 } 10153 } 10154 } 10155 10156 } 10157 burst_cnt = 0; 10158 do { 10159 error = sctp_med_chunk_output(inp, stcb, asoc, &num_out, 10160 &reason_code, 0, from_where, 10161 &now, &now_filled, frag_point, so_locked); 10162 if (error) { 10163 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Error %d was returned from med-c-op\n", error); 10164 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_MAXBURST_ENABLE) { 10165 sctp_log_maxburst(stcb, asoc->primary_destination, error, burst_cnt, SCTP_MAX_BURST_ERROR_STOP); 10166 } 10167 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { 10168 sctp_log_cwnd(stcb, NULL, error, SCTP_SEND_NOW_COMPLETES); 10169 sctp_log_cwnd(stcb, NULL, 0xdeadbeef, SCTP_SEND_NOW_COMPLETES); 10170 } 10171 break; 10172 } 10173 SCTPDBG(SCTP_DEBUG_OUTPUT3, "m-c-o put out %d\n", num_out); 10174 10175 tot_out += num_out; 10176 burst_cnt++; 10177 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { 10178 sctp_log_cwnd(stcb, NULL, num_out, SCTP_SEND_NOW_COMPLETES); 10179 if (num_out == 0) { 10180 sctp_log_cwnd(stcb, NULL, reason_code, SCTP_SEND_NOW_COMPLETES); 10181 } 10182 } 10183 if (nagle_on) { 10184 /* 10185 * When the Nagle algorithm is used, look at how 10186 * much is unsent, then if its smaller than an MTU 10187 * and we have data in flight we stop, except if we 10188 * are handling a fragmented user message. 10189 */ 10190 un_sent = stcb->asoc.total_output_queue_size - stcb->asoc.total_flight; 10191 if ((un_sent < (int)(stcb->asoc.smallest_mtu - SCTP_MIN_OVERHEAD)) && 10192 (stcb->asoc.total_flight > 0)) { 10193 /* && sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXPLICIT_EOR))) {*/ 10194 break; 10195 } 10196 } 10197 if (TAILQ_EMPTY(&asoc->control_send_queue) && 10198 TAILQ_EMPTY(&asoc->send_queue) && 10199 sctp_is_there_unsent_data(stcb, so_locked) == 0) { 10200 /* Nothing left to send */ 10201 break; 10202 } 10203 if ((stcb->asoc.total_output_queue_size - stcb->asoc.total_flight) <= 0) { 10204 /* Nothing left to send */ 10205 break; 10206 } 10207 } while (num_out && 10208 ((asoc->max_burst == 0) || 10209 SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst) || 10210 (burst_cnt < asoc->max_burst))); 10211 10212 if (SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst) == 0) { 10213 if ((asoc->max_burst > 0) && (burst_cnt >= asoc->max_burst)) { 10214 SCTP_STAT_INCR(sctps_maxburstqueued); 10215 asoc->burst_limit_applied = 1; 10216 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_MAXBURST_ENABLE) { 10217 sctp_log_maxburst(stcb, asoc->primary_destination, 0, burst_cnt, SCTP_MAX_BURST_APPLIED); 10218 } 10219 } else { 10220 asoc->burst_limit_applied = 0; 10221 } 10222 } 10223 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { 10224 sctp_log_cwnd(stcb, NULL, tot_out, SCTP_SEND_NOW_COMPLETES); 10225 } 10226 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Ok, we have put out %d chunks\n", 10227 tot_out); 10228 10229 /*- 10230 * Now we need to clean up the control chunk chain if a ECNE is on 10231 * it. It must be marked as UNSENT again so next call will continue 10232 * to send it until such time that we get a CWR, to remove it. 10233 */ 10234 if (stcb->asoc.ecn_echo_cnt_onq) 10235 sctp_fix_ecn_echo(asoc); 10236 10237 if (stcb->asoc.trigger_reset) { 10238 if (sctp_send_stream_reset_out_if_possible(stcb, so_locked) == 0) { 10239 goto do_it_again; 10240 } 10241 } 10242 return; 10243 } 10244 10245 10246 int 10247 sctp_output( 10248 struct sctp_inpcb *inp, 10249 struct mbuf *m, 10250 struct sockaddr *addr, 10251 struct mbuf *control, 10252 struct thread *p, 10253 int flags) 10254 { 10255 if (inp == NULL) { 10256 SCTP_LTRACE_ERR_RET_PKT(m, inp, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EINVAL); 10257 return (EINVAL); 10258 } 10259 if (inp->sctp_socket == NULL) { 10260 SCTP_LTRACE_ERR_RET_PKT(m, inp, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EINVAL); 10261 return (EINVAL); 10262 } 10263 return (sctp_sosend(inp->sctp_socket, 10264 addr, 10265 (struct uio *)NULL, 10266 m, 10267 control, 10268 flags, p 10269 )); 10270 } 10271 10272 void 10273 send_forward_tsn(struct sctp_tcb *stcb, 10274 struct sctp_association *asoc) 10275 { 10276 struct sctp_tmit_chunk *chk, *at, *tp1, *last; 10277 struct sctp_forward_tsn_chunk *fwdtsn; 10278 struct sctp_strseq *strseq; 10279 struct sctp_strseq_mid *strseq_m; 10280 uint32_t advance_peer_ack_point; 10281 unsigned int cnt_of_space, i, ovh; 10282 unsigned int space_needed; 10283 unsigned int cnt_of_skipped = 0; 10284 10285 SCTP_TCB_LOCK_ASSERT(stcb); 10286 TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { 10287 if (chk->rec.chunk_id.id == SCTP_FORWARD_CUM_TSN) { 10288 /* mark it to unsent */ 10289 chk->sent = SCTP_DATAGRAM_UNSENT; 10290 chk->snd_count = 0; 10291 /* Do we correct its output location? */ 10292 if (chk->whoTo) { 10293 sctp_free_remote_addr(chk->whoTo); 10294 chk->whoTo = NULL; 10295 } 10296 goto sctp_fill_in_rest; 10297 } 10298 } 10299 /* Ok if we reach here we must build one */ 10300 sctp_alloc_a_chunk(stcb, chk); 10301 if (chk == NULL) { 10302 return; 10303 } 10304 asoc->fwd_tsn_cnt++; 10305 chk->copy_by_ref = 0; 10306 /* 10307 * We don't do the old thing here since this is used not for on-wire 10308 * but to tell if we are sending a fwd-tsn by the stack during 10309 * output. And if its a IFORWARD or a FORWARD it is a fwd-tsn. 10310 */ 10311 chk->rec.chunk_id.id = SCTP_FORWARD_CUM_TSN; 10312 chk->rec.chunk_id.can_take_data = 0; 10313 chk->flags = 0; 10314 chk->asoc = asoc; 10315 chk->whoTo = NULL; 10316 chk->data = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA); 10317 if (chk->data == NULL) { 10318 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); 10319 return; 10320 } 10321 SCTP_BUF_RESV_UF(chk->data, SCTP_MIN_OVERHEAD); 10322 chk->sent = SCTP_DATAGRAM_UNSENT; 10323 chk->snd_count = 0; 10324 TAILQ_INSERT_TAIL(&asoc->control_send_queue, chk, sctp_next); 10325 asoc->ctrl_queue_cnt++; 10326 sctp_fill_in_rest: 10327 /*- 10328 * Here we go through and fill out the part that deals with 10329 * stream/seq of the ones we skip. 10330 */ 10331 SCTP_BUF_LEN(chk->data) = 0; 10332 TAILQ_FOREACH(at, &asoc->sent_queue, sctp_next) { 10333 if ((at->sent != SCTP_FORWARD_TSN_SKIP) && 10334 (at->sent != SCTP_DATAGRAM_NR_ACKED)) { 10335 /* no more to look at */ 10336 break; 10337 } 10338 if (!asoc->idata_supported && (at->rec.data.rcv_flags & SCTP_DATA_UNORDERED)) { 10339 /* We don't report these */ 10340 continue; 10341 } 10342 cnt_of_skipped++; 10343 } 10344 if (asoc->idata_supported) { 10345 space_needed = (sizeof(struct sctp_forward_tsn_chunk) + 10346 (cnt_of_skipped * sizeof(struct sctp_strseq_mid))); 10347 } else { 10348 space_needed = (sizeof(struct sctp_forward_tsn_chunk) + 10349 (cnt_of_skipped * sizeof(struct sctp_strseq))); 10350 } 10351 cnt_of_space = (unsigned int)M_TRAILINGSPACE(chk->data); 10352 10353 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { 10354 ovh = SCTP_MIN_OVERHEAD; 10355 } else { 10356 ovh = SCTP_MIN_V4_OVERHEAD; 10357 } 10358 if (cnt_of_space > (asoc->smallest_mtu - ovh)) { 10359 /* trim to a mtu size */ 10360 cnt_of_space = asoc->smallest_mtu - ovh; 10361 } 10362 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_TRY_ADVANCE) { 10363 sctp_misc_ints(SCTP_FWD_TSN_CHECK, 10364 0xff, 0, cnt_of_skipped, 10365 asoc->advanced_peer_ack_point); 10366 } 10367 advance_peer_ack_point = asoc->advanced_peer_ack_point; 10368 if (cnt_of_space < space_needed) { 10369 /*- 10370 * ok we must trim down the chunk by lowering the 10371 * advance peer ack point. 10372 */ 10373 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_TRY_ADVANCE) { 10374 sctp_misc_ints(SCTP_FWD_TSN_CHECK, 10375 0xff, 0xff, cnt_of_space, 10376 space_needed); 10377 } 10378 cnt_of_skipped = cnt_of_space - sizeof(struct sctp_forward_tsn_chunk); 10379 if (asoc->idata_supported) { 10380 cnt_of_skipped /= sizeof(struct sctp_strseq_mid); 10381 } else { 10382 cnt_of_skipped /= sizeof(struct sctp_strseq); 10383 } 10384 /*- 10385 * Go through and find the TSN that will be the one 10386 * we report. 10387 */ 10388 at = TAILQ_FIRST(&asoc->sent_queue); 10389 if (at != NULL) { 10390 for (i = 0; i < cnt_of_skipped; i++) { 10391 tp1 = TAILQ_NEXT(at, sctp_next); 10392 if (tp1 == NULL) { 10393 break; 10394 } 10395 at = tp1; 10396 } 10397 } 10398 if (at && SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_TRY_ADVANCE) { 10399 sctp_misc_ints(SCTP_FWD_TSN_CHECK, 10400 0xff, cnt_of_skipped, at->rec.data.tsn, 10401 asoc->advanced_peer_ack_point); 10402 } 10403 last = at; 10404 /*- 10405 * last now points to last one I can report, update 10406 * peer ack point 10407 */ 10408 if (last) { 10409 advance_peer_ack_point = last->rec.data.tsn; 10410 } 10411 if (asoc->idata_supported) { 10412 space_needed = sizeof(struct sctp_forward_tsn_chunk) + 10413 cnt_of_skipped * sizeof(struct sctp_strseq_mid); 10414 } else { 10415 space_needed = sizeof(struct sctp_forward_tsn_chunk) + 10416 cnt_of_skipped * sizeof(struct sctp_strseq); 10417 } 10418 } 10419 chk->send_size = space_needed; 10420 /* Setup the chunk */ 10421 fwdtsn = mtod(chk->data, struct sctp_forward_tsn_chunk *); 10422 fwdtsn->ch.chunk_length = htons(chk->send_size); 10423 fwdtsn->ch.chunk_flags = 0; 10424 if (asoc->idata_supported) { 10425 fwdtsn->ch.chunk_type = SCTP_IFORWARD_CUM_TSN; 10426 } else { 10427 fwdtsn->ch.chunk_type = SCTP_FORWARD_CUM_TSN; 10428 } 10429 fwdtsn->new_cumulative_tsn = htonl(advance_peer_ack_point); 10430 SCTP_BUF_LEN(chk->data) = chk->send_size; 10431 fwdtsn++; 10432 /*- 10433 * Move pointer to after the fwdtsn and transfer to the 10434 * strseq pointer. 10435 */ 10436 if (asoc->idata_supported) { 10437 strseq_m = (struct sctp_strseq_mid *)fwdtsn; 10438 strseq = NULL; 10439 } else { 10440 strseq = (struct sctp_strseq *)fwdtsn; 10441 strseq_m = NULL; 10442 } 10443 /*- 10444 * Now populate the strseq list. This is done blindly 10445 * without pulling out duplicate stream info. This is 10446 * inefficent but won't harm the process since the peer will 10447 * look at these in sequence and will thus release anything. 10448 * It could mean we exceed the PMTU and chop off some that 10449 * we could have included.. but this is unlikely (aka 1432/4 10450 * would mean 300+ stream seq's would have to be reported in 10451 * one FWD-TSN. With a bit of work we can later FIX this to 10452 * optimize and pull out duplicates.. but it does add more 10453 * overhead. So for now... not! 10454 */ 10455 i = 0; 10456 TAILQ_FOREACH(at, &asoc->sent_queue, sctp_next) { 10457 if (i >= cnt_of_skipped) { 10458 break; 10459 } 10460 if (!asoc->idata_supported && (at->rec.data.rcv_flags & SCTP_DATA_UNORDERED)) { 10461 /* We don't report these */ 10462 continue; 10463 } 10464 if (at->rec.data.tsn == advance_peer_ack_point) { 10465 at->rec.data.fwd_tsn_cnt = 0; 10466 } 10467 if (asoc->idata_supported) { 10468 strseq_m->sid = htons(at->rec.data.sid); 10469 if (at->rec.data.rcv_flags & SCTP_DATA_UNORDERED) { 10470 strseq_m->flags = htons(PR_SCTP_UNORDERED_FLAG); 10471 } else { 10472 strseq_m->flags = 0; 10473 } 10474 strseq_m->mid = htonl(at->rec.data.mid); 10475 strseq_m++; 10476 } else { 10477 strseq->sid = htons(at->rec.data.sid); 10478 strseq->ssn = htons((uint16_t)at->rec.data.mid); 10479 strseq++; 10480 } 10481 i++; 10482 } 10483 return; 10484 } 10485 10486 void 10487 sctp_send_sack(struct sctp_tcb *stcb, int so_locked 10488 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 10489 SCTP_UNUSED 10490 #endif 10491 ) 10492 { 10493 /*- 10494 * Queue up a SACK or NR-SACK in the control queue. 10495 * We must first check to see if a SACK or NR-SACK is 10496 * somehow on the control queue. 10497 * If so, we will take and and remove the old one. 10498 */ 10499 struct sctp_association *asoc; 10500 struct sctp_tmit_chunk *chk, *a_chk; 10501 struct sctp_sack_chunk *sack; 10502 struct sctp_nr_sack_chunk *nr_sack; 10503 struct sctp_gap_ack_block *gap_descriptor; 10504 const struct sack_track *selector; 10505 int mergeable = 0; 10506 int offset; 10507 caddr_t limit; 10508 uint32_t *dup; 10509 int limit_reached = 0; 10510 unsigned int i, siz, j; 10511 unsigned int num_gap_blocks = 0, num_nr_gap_blocks = 0, space; 10512 int num_dups = 0; 10513 int space_req; 10514 uint32_t highest_tsn; 10515 uint8_t flags; 10516 uint8_t type; 10517 uint8_t tsn_map; 10518 10519 if (stcb->asoc.nrsack_supported == 1) { 10520 type = SCTP_NR_SELECTIVE_ACK; 10521 } else { 10522 type = SCTP_SELECTIVE_ACK; 10523 } 10524 a_chk = NULL; 10525 asoc = &stcb->asoc; 10526 SCTP_TCB_LOCK_ASSERT(stcb); 10527 if (asoc->last_data_chunk_from == NULL) { 10528 /* Hmm we never received anything */ 10529 return; 10530 } 10531 sctp_slide_mapping_arrays(stcb); 10532 sctp_set_rwnd(stcb, asoc); 10533 TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { 10534 if (chk->rec.chunk_id.id == type) { 10535 /* Hmm, found a sack already on queue, remove it */ 10536 TAILQ_REMOVE(&asoc->control_send_queue, chk, sctp_next); 10537 asoc->ctrl_queue_cnt--; 10538 a_chk = chk; 10539 if (a_chk->data) { 10540 sctp_m_freem(a_chk->data); 10541 a_chk->data = NULL; 10542 } 10543 if (a_chk->whoTo) { 10544 sctp_free_remote_addr(a_chk->whoTo); 10545 a_chk->whoTo = NULL; 10546 } 10547 break; 10548 } 10549 } 10550 if (a_chk == NULL) { 10551 sctp_alloc_a_chunk(stcb, a_chk); 10552 if (a_chk == NULL) { 10553 /* No memory so we drop the idea, and set a timer */ 10554 if (stcb->asoc.delayed_ack) { 10555 sctp_timer_stop(SCTP_TIMER_TYPE_RECV, 10556 stcb->sctp_ep, stcb, NULL, 10557 SCTP_FROM_SCTP_OUTPUT + SCTP_LOC_3); 10558 sctp_timer_start(SCTP_TIMER_TYPE_RECV, 10559 stcb->sctp_ep, stcb, NULL); 10560 } else { 10561 stcb->asoc.send_sack = 1; 10562 } 10563 return; 10564 } 10565 a_chk->copy_by_ref = 0; 10566 a_chk->rec.chunk_id.id = type; 10567 a_chk->rec.chunk_id.can_take_data = 1; 10568 } 10569 /* Clear our pkt counts */ 10570 asoc->data_pkts_seen = 0; 10571 10572 a_chk->flags = 0; 10573 a_chk->asoc = asoc; 10574 a_chk->snd_count = 0; 10575 a_chk->send_size = 0; /* fill in later */ 10576 a_chk->sent = SCTP_DATAGRAM_UNSENT; 10577 a_chk->whoTo = NULL; 10578 10579 if (!(asoc->last_data_chunk_from->dest_state & SCTP_ADDR_REACHABLE)) { 10580 /*- 10581 * Ok, the destination for the SACK is unreachable, lets see if 10582 * we can select an alternate to asoc->last_data_chunk_from 10583 */ 10584 a_chk->whoTo = sctp_find_alternate_net(stcb, asoc->last_data_chunk_from, 0); 10585 if (a_chk->whoTo == NULL) { 10586 /* Nope, no alternate */ 10587 a_chk->whoTo = asoc->last_data_chunk_from; 10588 } 10589 } else { 10590 a_chk->whoTo = asoc->last_data_chunk_from; 10591 } 10592 if (a_chk->whoTo) { 10593 atomic_add_int(&a_chk->whoTo->ref_count, 1); 10594 } 10595 if (SCTP_TSN_GT(asoc->highest_tsn_inside_map, asoc->highest_tsn_inside_nr_map)) { 10596 highest_tsn = asoc->highest_tsn_inside_map; 10597 } else { 10598 highest_tsn = asoc->highest_tsn_inside_nr_map; 10599 } 10600 if (highest_tsn == asoc->cumulative_tsn) { 10601 /* no gaps */ 10602 if (type == SCTP_SELECTIVE_ACK) { 10603 space_req = sizeof(struct sctp_sack_chunk); 10604 } else { 10605 space_req = sizeof(struct sctp_nr_sack_chunk); 10606 } 10607 } else { 10608 /* gaps get a cluster */ 10609 space_req = MCLBYTES; 10610 } 10611 /* Ok now lets formulate a MBUF with our sack */ 10612 a_chk->data = sctp_get_mbuf_for_msg(space_req, 0, M_NOWAIT, 1, MT_DATA); 10613 if ((a_chk->data == NULL) || 10614 (a_chk->whoTo == NULL)) { 10615 /* rats, no mbuf memory */ 10616 if (a_chk->data) { 10617 /* was a problem with the destination */ 10618 sctp_m_freem(a_chk->data); 10619 a_chk->data = NULL; 10620 } 10621 sctp_free_a_chunk(stcb, a_chk, so_locked); 10622 /* sa_ignore NO_NULL_CHK */ 10623 if (stcb->asoc.delayed_ack) { 10624 sctp_timer_stop(SCTP_TIMER_TYPE_RECV, 10625 stcb->sctp_ep, stcb, NULL, 10626 SCTP_FROM_SCTP_OUTPUT + SCTP_LOC_4); 10627 sctp_timer_start(SCTP_TIMER_TYPE_RECV, 10628 stcb->sctp_ep, stcb, NULL); 10629 } else { 10630 stcb->asoc.send_sack = 1; 10631 } 10632 return; 10633 } 10634 /* ok, lets go through and fill it in */ 10635 SCTP_BUF_RESV_UF(a_chk->data, SCTP_MIN_OVERHEAD); 10636 space = (unsigned int)M_TRAILINGSPACE(a_chk->data); 10637 if (space > (a_chk->whoTo->mtu - SCTP_MIN_OVERHEAD)) { 10638 space = (a_chk->whoTo->mtu - SCTP_MIN_OVERHEAD); 10639 } 10640 limit = mtod(a_chk->data, caddr_t); 10641 limit += space; 10642 10643 flags = 0; 10644 10645 if ((asoc->sctp_cmt_on_off > 0) && 10646 SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) { 10647 /*- 10648 * CMT DAC algorithm: If 2 (i.e., 0x10) packets have been 10649 * received, then set high bit to 1, else 0. Reset 10650 * pkts_rcvd. 10651 */ 10652 flags |= (asoc->cmt_dac_pkts_rcvd << 6); 10653 asoc->cmt_dac_pkts_rcvd = 0; 10654 } 10655 #ifdef SCTP_ASOCLOG_OF_TSNS 10656 stcb->asoc.cumack_logsnt[stcb->asoc.cumack_log_atsnt] = asoc->cumulative_tsn; 10657 stcb->asoc.cumack_log_atsnt++; 10658 if (stcb->asoc.cumack_log_atsnt >= SCTP_TSN_LOG_SIZE) { 10659 stcb->asoc.cumack_log_atsnt = 0; 10660 } 10661 #endif 10662 /* reset the readers interpretation */ 10663 stcb->freed_by_sorcv_sincelast = 0; 10664 10665 if (type == SCTP_SELECTIVE_ACK) { 10666 sack = mtod(a_chk->data, struct sctp_sack_chunk *); 10667 nr_sack = NULL; 10668 gap_descriptor = (struct sctp_gap_ack_block *)((caddr_t)sack + sizeof(struct sctp_sack_chunk)); 10669 if (highest_tsn > asoc->mapping_array_base_tsn) { 10670 siz = (((highest_tsn - asoc->mapping_array_base_tsn) + 1) + 7) / 8; 10671 } else { 10672 siz = (((MAX_TSN - highest_tsn) + 1) + highest_tsn + 7) / 8; 10673 } 10674 } else { 10675 sack = NULL; 10676 nr_sack = mtod(a_chk->data, struct sctp_nr_sack_chunk *); 10677 gap_descriptor = (struct sctp_gap_ack_block *)((caddr_t)nr_sack + sizeof(struct sctp_nr_sack_chunk)); 10678 if (asoc->highest_tsn_inside_map > asoc->mapping_array_base_tsn) { 10679 siz = (((asoc->highest_tsn_inside_map - asoc->mapping_array_base_tsn) + 1) + 7) / 8; 10680 } else { 10681 siz = (((MAX_TSN - asoc->mapping_array_base_tsn) + 1) + asoc->highest_tsn_inside_map + 7) / 8; 10682 } 10683 } 10684 10685 if (SCTP_TSN_GT(asoc->mapping_array_base_tsn, asoc->cumulative_tsn)) { 10686 offset = 1; 10687 } else { 10688 offset = asoc->mapping_array_base_tsn - asoc->cumulative_tsn; 10689 } 10690 if (((type == SCTP_SELECTIVE_ACK) && 10691 SCTP_TSN_GT(highest_tsn, asoc->cumulative_tsn)) || 10692 ((type == SCTP_NR_SELECTIVE_ACK) && 10693 SCTP_TSN_GT(asoc->highest_tsn_inside_map, asoc->cumulative_tsn))) { 10694 /* we have a gap .. maybe */ 10695 for (i = 0; i < siz; i++) { 10696 tsn_map = asoc->mapping_array[i]; 10697 if (type == SCTP_SELECTIVE_ACK) { 10698 tsn_map |= asoc->nr_mapping_array[i]; 10699 } 10700 if (i == 0) { 10701 /* 10702 * Clear all bits corresponding to TSNs 10703 * smaller or equal to the cumulative TSN. 10704 */ 10705 tsn_map &= (~0U << (1 - offset)); 10706 } 10707 selector = &sack_array[tsn_map]; 10708 if (mergeable && selector->right_edge) { 10709 /* 10710 * Backup, left and right edges were ok to 10711 * merge. 10712 */ 10713 num_gap_blocks--; 10714 gap_descriptor--; 10715 } 10716 if (selector->num_entries == 0) 10717 mergeable = 0; 10718 else { 10719 for (j = 0; j < selector->num_entries; j++) { 10720 if (mergeable && selector->right_edge) { 10721 /* 10722 * do a merge by NOT setting 10723 * the left side 10724 */ 10725 mergeable = 0; 10726 } else { 10727 /* 10728 * no merge, set the left 10729 * side 10730 */ 10731 mergeable = 0; 10732 gap_descriptor->start = htons((selector->gaps[j].start + offset)); 10733 } 10734 gap_descriptor->end = htons((selector->gaps[j].end + offset)); 10735 num_gap_blocks++; 10736 gap_descriptor++; 10737 if (((caddr_t)gap_descriptor + sizeof(struct sctp_gap_ack_block)) > limit) { 10738 /* no more room */ 10739 limit_reached = 1; 10740 break; 10741 } 10742 } 10743 if (selector->left_edge) { 10744 mergeable = 1; 10745 } 10746 } 10747 if (limit_reached) { 10748 /* Reached the limit stop */ 10749 break; 10750 } 10751 offset += 8; 10752 } 10753 } 10754 if ((type == SCTP_NR_SELECTIVE_ACK) && 10755 (limit_reached == 0)) { 10756 10757 mergeable = 0; 10758 10759 if (asoc->highest_tsn_inside_nr_map > asoc->mapping_array_base_tsn) { 10760 siz = (((asoc->highest_tsn_inside_nr_map - asoc->mapping_array_base_tsn) + 1) + 7) / 8; 10761 } else { 10762 siz = (((MAX_TSN - asoc->mapping_array_base_tsn) + 1) + asoc->highest_tsn_inside_nr_map + 7) / 8; 10763 } 10764 10765 if (SCTP_TSN_GT(asoc->mapping_array_base_tsn, asoc->cumulative_tsn)) { 10766 offset = 1; 10767 } else { 10768 offset = asoc->mapping_array_base_tsn - asoc->cumulative_tsn; 10769 } 10770 if (SCTP_TSN_GT(asoc->highest_tsn_inside_nr_map, asoc->cumulative_tsn)) { 10771 /* we have a gap .. maybe */ 10772 for (i = 0; i < siz; i++) { 10773 tsn_map = asoc->nr_mapping_array[i]; 10774 if (i == 0) { 10775 /* 10776 * Clear all bits corresponding to 10777 * TSNs smaller or equal to the 10778 * cumulative TSN. 10779 */ 10780 tsn_map &= (~0U << (1 - offset)); 10781 } 10782 selector = &sack_array[tsn_map]; 10783 if (mergeable && selector->right_edge) { 10784 /* 10785 * Backup, left and right edges were 10786 * ok to merge. 10787 */ 10788 num_nr_gap_blocks--; 10789 gap_descriptor--; 10790 } 10791 if (selector->num_entries == 0) 10792 mergeable = 0; 10793 else { 10794 for (j = 0; j < selector->num_entries; j++) { 10795 if (mergeable && selector->right_edge) { 10796 /* 10797 * do a merge by NOT 10798 * setting the left 10799 * side 10800 */ 10801 mergeable = 0; 10802 } else { 10803 /* 10804 * no merge, set the 10805 * left side 10806 */ 10807 mergeable = 0; 10808 gap_descriptor->start = htons((selector->gaps[j].start + offset)); 10809 } 10810 gap_descriptor->end = htons((selector->gaps[j].end + offset)); 10811 num_nr_gap_blocks++; 10812 gap_descriptor++; 10813 if (((caddr_t)gap_descriptor + sizeof(struct sctp_gap_ack_block)) > limit) { 10814 /* no more room */ 10815 limit_reached = 1; 10816 break; 10817 } 10818 } 10819 if (selector->left_edge) { 10820 mergeable = 1; 10821 } 10822 } 10823 if (limit_reached) { 10824 /* Reached the limit stop */ 10825 break; 10826 } 10827 offset += 8; 10828 } 10829 } 10830 } 10831 /* now we must add any dups we are going to report. */ 10832 if ((limit_reached == 0) && (asoc->numduptsns)) { 10833 dup = (uint32_t *)gap_descriptor; 10834 for (i = 0; i < asoc->numduptsns; i++) { 10835 *dup = htonl(asoc->dup_tsns[i]); 10836 dup++; 10837 num_dups++; 10838 if (((caddr_t)dup + sizeof(uint32_t)) > limit) { 10839 /* no more room */ 10840 break; 10841 } 10842 } 10843 asoc->numduptsns = 0; 10844 } 10845 /* 10846 * now that the chunk is prepared queue it to the control chunk 10847 * queue. 10848 */ 10849 if (type == SCTP_SELECTIVE_ACK) { 10850 a_chk->send_size = (uint16_t)(sizeof(struct sctp_sack_chunk) + 10851 (num_gap_blocks + num_nr_gap_blocks) * sizeof(struct sctp_gap_ack_block) + 10852 num_dups * sizeof(int32_t)); 10853 SCTP_BUF_LEN(a_chk->data) = a_chk->send_size; 10854 sack->sack.cum_tsn_ack = htonl(asoc->cumulative_tsn); 10855 sack->sack.a_rwnd = htonl(asoc->my_rwnd); 10856 sack->sack.num_gap_ack_blks = htons(num_gap_blocks); 10857 sack->sack.num_dup_tsns = htons(num_dups); 10858 sack->ch.chunk_type = type; 10859 sack->ch.chunk_flags = flags; 10860 sack->ch.chunk_length = htons(a_chk->send_size); 10861 } else { 10862 a_chk->send_size = (uint16_t)(sizeof(struct sctp_nr_sack_chunk) + 10863 (num_gap_blocks + num_nr_gap_blocks) * sizeof(struct sctp_gap_ack_block) + 10864 num_dups * sizeof(int32_t)); 10865 SCTP_BUF_LEN(a_chk->data) = a_chk->send_size; 10866 nr_sack->nr_sack.cum_tsn_ack = htonl(asoc->cumulative_tsn); 10867 nr_sack->nr_sack.a_rwnd = htonl(asoc->my_rwnd); 10868 nr_sack->nr_sack.num_gap_ack_blks = htons(num_gap_blocks); 10869 nr_sack->nr_sack.num_nr_gap_ack_blks = htons(num_nr_gap_blocks); 10870 nr_sack->nr_sack.num_dup_tsns = htons(num_dups); 10871 nr_sack->nr_sack.reserved = 0; 10872 nr_sack->ch.chunk_type = type; 10873 nr_sack->ch.chunk_flags = flags; 10874 nr_sack->ch.chunk_length = htons(a_chk->send_size); 10875 } 10876 TAILQ_INSERT_TAIL(&asoc->control_send_queue, a_chk, sctp_next); 10877 asoc->my_last_reported_rwnd = asoc->my_rwnd; 10878 asoc->ctrl_queue_cnt++; 10879 asoc->send_sack = 0; 10880 SCTP_STAT_INCR(sctps_sendsacks); 10881 return; 10882 } 10883 10884 void 10885 sctp_send_abort_tcb(struct sctp_tcb *stcb, struct mbuf *operr, int so_locked 10886 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 10887 SCTP_UNUSED 10888 #endif 10889 ) 10890 { 10891 struct mbuf *m_abort, *m, *m_last; 10892 struct mbuf *m_out, *m_end = NULL; 10893 struct sctp_abort_chunk *abort; 10894 struct sctp_auth_chunk *auth = NULL; 10895 struct sctp_nets *net; 10896 uint32_t vtag; 10897 uint32_t auth_offset = 0; 10898 int error; 10899 uint16_t cause_len, chunk_len, padding_len; 10900 10901 SCTP_TCB_LOCK_ASSERT(stcb); 10902 /*- 10903 * Add an AUTH chunk, if chunk requires it and save the offset into 10904 * the chain for AUTH 10905 */ 10906 if (sctp_auth_is_required_chunk(SCTP_ABORT_ASSOCIATION, 10907 stcb->asoc.peer_auth_chunks)) { 10908 m_out = sctp_add_auth_chunk(NULL, &m_end, &auth, &auth_offset, 10909 stcb, SCTP_ABORT_ASSOCIATION); 10910 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 10911 } else { 10912 m_out = NULL; 10913 } 10914 m_abort = sctp_get_mbuf_for_msg(sizeof(struct sctp_abort_chunk), 0, M_NOWAIT, 1, MT_HEADER); 10915 if (m_abort == NULL) { 10916 if (m_out) { 10917 sctp_m_freem(m_out); 10918 } 10919 if (operr) { 10920 sctp_m_freem(operr); 10921 } 10922 return; 10923 } 10924 /* link in any error */ 10925 SCTP_BUF_NEXT(m_abort) = operr; 10926 cause_len = 0; 10927 m_last = NULL; 10928 for (m = operr; m; m = SCTP_BUF_NEXT(m)) { 10929 cause_len += (uint16_t)SCTP_BUF_LEN(m); 10930 if (SCTP_BUF_NEXT(m) == NULL) { 10931 m_last = m; 10932 } 10933 } 10934 SCTP_BUF_LEN(m_abort) = sizeof(struct sctp_abort_chunk); 10935 chunk_len = (uint16_t)sizeof(struct sctp_abort_chunk) + cause_len; 10936 padding_len = SCTP_SIZE32(chunk_len) - chunk_len; 10937 if (m_out == NULL) { 10938 /* NO Auth chunk prepended, so reserve space in front */ 10939 SCTP_BUF_RESV_UF(m_abort, SCTP_MIN_OVERHEAD); 10940 m_out = m_abort; 10941 } else { 10942 /* Put AUTH chunk at the front of the chain */ 10943 SCTP_BUF_NEXT(m_end) = m_abort; 10944 } 10945 if (stcb->asoc.alternate) { 10946 net = stcb->asoc.alternate; 10947 } else { 10948 net = stcb->asoc.primary_destination; 10949 } 10950 /* Fill in the ABORT chunk header. */ 10951 abort = mtod(m_abort, struct sctp_abort_chunk *); 10952 abort->ch.chunk_type = SCTP_ABORT_ASSOCIATION; 10953 if (stcb->asoc.peer_vtag == 0) { 10954 /* This happens iff the assoc is in COOKIE-WAIT state. */ 10955 vtag = stcb->asoc.my_vtag; 10956 abort->ch.chunk_flags = SCTP_HAD_NO_TCB; 10957 } else { 10958 vtag = stcb->asoc.peer_vtag; 10959 abort->ch.chunk_flags = 0; 10960 } 10961 abort->ch.chunk_length = htons(chunk_len); 10962 /* Add padding, if necessary. */ 10963 if (padding_len > 0) { 10964 if ((m_last == NULL) || 10965 (sctp_add_pad_tombuf(m_last, padding_len) == NULL)) { 10966 sctp_m_freem(m_out); 10967 return; 10968 } 10969 } 10970 if ((error = sctp_lowlevel_chunk_output(stcb->sctp_ep, stcb, net, 10971 (struct sockaddr *)&net->ro._l_addr, 10972 m_out, auth_offset, auth, stcb->asoc.authinfo.active_keyid, 1, 0, 0, 10973 stcb->sctp_ep->sctp_lport, stcb->rport, htonl(vtag), 10974 stcb->asoc.primary_destination->port, NULL, 10975 0, 0, 10976 so_locked))) { 10977 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Gak send error %d\n", error); 10978 if (error == ENOBUFS) { 10979 stcb->asoc.ifp_had_enobuf = 1; 10980 SCTP_STAT_INCR(sctps_lowlevelerr); 10981 } 10982 } else { 10983 stcb->asoc.ifp_had_enobuf = 0; 10984 } 10985 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 10986 } 10987 10988 void 10989 sctp_send_shutdown_complete(struct sctp_tcb *stcb, 10990 struct sctp_nets *net, 10991 int reflect_vtag) 10992 { 10993 /* formulate and SEND a SHUTDOWN-COMPLETE */ 10994 struct mbuf *m_shutdown_comp; 10995 struct sctp_shutdown_complete_chunk *shutdown_complete; 10996 uint32_t vtag; 10997 int error; 10998 uint8_t flags; 10999 11000 m_shutdown_comp = sctp_get_mbuf_for_msg(sizeof(struct sctp_chunkhdr), 0, M_NOWAIT, 1, MT_HEADER); 11001 if (m_shutdown_comp == NULL) { 11002 /* no mbuf's */ 11003 return; 11004 } 11005 if (reflect_vtag) { 11006 flags = SCTP_HAD_NO_TCB; 11007 vtag = stcb->asoc.my_vtag; 11008 } else { 11009 flags = 0; 11010 vtag = stcb->asoc.peer_vtag; 11011 } 11012 shutdown_complete = mtod(m_shutdown_comp, struct sctp_shutdown_complete_chunk *); 11013 shutdown_complete->ch.chunk_type = SCTP_SHUTDOWN_COMPLETE; 11014 shutdown_complete->ch.chunk_flags = flags; 11015 shutdown_complete->ch.chunk_length = htons(sizeof(struct sctp_shutdown_complete_chunk)); 11016 SCTP_BUF_LEN(m_shutdown_comp) = sizeof(struct sctp_shutdown_complete_chunk); 11017 if ((error = sctp_lowlevel_chunk_output(stcb->sctp_ep, stcb, net, 11018 (struct sockaddr *)&net->ro._l_addr, 11019 m_shutdown_comp, 0, NULL, 0, 1, 0, 0, 11020 stcb->sctp_ep->sctp_lport, stcb->rport, 11021 htonl(vtag), 11022 net->port, NULL, 11023 0, 0, 11024 SCTP_SO_NOT_LOCKED))) { 11025 SCTPDBG(SCTP_DEBUG_OUTPUT3, "Gak send error %d\n", error); 11026 if (error == ENOBUFS) { 11027 stcb->asoc.ifp_had_enobuf = 1; 11028 SCTP_STAT_INCR(sctps_lowlevelerr); 11029 } 11030 } else { 11031 stcb->asoc.ifp_had_enobuf = 0; 11032 } 11033 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 11034 return; 11035 } 11036 11037 static void 11038 sctp_send_resp_msg(struct sockaddr *src, struct sockaddr *dst, 11039 struct sctphdr *sh, uint32_t vtag, 11040 uint8_t type, struct mbuf *cause, 11041 uint8_t mflowtype, uint32_t mflowid, uint16_t fibnum, 11042 uint32_t vrf_id, uint16_t port) 11043 { 11044 struct mbuf *o_pak; 11045 struct mbuf *mout; 11046 struct sctphdr *shout; 11047 struct sctp_chunkhdr *ch; 11048 #if defined(INET) || defined(INET6) 11049 struct udphdr *udp; 11050 int ret; 11051 #endif 11052 int len, cause_len, padding_len; 11053 #ifdef INET 11054 struct sockaddr_in *src_sin, *dst_sin; 11055 struct ip *ip; 11056 #endif 11057 #ifdef INET6 11058 struct sockaddr_in6 *src_sin6, *dst_sin6; 11059 struct ip6_hdr *ip6; 11060 #endif 11061 11062 /* Compute the length of the cause and add final padding. */ 11063 cause_len = 0; 11064 if (cause != NULL) { 11065 struct mbuf *m_at, *m_last = NULL; 11066 11067 for (m_at = cause; m_at; m_at = SCTP_BUF_NEXT(m_at)) { 11068 if (SCTP_BUF_NEXT(m_at) == NULL) 11069 m_last = m_at; 11070 cause_len += SCTP_BUF_LEN(m_at); 11071 } 11072 padding_len = cause_len % 4; 11073 if (padding_len != 0) { 11074 padding_len = 4 - padding_len; 11075 } 11076 if (padding_len != 0) { 11077 if (sctp_add_pad_tombuf(m_last, padding_len) == NULL) { 11078 sctp_m_freem(cause); 11079 return; 11080 } 11081 } 11082 } else { 11083 padding_len = 0; 11084 } 11085 /* Get an mbuf for the header. */ 11086 len = sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr); 11087 switch (dst->sa_family) { 11088 #ifdef INET 11089 case AF_INET: 11090 len += sizeof(struct ip); 11091 break; 11092 #endif 11093 #ifdef INET6 11094 case AF_INET6: 11095 len += sizeof(struct ip6_hdr); 11096 break; 11097 #endif 11098 default: 11099 break; 11100 } 11101 #if defined(INET) || defined(INET6) 11102 if (port) { 11103 len += sizeof(struct udphdr); 11104 } 11105 #endif 11106 mout = sctp_get_mbuf_for_msg(len + max_linkhdr, 1, M_NOWAIT, 1, MT_DATA); 11107 if (mout == NULL) { 11108 if (cause) { 11109 sctp_m_freem(cause); 11110 } 11111 return; 11112 } 11113 SCTP_BUF_RESV_UF(mout, max_linkhdr); 11114 SCTP_BUF_LEN(mout) = len; 11115 SCTP_BUF_NEXT(mout) = cause; 11116 M_SETFIB(mout, fibnum); 11117 mout->m_pkthdr.flowid = mflowid; 11118 M_HASHTYPE_SET(mout, mflowtype); 11119 #ifdef INET 11120 ip = NULL; 11121 #endif 11122 #ifdef INET6 11123 ip6 = NULL; 11124 #endif 11125 switch (dst->sa_family) { 11126 #ifdef INET 11127 case AF_INET: 11128 src_sin = (struct sockaddr_in *)src; 11129 dst_sin = (struct sockaddr_in *)dst; 11130 ip = mtod(mout, struct ip *); 11131 ip->ip_v = IPVERSION; 11132 ip->ip_hl = (sizeof(struct ip) >> 2); 11133 ip->ip_tos = 0; 11134 ip->ip_off = htons(IP_DF); 11135 ip_fillid(ip); 11136 ip->ip_ttl = MODULE_GLOBAL(ip_defttl); 11137 if (port) { 11138 ip->ip_p = IPPROTO_UDP; 11139 } else { 11140 ip->ip_p = IPPROTO_SCTP; 11141 } 11142 ip->ip_src.s_addr = dst_sin->sin_addr.s_addr; 11143 ip->ip_dst.s_addr = src_sin->sin_addr.s_addr; 11144 ip->ip_sum = 0; 11145 len = sizeof(struct ip); 11146 shout = (struct sctphdr *)((caddr_t)ip + len); 11147 break; 11148 #endif 11149 #ifdef INET6 11150 case AF_INET6: 11151 src_sin6 = (struct sockaddr_in6 *)src; 11152 dst_sin6 = (struct sockaddr_in6 *)dst; 11153 ip6 = mtod(mout, struct ip6_hdr *); 11154 ip6->ip6_flow = htonl(0x60000000); 11155 if (V_ip6_auto_flowlabel) { 11156 ip6->ip6_flow |= (htonl(ip6_randomflowlabel()) & IPV6_FLOWLABEL_MASK); 11157 } 11158 ip6->ip6_hlim = MODULE_GLOBAL(ip6_defhlim); 11159 if (port) { 11160 ip6->ip6_nxt = IPPROTO_UDP; 11161 } else { 11162 ip6->ip6_nxt = IPPROTO_SCTP; 11163 } 11164 ip6->ip6_src = dst_sin6->sin6_addr; 11165 ip6->ip6_dst = src_sin6->sin6_addr; 11166 len = sizeof(struct ip6_hdr); 11167 shout = (struct sctphdr *)((caddr_t)ip6 + len); 11168 break; 11169 #endif 11170 default: 11171 len = 0; 11172 shout = mtod(mout, struct sctphdr *); 11173 break; 11174 } 11175 #if defined(INET) || defined(INET6) 11176 if (port) { 11177 if (htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)) == 0) { 11178 sctp_m_freem(mout); 11179 return; 11180 } 11181 udp = (struct udphdr *)shout; 11182 udp->uh_sport = htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)); 11183 udp->uh_dport = port; 11184 udp->uh_sum = 0; 11185 udp->uh_ulen = htons((uint16_t)(sizeof(struct udphdr) + 11186 sizeof(struct sctphdr) + 11187 sizeof(struct sctp_chunkhdr) + 11188 cause_len + padding_len)); 11189 len += sizeof(struct udphdr); 11190 shout = (struct sctphdr *)((caddr_t)shout + sizeof(struct udphdr)); 11191 } else { 11192 udp = NULL; 11193 } 11194 #endif 11195 shout->src_port = sh->dest_port; 11196 shout->dest_port = sh->src_port; 11197 shout->checksum = 0; 11198 if (vtag) { 11199 shout->v_tag = htonl(vtag); 11200 } else { 11201 shout->v_tag = sh->v_tag; 11202 } 11203 len += sizeof(struct sctphdr); 11204 ch = (struct sctp_chunkhdr *)((caddr_t)shout + sizeof(struct sctphdr)); 11205 ch->chunk_type = type; 11206 if (vtag) { 11207 ch->chunk_flags = 0; 11208 } else { 11209 ch->chunk_flags = SCTP_HAD_NO_TCB; 11210 } 11211 ch->chunk_length = htons((uint16_t)(sizeof(struct sctp_chunkhdr) + cause_len)); 11212 len += sizeof(struct sctp_chunkhdr); 11213 len += cause_len + padding_len; 11214 11215 if (SCTP_GET_HEADER_FOR_OUTPUT(o_pak)) { 11216 sctp_m_freem(mout); 11217 return; 11218 } 11219 SCTP_ATTACH_CHAIN(o_pak, mout, len); 11220 switch (dst->sa_family) { 11221 #ifdef INET 11222 case AF_INET: 11223 if (port) { 11224 if (V_udp_cksum) { 11225 udp->uh_sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr, udp->uh_ulen + htons(IPPROTO_UDP)); 11226 } else { 11227 udp->uh_sum = 0; 11228 } 11229 } 11230 ip->ip_len = htons(len); 11231 if (port) { 11232 #if defined(SCTP_WITH_NO_CSUM) 11233 SCTP_STAT_INCR(sctps_sendnocrc); 11234 #else 11235 shout->checksum = sctp_calculate_cksum(mout, sizeof(struct ip) + sizeof(struct udphdr)); 11236 SCTP_STAT_INCR(sctps_sendswcrc); 11237 #endif 11238 if (V_udp_cksum) { 11239 SCTP_ENABLE_UDP_CSUM(o_pak); 11240 } 11241 } else { 11242 #if defined(SCTP_WITH_NO_CSUM) 11243 SCTP_STAT_INCR(sctps_sendnocrc); 11244 #else 11245 mout->m_pkthdr.csum_flags = CSUM_SCTP; 11246 mout->m_pkthdr.csum_data = offsetof(struct sctphdr, checksum); 11247 SCTP_STAT_INCR(sctps_sendhwcrc); 11248 #endif 11249 } 11250 #ifdef SCTP_PACKET_LOGGING 11251 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) { 11252 sctp_packet_log(o_pak); 11253 } 11254 #endif 11255 SCTP_IP_OUTPUT(ret, o_pak, NULL, NULL, vrf_id); 11256 break; 11257 #endif 11258 #ifdef INET6 11259 case AF_INET6: 11260 ip6->ip6_plen = (uint16_t)(len - sizeof(struct ip6_hdr)); 11261 if (port) { 11262 #if defined(SCTP_WITH_NO_CSUM) 11263 SCTP_STAT_INCR(sctps_sendnocrc); 11264 #else 11265 shout->checksum = sctp_calculate_cksum(mout, sizeof(struct ip6_hdr) + sizeof(struct udphdr)); 11266 SCTP_STAT_INCR(sctps_sendswcrc); 11267 #endif 11268 if ((udp->uh_sum = in6_cksum(o_pak, IPPROTO_UDP, sizeof(struct ip6_hdr), len - sizeof(struct ip6_hdr))) == 0) { 11269 udp->uh_sum = 0xffff; 11270 } 11271 } else { 11272 #if defined(SCTP_WITH_NO_CSUM) 11273 SCTP_STAT_INCR(sctps_sendnocrc); 11274 #else 11275 mout->m_pkthdr.csum_flags = CSUM_SCTP_IPV6; 11276 mout->m_pkthdr.csum_data = offsetof(struct sctphdr, checksum); 11277 SCTP_STAT_INCR(sctps_sendhwcrc); 11278 #endif 11279 } 11280 #ifdef SCTP_PACKET_LOGGING 11281 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) { 11282 sctp_packet_log(o_pak); 11283 } 11284 #endif 11285 SCTP_IP6_OUTPUT(ret, o_pak, NULL, NULL, NULL, vrf_id); 11286 break; 11287 #endif 11288 default: 11289 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Unknown protocol (TSNH) type %d\n", 11290 dst->sa_family); 11291 sctp_m_freem(mout); 11292 SCTP_LTRACE_ERR_RET_PKT(mout, NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EFAULT); 11293 return; 11294 } 11295 SCTP_STAT_INCR(sctps_sendpackets); 11296 SCTP_STAT_INCR_COUNTER64(sctps_outpackets); 11297 SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); 11298 return; 11299 } 11300 11301 void 11302 sctp_send_shutdown_complete2(struct sockaddr *src, struct sockaddr *dst, 11303 struct sctphdr *sh, 11304 uint8_t mflowtype, uint32_t mflowid, uint16_t fibnum, 11305 uint32_t vrf_id, uint16_t port) 11306 { 11307 sctp_send_resp_msg(src, dst, sh, 0, SCTP_SHUTDOWN_COMPLETE, NULL, 11308 mflowtype, mflowid, fibnum, 11309 vrf_id, port); 11310 } 11311 11312 void 11313 sctp_send_hb(struct sctp_tcb *stcb, struct sctp_nets *net, int so_locked 11314 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 11315 SCTP_UNUSED 11316 #endif 11317 ) 11318 { 11319 struct sctp_tmit_chunk *chk; 11320 struct sctp_heartbeat_chunk *hb; 11321 struct timeval now; 11322 11323 SCTP_TCB_LOCK_ASSERT(stcb); 11324 if (net == NULL) { 11325 return; 11326 } 11327 (void)SCTP_GETTIME_TIMEVAL(&now); 11328 switch (net->ro._l_addr.sa.sa_family) { 11329 #ifdef INET 11330 case AF_INET: 11331 break; 11332 #endif 11333 #ifdef INET6 11334 case AF_INET6: 11335 break; 11336 #endif 11337 default: 11338 return; 11339 } 11340 sctp_alloc_a_chunk(stcb, chk); 11341 if (chk == NULL) { 11342 SCTPDBG(SCTP_DEBUG_OUTPUT4, "Gak, can't get a chunk for hb\n"); 11343 return; 11344 } 11345 chk->copy_by_ref = 0; 11346 chk->rec.chunk_id.id = SCTP_HEARTBEAT_REQUEST; 11347 chk->rec.chunk_id.can_take_data = 1; 11348 chk->flags = 0; 11349 chk->asoc = &stcb->asoc; 11350 chk->send_size = sizeof(struct sctp_heartbeat_chunk); 11351 11352 chk->data = sctp_get_mbuf_for_msg(chk->send_size, 0, M_NOWAIT, 1, MT_HEADER); 11353 if (chk->data == NULL) { 11354 sctp_free_a_chunk(stcb, chk, so_locked); 11355 return; 11356 } 11357 SCTP_BUF_RESV_UF(chk->data, SCTP_MIN_OVERHEAD); 11358 SCTP_BUF_LEN(chk->data) = chk->send_size; 11359 chk->sent = SCTP_DATAGRAM_UNSENT; 11360 chk->snd_count = 0; 11361 chk->whoTo = net; 11362 atomic_add_int(&chk->whoTo->ref_count, 1); 11363 /* Now we have a mbuf that we can fill in with the details */ 11364 hb = mtod(chk->data, struct sctp_heartbeat_chunk *); 11365 memset(hb, 0, sizeof(struct sctp_heartbeat_chunk)); 11366 /* fill out chunk header */ 11367 hb->ch.chunk_type = SCTP_HEARTBEAT_REQUEST; 11368 hb->ch.chunk_flags = 0; 11369 hb->ch.chunk_length = htons(chk->send_size); 11370 /* Fill out hb parameter */ 11371 hb->heartbeat.hb_info.ph.param_type = htons(SCTP_HEARTBEAT_INFO); 11372 hb->heartbeat.hb_info.ph.param_length = htons(sizeof(struct sctp_heartbeat_info_param)); 11373 hb->heartbeat.hb_info.time_value_1 = now.tv_sec; 11374 hb->heartbeat.hb_info.time_value_2 = now.tv_usec; 11375 /* Did our user request this one, put it in */ 11376 hb->heartbeat.hb_info.addr_family = (uint8_t)net->ro._l_addr.sa.sa_family; 11377 hb->heartbeat.hb_info.addr_len = net->ro._l_addr.sa.sa_len; 11378 if (net->dest_state & SCTP_ADDR_UNCONFIRMED) { 11379 /* 11380 * we only take from the entropy pool if the address is not 11381 * confirmed. 11382 */ 11383 net->heartbeat_random1 = hb->heartbeat.hb_info.random_value1 = sctp_select_initial_TSN(&stcb->sctp_ep->sctp_ep); 11384 net->heartbeat_random2 = hb->heartbeat.hb_info.random_value2 = sctp_select_initial_TSN(&stcb->sctp_ep->sctp_ep); 11385 } else { 11386 net->heartbeat_random1 = hb->heartbeat.hb_info.random_value1 = 0; 11387 net->heartbeat_random2 = hb->heartbeat.hb_info.random_value2 = 0; 11388 } 11389 switch (net->ro._l_addr.sa.sa_family) { 11390 #ifdef INET 11391 case AF_INET: 11392 memcpy(hb->heartbeat.hb_info.address, 11393 &net->ro._l_addr.sin.sin_addr, 11394 sizeof(net->ro._l_addr.sin.sin_addr)); 11395 break; 11396 #endif 11397 #ifdef INET6 11398 case AF_INET6: 11399 memcpy(hb->heartbeat.hb_info.address, 11400 &net->ro._l_addr.sin6.sin6_addr, 11401 sizeof(net->ro._l_addr.sin6.sin6_addr)); 11402 break; 11403 #endif 11404 default: 11405 if (chk->data) { 11406 sctp_m_freem(chk->data); 11407 chk->data = NULL; 11408 } 11409 sctp_free_a_chunk(stcb, chk, so_locked); 11410 return; 11411 break; 11412 } 11413 net->hb_responded = 0; 11414 TAILQ_INSERT_TAIL(&stcb->asoc.control_send_queue, chk, sctp_next); 11415 stcb->asoc.ctrl_queue_cnt++; 11416 SCTP_STAT_INCR(sctps_sendheartbeat); 11417 return; 11418 } 11419 11420 void 11421 sctp_send_ecn_echo(struct sctp_tcb *stcb, struct sctp_nets *net, 11422 uint32_t high_tsn) 11423 { 11424 struct sctp_association *asoc; 11425 struct sctp_ecne_chunk *ecne; 11426 struct sctp_tmit_chunk *chk; 11427 11428 if (net == NULL) { 11429 return; 11430 } 11431 asoc = &stcb->asoc; 11432 SCTP_TCB_LOCK_ASSERT(stcb); 11433 TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { 11434 if ((chk->rec.chunk_id.id == SCTP_ECN_ECHO) && (net == chk->whoTo)) { 11435 /* found a previous ECN_ECHO update it if needed */ 11436 uint32_t cnt, ctsn; 11437 11438 ecne = mtod(chk->data, struct sctp_ecne_chunk *); 11439 ctsn = ntohl(ecne->tsn); 11440 if (SCTP_TSN_GT(high_tsn, ctsn)) { 11441 ecne->tsn = htonl(high_tsn); 11442 SCTP_STAT_INCR(sctps_queue_upd_ecne); 11443 } 11444 cnt = ntohl(ecne->num_pkts_since_cwr); 11445 cnt++; 11446 ecne->num_pkts_since_cwr = htonl(cnt); 11447 return; 11448 } 11449 } 11450 /* nope could not find one to update so we must build one */ 11451 sctp_alloc_a_chunk(stcb, chk); 11452 if (chk == NULL) { 11453 return; 11454 } 11455 SCTP_STAT_INCR(sctps_queue_upd_ecne); 11456 chk->copy_by_ref = 0; 11457 chk->rec.chunk_id.id = SCTP_ECN_ECHO; 11458 chk->rec.chunk_id.can_take_data = 0; 11459 chk->flags = 0; 11460 chk->asoc = &stcb->asoc; 11461 chk->send_size = sizeof(struct sctp_ecne_chunk); 11462 chk->data = sctp_get_mbuf_for_msg(chk->send_size, 0, M_NOWAIT, 1, MT_HEADER); 11463 if (chk->data == NULL) { 11464 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); 11465 return; 11466 } 11467 SCTP_BUF_RESV_UF(chk->data, SCTP_MIN_OVERHEAD); 11468 SCTP_BUF_LEN(chk->data) = chk->send_size; 11469 chk->sent = SCTP_DATAGRAM_UNSENT; 11470 chk->snd_count = 0; 11471 chk->whoTo = net; 11472 atomic_add_int(&chk->whoTo->ref_count, 1); 11473 11474 stcb->asoc.ecn_echo_cnt_onq++; 11475 ecne = mtod(chk->data, struct sctp_ecne_chunk *); 11476 ecne->ch.chunk_type = SCTP_ECN_ECHO; 11477 ecne->ch.chunk_flags = 0; 11478 ecne->ch.chunk_length = htons(sizeof(struct sctp_ecne_chunk)); 11479 ecne->tsn = htonl(high_tsn); 11480 ecne->num_pkts_since_cwr = htonl(1); 11481 TAILQ_INSERT_HEAD(&stcb->asoc.control_send_queue, chk, sctp_next); 11482 asoc->ctrl_queue_cnt++; 11483 } 11484 11485 void 11486 sctp_send_packet_dropped(struct sctp_tcb *stcb, struct sctp_nets *net, 11487 struct mbuf *m, int len, int iphlen, int bad_crc) 11488 { 11489 struct sctp_association *asoc; 11490 struct sctp_pktdrop_chunk *drp; 11491 struct sctp_tmit_chunk *chk; 11492 uint8_t *datap; 11493 int was_trunc = 0; 11494 int fullsz = 0; 11495 long spc; 11496 int offset; 11497 struct sctp_chunkhdr *ch, chunk_buf; 11498 unsigned int chk_length; 11499 11500 if (!stcb) { 11501 return; 11502 } 11503 asoc = &stcb->asoc; 11504 SCTP_TCB_LOCK_ASSERT(stcb); 11505 if (asoc->pktdrop_supported == 0) { 11506 /*- 11507 * peer must declare support before I send one. 11508 */ 11509 return; 11510 } 11511 if (stcb->sctp_socket == NULL) { 11512 return; 11513 } 11514 sctp_alloc_a_chunk(stcb, chk); 11515 if (chk == NULL) { 11516 return; 11517 } 11518 chk->copy_by_ref = 0; 11519 chk->rec.chunk_id.id = SCTP_PACKET_DROPPED; 11520 chk->rec.chunk_id.can_take_data = 1; 11521 chk->flags = 0; 11522 len -= iphlen; 11523 chk->send_size = len; 11524 /* Validate that we do not have an ABORT in here. */ 11525 offset = iphlen + sizeof(struct sctphdr); 11526 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, 11527 sizeof(*ch), (uint8_t *)&chunk_buf); 11528 while (ch != NULL) { 11529 chk_length = ntohs(ch->chunk_length); 11530 if (chk_length < sizeof(*ch)) { 11531 /* break to abort land */ 11532 break; 11533 } 11534 switch (ch->chunk_type) { 11535 case SCTP_PACKET_DROPPED: 11536 case SCTP_ABORT_ASSOCIATION: 11537 case SCTP_INITIATION_ACK: 11538 /** 11539 * We don't respond with an PKT-DROP to an ABORT 11540 * or PKT-DROP. We also do not respond to an 11541 * INIT-ACK, because we can't know if the initiation 11542 * tag is correct or not. 11543 */ 11544 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); 11545 return; 11546 default: 11547 break; 11548 } 11549 offset += SCTP_SIZE32(chk_length); 11550 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, 11551 sizeof(*ch), (uint8_t *)&chunk_buf); 11552 } 11553 11554 if ((len + SCTP_MAX_OVERHEAD + sizeof(struct sctp_pktdrop_chunk)) > 11555 min(stcb->asoc.smallest_mtu, MCLBYTES)) { 11556 /* 11557 * only send 1 mtu worth, trim off the excess on the end. 11558 */ 11559 fullsz = len; 11560 len = min(stcb->asoc.smallest_mtu, MCLBYTES) - SCTP_MAX_OVERHEAD; 11561 was_trunc = 1; 11562 } 11563 chk->asoc = &stcb->asoc; 11564 chk->data = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA); 11565 if (chk->data == NULL) { 11566 jump_out: 11567 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); 11568 return; 11569 } 11570 SCTP_BUF_RESV_UF(chk->data, SCTP_MIN_OVERHEAD); 11571 drp = mtod(chk->data, struct sctp_pktdrop_chunk *); 11572 if (drp == NULL) { 11573 sctp_m_freem(chk->data); 11574 chk->data = NULL; 11575 goto jump_out; 11576 } 11577 chk->book_size = SCTP_SIZE32((chk->send_size + sizeof(struct sctp_pktdrop_chunk) + 11578 sizeof(struct sctphdr) + SCTP_MED_OVERHEAD)); 11579 chk->book_size_scale = 0; 11580 if (was_trunc) { 11581 drp->ch.chunk_flags = SCTP_PACKET_TRUNCATED; 11582 drp->trunc_len = htons(fullsz); 11583 /* 11584 * Len is already adjusted to size minus overhead above take 11585 * out the pkt_drop chunk itself from it. 11586 */ 11587 chk->send_size = (uint16_t)(len - sizeof(struct sctp_pktdrop_chunk)); 11588 len = chk->send_size; 11589 } else { 11590 /* no truncation needed */ 11591 drp->ch.chunk_flags = 0; 11592 drp->trunc_len = htons(0); 11593 } 11594 if (bad_crc) { 11595 drp->ch.chunk_flags |= SCTP_BADCRC; 11596 } 11597 chk->send_size += sizeof(struct sctp_pktdrop_chunk); 11598 SCTP_BUF_LEN(chk->data) = chk->send_size; 11599 chk->sent = SCTP_DATAGRAM_UNSENT; 11600 chk->snd_count = 0; 11601 if (net) { 11602 /* we should hit here */ 11603 chk->whoTo = net; 11604 atomic_add_int(&chk->whoTo->ref_count, 1); 11605 } else { 11606 chk->whoTo = NULL; 11607 } 11608 drp->ch.chunk_type = SCTP_PACKET_DROPPED; 11609 drp->ch.chunk_length = htons(chk->send_size); 11610 spc = SCTP_SB_LIMIT_RCV(stcb->sctp_socket); 11611 if (spc < 0) { 11612 spc = 0; 11613 } 11614 drp->bottle_bw = htonl(spc); 11615 if (asoc->my_rwnd) { 11616 drp->current_onq = htonl(asoc->size_on_reasm_queue + 11617 asoc->size_on_all_streams + 11618 asoc->my_rwnd_control_len + 11619 stcb->sctp_socket->so_rcv.sb_cc); 11620 } else { 11621 /*- 11622 * If my rwnd is 0, possibly from mbuf depletion as well as 11623 * space used, tell the peer there is NO space aka onq == bw 11624 */ 11625 drp->current_onq = htonl(spc); 11626 } 11627 drp->reserved = 0; 11628 datap = drp->data; 11629 m_copydata(m, iphlen, len, (caddr_t)datap); 11630 TAILQ_INSERT_TAIL(&stcb->asoc.control_send_queue, chk, sctp_next); 11631 asoc->ctrl_queue_cnt++; 11632 } 11633 11634 void 11635 sctp_send_cwr(struct sctp_tcb *stcb, struct sctp_nets *net, uint32_t high_tsn, uint8_t override) 11636 { 11637 struct sctp_association *asoc; 11638 struct sctp_cwr_chunk *cwr; 11639 struct sctp_tmit_chunk *chk; 11640 11641 SCTP_TCB_LOCK_ASSERT(stcb); 11642 if (net == NULL) { 11643 return; 11644 } 11645 asoc = &stcb->asoc; 11646 TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { 11647 if ((chk->rec.chunk_id.id == SCTP_ECN_CWR) && (net == chk->whoTo)) { 11648 /* 11649 * found a previous CWR queued to same destination 11650 * update it if needed 11651 */ 11652 uint32_t ctsn; 11653 11654 cwr = mtod(chk->data, struct sctp_cwr_chunk *); 11655 ctsn = ntohl(cwr->tsn); 11656 if (SCTP_TSN_GT(high_tsn, ctsn)) { 11657 cwr->tsn = htonl(high_tsn); 11658 } 11659 if (override & SCTP_CWR_REDUCE_OVERRIDE) { 11660 /* Make sure override is carried */ 11661 cwr->ch.chunk_flags |= SCTP_CWR_REDUCE_OVERRIDE; 11662 } 11663 return; 11664 } 11665 } 11666 sctp_alloc_a_chunk(stcb, chk); 11667 if (chk == NULL) { 11668 return; 11669 } 11670 chk->copy_by_ref = 0; 11671 chk->rec.chunk_id.id = SCTP_ECN_CWR; 11672 chk->rec.chunk_id.can_take_data = 1; 11673 chk->flags = 0; 11674 chk->asoc = &stcb->asoc; 11675 chk->send_size = sizeof(struct sctp_cwr_chunk); 11676 chk->data = sctp_get_mbuf_for_msg(chk->send_size, 0, M_NOWAIT, 1, MT_HEADER); 11677 if (chk->data == NULL) { 11678 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); 11679 return; 11680 } 11681 SCTP_BUF_RESV_UF(chk->data, SCTP_MIN_OVERHEAD); 11682 SCTP_BUF_LEN(chk->data) = chk->send_size; 11683 chk->sent = SCTP_DATAGRAM_UNSENT; 11684 chk->snd_count = 0; 11685 chk->whoTo = net; 11686 atomic_add_int(&chk->whoTo->ref_count, 1); 11687 cwr = mtod(chk->data, struct sctp_cwr_chunk *); 11688 cwr->ch.chunk_type = SCTP_ECN_CWR; 11689 cwr->ch.chunk_flags = override; 11690 cwr->ch.chunk_length = htons(sizeof(struct sctp_cwr_chunk)); 11691 cwr->tsn = htonl(high_tsn); 11692 TAILQ_INSERT_TAIL(&stcb->asoc.control_send_queue, chk, sctp_next); 11693 asoc->ctrl_queue_cnt++; 11694 } 11695 11696 static int 11697 sctp_add_stream_reset_out(struct sctp_tcb *stcb, struct sctp_tmit_chunk *chk, 11698 uint32_t seq, uint32_t resp_seq, uint32_t last_sent) 11699 { 11700 uint16_t len, old_len, i; 11701 struct sctp_stream_reset_out_request *req_out; 11702 struct sctp_chunkhdr *ch; 11703 int at; 11704 int number_entries = 0; 11705 11706 ch = mtod(chk->data, struct sctp_chunkhdr *); 11707 old_len = len = SCTP_SIZE32(ntohs(ch->chunk_length)); 11708 /* get to new offset for the param. */ 11709 req_out = (struct sctp_stream_reset_out_request *)((caddr_t)ch + len); 11710 /* now how long will this param be? */ 11711 for (i = 0; i < stcb->asoc.streamoutcnt; i++) { 11712 if ((stcb->asoc.strmout[i].state == SCTP_STREAM_RESET_PENDING) && 11713 (stcb->asoc.strmout[i].chunks_on_queues == 0) && 11714 TAILQ_EMPTY(&stcb->asoc.strmout[i].outqueue)) { 11715 number_entries++; 11716 } 11717 } 11718 if (number_entries == 0) { 11719 return (0); 11720 } 11721 if (number_entries == stcb->asoc.streamoutcnt) { 11722 number_entries = 0; 11723 } 11724 if (number_entries > SCTP_MAX_STREAMS_AT_ONCE_RESET) { 11725 number_entries = SCTP_MAX_STREAMS_AT_ONCE_RESET; 11726 } 11727 len = (uint16_t)(sizeof(struct sctp_stream_reset_out_request) + (sizeof(uint16_t) * number_entries)); 11728 req_out->ph.param_type = htons(SCTP_STR_RESET_OUT_REQUEST); 11729 req_out->ph.param_length = htons(len); 11730 req_out->request_seq = htonl(seq); 11731 req_out->response_seq = htonl(resp_seq); 11732 req_out->send_reset_at_tsn = htonl(last_sent); 11733 at = 0; 11734 if (number_entries) { 11735 for (i = 0; i < stcb->asoc.streamoutcnt; i++) { 11736 if ((stcb->asoc.strmout[i].state == SCTP_STREAM_RESET_PENDING) && 11737 (stcb->asoc.strmout[i].chunks_on_queues == 0) && 11738 TAILQ_EMPTY(&stcb->asoc.strmout[i].outqueue)) { 11739 req_out->list_of_streams[at] = htons(i); 11740 at++; 11741 stcb->asoc.strmout[i].state = SCTP_STREAM_RESET_IN_FLIGHT; 11742 if (at >= number_entries) { 11743 break; 11744 } 11745 } 11746 } 11747 } else { 11748 for (i = 0; i < stcb->asoc.streamoutcnt; i++) { 11749 stcb->asoc.strmout[i].state = SCTP_STREAM_RESET_IN_FLIGHT; 11750 } 11751 } 11752 if (SCTP_SIZE32(len) > len) { 11753 /*- 11754 * Need to worry about the pad we may end up adding to the 11755 * end. This is easy since the struct is either aligned to 4 11756 * bytes or 2 bytes off. 11757 */ 11758 req_out->list_of_streams[number_entries] = 0; 11759 } 11760 /* now fix the chunk length */ 11761 ch->chunk_length = htons(len + old_len); 11762 chk->book_size = len + old_len; 11763 chk->book_size_scale = 0; 11764 chk->send_size = SCTP_SIZE32(chk->book_size); 11765 SCTP_BUF_LEN(chk->data) = chk->send_size; 11766 return (1); 11767 } 11768 11769 static void 11770 sctp_add_stream_reset_in(struct sctp_tmit_chunk *chk, 11771 int number_entries, uint16_t *list, 11772 uint32_t seq) 11773 { 11774 uint16_t len, old_len, i; 11775 struct sctp_stream_reset_in_request *req_in; 11776 struct sctp_chunkhdr *ch; 11777 11778 ch = mtod(chk->data, struct sctp_chunkhdr *); 11779 old_len = len = SCTP_SIZE32(ntohs(ch->chunk_length)); 11780 11781 /* get to new offset for the param. */ 11782 req_in = (struct sctp_stream_reset_in_request *)((caddr_t)ch + len); 11783 /* now how long will this param be? */ 11784 len = (uint16_t)(sizeof(struct sctp_stream_reset_in_request) + (sizeof(uint16_t) * number_entries)); 11785 req_in->ph.param_type = htons(SCTP_STR_RESET_IN_REQUEST); 11786 req_in->ph.param_length = htons(len); 11787 req_in->request_seq = htonl(seq); 11788 if (number_entries) { 11789 for (i = 0; i < number_entries; i++) { 11790 req_in->list_of_streams[i] = htons(list[i]); 11791 } 11792 } 11793 if (SCTP_SIZE32(len) > len) { 11794 /*- 11795 * Need to worry about the pad we may end up adding to the 11796 * end. This is easy since the struct is either aligned to 4 11797 * bytes or 2 bytes off. 11798 */ 11799 req_in->list_of_streams[number_entries] = 0; 11800 } 11801 /* now fix the chunk length */ 11802 ch->chunk_length = htons(len + old_len); 11803 chk->book_size = len + old_len; 11804 chk->book_size_scale = 0; 11805 chk->send_size = SCTP_SIZE32(chk->book_size); 11806 SCTP_BUF_LEN(chk->data) = chk->send_size; 11807 return; 11808 } 11809 11810 static void 11811 sctp_add_stream_reset_tsn(struct sctp_tmit_chunk *chk, 11812 uint32_t seq) 11813 { 11814 uint16_t len, old_len; 11815 struct sctp_stream_reset_tsn_request *req_tsn; 11816 struct sctp_chunkhdr *ch; 11817 11818 ch = mtod(chk->data, struct sctp_chunkhdr *); 11819 old_len = len = SCTP_SIZE32(ntohs(ch->chunk_length)); 11820 11821 /* get to new offset for the param. */ 11822 req_tsn = (struct sctp_stream_reset_tsn_request *)((caddr_t)ch + len); 11823 /* now how long will this param be? */ 11824 len = sizeof(struct sctp_stream_reset_tsn_request); 11825 req_tsn->ph.param_type = htons(SCTP_STR_RESET_TSN_REQUEST); 11826 req_tsn->ph.param_length = htons(len); 11827 req_tsn->request_seq = htonl(seq); 11828 11829 /* now fix the chunk length */ 11830 ch->chunk_length = htons(len + old_len); 11831 chk->send_size = len + old_len; 11832 chk->book_size = SCTP_SIZE32(chk->send_size); 11833 chk->book_size_scale = 0; 11834 SCTP_BUF_LEN(chk->data) = SCTP_SIZE32(chk->send_size); 11835 return; 11836 } 11837 11838 void 11839 sctp_add_stream_reset_result(struct sctp_tmit_chunk *chk, 11840 uint32_t resp_seq, uint32_t result) 11841 { 11842 uint16_t len, old_len; 11843 struct sctp_stream_reset_response *resp; 11844 struct sctp_chunkhdr *ch; 11845 11846 ch = mtod(chk->data, struct sctp_chunkhdr *); 11847 old_len = len = SCTP_SIZE32(ntohs(ch->chunk_length)); 11848 11849 /* get to new offset for the param. */ 11850 resp = (struct sctp_stream_reset_response *)((caddr_t)ch + len); 11851 /* now how long will this param be? */ 11852 len = sizeof(struct sctp_stream_reset_response); 11853 resp->ph.param_type = htons(SCTP_STR_RESET_RESPONSE); 11854 resp->ph.param_length = htons(len); 11855 resp->response_seq = htonl(resp_seq); 11856 resp->result = ntohl(result); 11857 11858 /* now fix the chunk length */ 11859 ch->chunk_length = htons(len + old_len); 11860 chk->book_size = len + old_len; 11861 chk->book_size_scale = 0; 11862 chk->send_size = SCTP_SIZE32(chk->book_size); 11863 SCTP_BUF_LEN(chk->data) = chk->send_size; 11864 return; 11865 } 11866 11867 void 11868 sctp_send_deferred_reset_response(struct sctp_tcb *stcb, 11869 struct sctp_stream_reset_list *ent, 11870 int response) 11871 { 11872 struct sctp_association *asoc; 11873 struct sctp_tmit_chunk *chk; 11874 struct sctp_chunkhdr *ch; 11875 11876 asoc = &stcb->asoc; 11877 11878 /* 11879 * Reset our last reset action to the new one IP -> response 11880 * (PERFORMED probably). This assures that if we fail to send, a 11881 * retran from the peer will get the new response. 11882 */ 11883 asoc->last_reset_action[0] = response; 11884 if (asoc->stream_reset_outstanding) { 11885 return; 11886 } 11887 sctp_alloc_a_chunk(stcb, chk); 11888 if (chk == NULL) { 11889 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 11890 return; 11891 } 11892 chk->copy_by_ref = 0; 11893 chk->rec.chunk_id.id = SCTP_STREAM_RESET; 11894 chk->rec.chunk_id.can_take_data = 0; 11895 chk->flags = 0; 11896 chk->asoc = &stcb->asoc; 11897 chk->book_size = sizeof(struct sctp_chunkhdr); 11898 chk->send_size = SCTP_SIZE32(chk->book_size); 11899 chk->book_size_scale = 0; 11900 chk->data = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA); 11901 if (chk->data == NULL) { 11902 sctp_free_a_chunk(stcb, chk, SCTP_SO_LOCKED); 11903 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 11904 return; 11905 } 11906 SCTP_BUF_RESV_UF(chk->data, SCTP_MIN_OVERHEAD); 11907 /* setup chunk parameters */ 11908 chk->sent = SCTP_DATAGRAM_UNSENT; 11909 chk->snd_count = 0; 11910 if (stcb->asoc.alternate) { 11911 chk->whoTo = stcb->asoc.alternate; 11912 } else { 11913 chk->whoTo = stcb->asoc.primary_destination; 11914 } 11915 ch = mtod(chk->data, struct sctp_chunkhdr *); 11916 ch->chunk_type = SCTP_STREAM_RESET; 11917 ch->chunk_flags = 0; 11918 ch->chunk_length = htons(chk->book_size); 11919 atomic_add_int(&chk->whoTo->ref_count, 1); 11920 SCTP_BUF_LEN(chk->data) = chk->send_size; 11921 sctp_add_stream_reset_result(chk, ent->seq, response); 11922 /* insert the chunk for sending */ 11923 TAILQ_INSERT_TAIL(&asoc->control_send_queue, 11924 chk, 11925 sctp_next); 11926 asoc->ctrl_queue_cnt++; 11927 } 11928 11929 void 11930 sctp_add_stream_reset_result_tsn(struct sctp_tmit_chunk *chk, 11931 uint32_t resp_seq, uint32_t result, 11932 uint32_t send_una, uint32_t recv_next) 11933 { 11934 uint16_t len, old_len; 11935 struct sctp_stream_reset_response_tsn *resp; 11936 struct sctp_chunkhdr *ch; 11937 11938 ch = mtod(chk->data, struct sctp_chunkhdr *); 11939 old_len = len = SCTP_SIZE32(ntohs(ch->chunk_length)); 11940 11941 /* get to new offset for the param. */ 11942 resp = (struct sctp_stream_reset_response_tsn *)((caddr_t)ch + len); 11943 /* now how long will this param be? */ 11944 len = sizeof(struct sctp_stream_reset_response_tsn); 11945 resp->ph.param_type = htons(SCTP_STR_RESET_RESPONSE); 11946 resp->ph.param_length = htons(len); 11947 resp->response_seq = htonl(resp_seq); 11948 resp->result = htonl(result); 11949 resp->senders_next_tsn = htonl(send_una); 11950 resp->receivers_next_tsn = htonl(recv_next); 11951 11952 /* now fix the chunk length */ 11953 ch->chunk_length = htons(len + old_len); 11954 chk->book_size = len + old_len; 11955 chk->send_size = SCTP_SIZE32(chk->book_size); 11956 chk->book_size_scale = 0; 11957 SCTP_BUF_LEN(chk->data) = chk->send_size; 11958 return; 11959 } 11960 11961 static void 11962 sctp_add_an_out_stream(struct sctp_tmit_chunk *chk, 11963 uint32_t seq, 11964 uint16_t adding) 11965 { 11966 uint16_t len, old_len; 11967 struct sctp_chunkhdr *ch; 11968 struct sctp_stream_reset_add_strm *addstr; 11969 11970 ch = mtod(chk->data, struct sctp_chunkhdr *); 11971 old_len = len = SCTP_SIZE32(ntohs(ch->chunk_length)); 11972 11973 /* get to new offset for the param. */ 11974 addstr = (struct sctp_stream_reset_add_strm *)((caddr_t)ch + len); 11975 /* now how long will this param be? */ 11976 len = sizeof(struct sctp_stream_reset_add_strm); 11977 11978 /* Fill it out. */ 11979 addstr->ph.param_type = htons(SCTP_STR_RESET_ADD_OUT_STREAMS); 11980 addstr->ph.param_length = htons(len); 11981 addstr->request_seq = htonl(seq); 11982 addstr->number_of_streams = htons(adding); 11983 addstr->reserved = 0; 11984 11985 /* now fix the chunk length */ 11986 ch->chunk_length = htons(len + old_len); 11987 chk->send_size = len + old_len; 11988 chk->book_size = SCTP_SIZE32(chk->send_size); 11989 chk->book_size_scale = 0; 11990 SCTP_BUF_LEN(chk->data) = SCTP_SIZE32(chk->send_size); 11991 return; 11992 } 11993 11994 static void 11995 sctp_add_an_in_stream(struct sctp_tmit_chunk *chk, 11996 uint32_t seq, 11997 uint16_t adding) 11998 { 11999 uint16_t len, old_len; 12000 struct sctp_chunkhdr *ch; 12001 struct sctp_stream_reset_add_strm *addstr; 12002 12003 ch = mtod(chk->data, struct sctp_chunkhdr *); 12004 old_len = len = SCTP_SIZE32(ntohs(ch->chunk_length)); 12005 12006 /* get to new offset for the param. */ 12007 addstr = (struct sctp_stream_reset_add_strm *)((caddr_t)ch + len); 12008 /* now how long will this param be? */ 12009 len = sizeof(struct sctp_stream_reset_add_strm); 12010 /* Fill it out. */ 12011 addstr->ph.param_type = htons(SCTP_STR_RESET_ADD_IN_STREAMS); 12012 addstr->ph.param_length = htons(len); 12013 addstr->request_seq = htonl(seq); 12014 addstr->number_of_streams = htons(adding); 12015 addstr->reserved = 0; 12016 12017 /* now fix the chunk length */ 12018 ch->chunk_length = htons(len + old_len); 12019 chk->send_size = len + old_len; 12020 chk->book_size = SCTP_SIZE32(chk->send_size); 12021 chk->book_size_scale = 0; 12022 SCTP_BUF_LEN(chk->data) = SCTP_SIZE32(chk->send_size); 12023 return; 12024 } 12025 12026 int 12027 sctp_send_stream_reset_out_if_possible(struct sctp_tcb *stcb, int so_locked) 12028 { 12029 struct sctp_association *asoc; 12030 struct sctp_tmit_chunk *chk; 12031 struct sctp_chunkhdr *ch; 12032 uint32_t seq; 12033 12034 asoc = &stcb->asoc; 12035 asoc->trigger_reset = 0; 12036 if (asoc->stream_reset_outstanding) { 12037 return (EALREADY); 12038 } 12039 sctp_alloc_a_chunk(stcb, chk); 12040 if (chk == NULL) { 12041 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 12042 return (ENOMEM); 12043 } 12044 chk->copy_by_ref = 0; 12045 chk->rec.chunk_id.id = SCTP_STREAM_RESET; 12046 chk->rec.chunk_id.can_take_data = 0; 12047 chk->flags = 0; 12048 chk->asoc = &stcb->asoc; 12049 chk->book_size = sizeof(struct sctp_chunkhdr); 12050 chk->send_size = SCTP_SIZE32(chk->book_size); 12051 chk->book_size_scale = 0; 12052 chk->data = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA); 12053 if (chk->data == NULL) { 12054 sctp_free_a_chunk(stcb, chk, so_locked); 12055 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 12056 return (ENOMEM); 12057 } 12058 SCTP_BUF_RESV_UF(chk->data, SCTP_MIN_OVERHEAD); 12059 12060 /* setup chunk parameters */ 12061 chk->sent = SCTP_DATAGRAM_UNSENT; 12062 chk->snd_count = 0; 12063 if (stcb->asoc.alternate) { 12064 chk->whoTo = stcb->asoc.alternate; 12065 } else { 12066 chk->whoTo = stcb->asoc.primary_destination; 12067 } 12068 ch = mtod(chk->data, struct sctp_chunkhdr *); 12069 ch->chunk_type = SCTP_STREAM_RESET; 12070 ch->chunk_flags = 0; 12071 ch->chunk_length = htons(chk->book_size); 12072 atomic_add_int(&chk->whoTo->ref_count, 1); 12073 SCTP_BUF_LEN(chk->data) = chk->send_size; 12074 seq = stcb->asoc.str_reset_seq_out; 12075 if (sctp_add_stream_reset_out(stcb, chk, seq, (stcb->asoc.str_reset_seq_in - 1), (stcb->asoc.sending_seq - 1))) { 12076 seq++; 12077 asoc->stream_reset_outstanding++; 12078 } else { 12079 m_freem(chk->data); 12080 chk->data = NULL; 12081 sctp_free_a_chunk(stcb, chk, so_locked); 12082 return (ENOENT); 12083 } 12084 asoc->str_reset = chk; 12085 /* insert the chunk for sending */ 12086 TAILQ_INSERT_TAIL(&asoc->control_send_queue, 12087 chk, 12088 sctp_next); 12089 asoc->ctrl_queue_cnt++; 12090 12091 if (stcb->asoc.send_sack) { 12092 sctp_send_sack(stcb, so_locked); 12093 } 12094 sctp_timer_start(SCTP_TIMER_TYPE_STRRESET, stcb->sctp_ep, stcb, chk->whoTo); 12095 return (0); 12096 } 12097 12098 int 12099 sctp_send_str_reset_req(struct sctp_tcb *stcb, 12100 uint16_t number_entries, uint16_t *list, 12101 uint8_t send_in_req, 12102 uint8_t send_tsn_req, 12103 uint8_t add_stream, 12104 uint16_t adding_o, 12105 uint16_t adding_i, uint8_t peer_asked) 12106 { 12107 struct sctp_association *asoc; 12108 struct sctp_tmit_chunk *chk; 12109 struct sctp_chunkhdr *ch; 12110 int can_send_out_req = 0; 12111 uint32_t seq; 12112 12113 asoc = &stcb->asoc; 12114 if (asoc->stream_reset_outstanding) { 12115 /*- 12116 * Already one pending, must get ACK back to clear the flag. 12117 */ 12118 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EBUSY); 12119 return (EBUSY); 12120 } 12121 if ((send_in_req == 0) && (send_tsn_req == 0) && 12122 (add_stream == 0)) { 12123 /* nothing to do */ 12124 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12125 return (EINVAL); 12126 } 12127 if (send_tsn_req && send_in_req) { 12128 /* error, can't do that */ 12129 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12130 return (EINVAL); 12131 } else if (send_in_req) { 12132 can_send_out_req = 1; 12133 } 12134 if (number_entries > (MCLBYTES - 12135 SCTP_MIN_OVERHEAD - 12136 sizeof(struct sctp_chunkhdr) - 12137 sizeof(struct sctp_stream_reset_out_request)) / 12138 sizeof(uint16_t)) { 12139 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 12140 return (ENOMEM); 12141 } 12142 sctp_alloc_a_chunk(stcb, chk); 12143 if (chk == NULL) { 12144 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 12145 return (ENOMEM); 12146 } 12147 chk->copy_by_ref = 0; 12148 chk->rec.chunk_id.id = SCTP_STREAM_RESET; 12149 chk->rec.chunk_id.can_take_data = 0; 12150 chk->flags = 0; 12151 chk->asoc = &stcb->asoc; 12152 chk->book_size = sizeof(struct sctp_chunkhdr); 12153 chk->send_size = SCTP_SIZE32(chk->book_size); 12154 chk->book_size_scale = 0; 12155 12156 chk->data = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA); 12157 if (chk->data == NULL) { 12158 sctp_free_a_chunk(stcb, chk, SCTP_SO_LOCKED); 12159 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 12160 return (ENOMEM); 12161 } 12162 SCTP_BUF_RESV_UF(chk->data, SCTP_MIN_OVERHEAD); 12163 12164 /* setup chunk parameters */ 12165 chk->sent = SCTP_DATAGRAM_UNSENT; 12166 chk->snd_count = 0; 12167 if (stcb->asoc.alternate) { 12168 chk->whoTo = stcb->asoc.alternate; 12169 } else { 12170 chk->whoTo = stcb->asoc.primary_destination; 12171 } 12172 atomic_add_int(&chk->whoTo->ref_count, 1); 12173 ch = mtod(chk->data, struct sctp_chunkhdr *); 12174 ch->chunk_type = SCTP_STREAM_RESET; 12175 ch->chunk_flags = 0; 12176 ch->chunk_length = htons(chk->book_size); 12177 SCTP_BUF_LEN(chk->data) = chk->send_size; 12178 12179 seq = stcb->asoc.str_reset_seq_out; 12180 if (can_send_out_req) { 12181 int ret; 12182 12183 ret = sctp_add_stream_reset_out(stcb, chk, seq, (stcb->asoc.str_reset_seq_in - 1), (stcb->asoc.sending_seq - 1)); 12184 if (ret) { 12185 seq++; 12186 asoc->stream_reset_outstanding++; 12187 } 12188 } 12189 if ((add_stream & 1) && 12190 ((stcb->asoc.strm_realoutsize - stcb->asoc.streamoutcnt) < adding_o)) { 12191 /* Need to allocate more */ 12192 struct sctp_stream_out *oldstream; 12193 struct sctp_stream_queue_pending *sp, *nsp; 12194 int i; 12195 #if defined(SCTP_DETAILED_STR_STATS) 12196 int j; 12197 #endif 12198 12199 oldstream = stcb->asoc.strmout; 12200 /* get some more */ 12201 SCTP_MALLOC(stcb->asoc.strmout, struct sctp_stream_out *, 12202 (stcb->asoc.streamoutcnt + adding_o) * sizeof(struct sctp_stream_out), 12203 SCTP_M_STRMO); 12204 if (stcb->asoc.strmout == NULL) { 12205 uint8_t x; 12206 12207 stcb->asoc.strmout = oldstream; 12208 /* Turn off the bit */ 12209 x = add_stream & 0xfe; 12210 add_stream = x; 12211 goto skip_stuff; 12212 } 12213 /* 12214 * Ok now we proceed with copying the old out stuff and 12215 * initializing the new stuff. 12216 */ 12217 SCTP_TCB_SEND_LOCK(stcb); 12218 stcb->asoc.ss_functions.sctp_ss_clear(stcb, &stcb->asoc, 0, 1); 12219 for (i = 0; i < stcb->asoc.streamoutcnt; i++) { 12220 TAILQ_INIT(&stcb->asoc.strmout[i].outqueue); 12221 stcb->asoc.strmout[i].chunks_on_queues = oldstream[i].chunks_on_queues; 12222 stcb->asoc.strmout[i].next_mid_ordered = oldstream[i].next_mid_ordered; 12223 stcb->asoc.strmout[i].next_mid_unordered = oldstream[i].next_mid_unordered; 12224 stcb->asoc.strmout[i].last_msg_incomplete = oldstream[i].last_msg_incomplete; 12225 stcb->asoc.strmout[i].sid = i; 12226 stcb->asoc.strmout[i].state = oldstream[i].state; 12227 /* FIX ME FIX ME */ 12228 /* 12229 * This should be a SS_COPY operation FIX ME STREAM 12230 * SCHEDULER EXPERT 12231 */ 12232 stcb->asoc.ss_functions.sctp_ss_init_stream(stcb, &stcb->asoc.strmout[i], &oldstream[i]); 12233 /* now anything on those queues? */ 12234 TAILQ_FOREACH_SAFE(sp, &oldstream[i].outqueue, next, nsp) { 12235 TAILQ_REMOVE(&oldstream[i].outqueue, sp, next); 12236 TAILQ_INSERT_TAIL(&stcb->asoc.strmout[i].outqueue, sp, next); 12237 } 12238 12239 } 12240 /* now the new streams */ 12241 stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc, 1); 12242 for (i = stcb->asoc.streamoutcnt; i < (stcb->asoc.streamoutcnt + adding_o); i++) { 12243 TAILQ_INIT(&stcb->asoc.strmout[i].outqueue); 12244 stcb->asoc.strmout[i].chunks_on_queues = 0; 12245 #if defined(SCTP_DETAILED_STR_STATS) 12246 for (j = 0; j < SCTP_PR_SCTP_MAX + 1; j++) { 12247 stcb->asoc.strmout[i].abandoned_sent[j] = 0; 12248 stcb->asoc.strmout[i].abandoned_unsent[j] = 0; 12249 } 12250 #else 12251 stcb->asoc.strmout[i].abandoned_sent[0] = 0; 12252 stcb->asoc.strmout[i].abandoned_unsent[0] = 0; 12253 #endif 12254 stcb->asoc.strmout[i].next_mid_ordered = 0; 12255 stcb->asoc.strmout[i].next_mid_unordered = 0; 12256 stcb->asoc.strmout[i].sid = i; 12257 stcb->asoc.strmout[i].last_msg_incomplete = 0; 12258 stcb->asoc.ss_functions.sctp_ss_init_stream(stcb, &stcb->asoc.strmout[i], NULL); 12259 stcb->asoc.strmout[i].state = SCTP_STREAM_CLOSED; 12260 } 12261 stcb->asoc.strm_realoutsize = stcb->asoc.streamoutcnt + adding_o; 12262 SCTP_FREE(oldstream, SCTP_M_STRMO); 12263 SCTP_TCB_SEND_UNLOCK(stcb); 12264 } 12265 skip_stuff: 12266 if ((add_stream & 1) && (adding_o > 0)) { 12267 asoc->strm_pending_add_size = adding_o; 12268 asoc->peer_req_out = peer_asked; 12269 sctp_add_an_out_stream(chk, seq, adding_o); 12270 seq++; 12271 asoc->stream_reset_outstanding++; 12272 } 12273 if ((add_stream & 2) && (adding_i > 0)) { 12274 sctp_add_an_in_stream(chk, seq, adding_i); 12275 seq++; 12276 asoc->stream_reset_outstanding++; 12277 } 12278 if (send_in_req) { 12279 sctp_add_stream_reset_in(chk, number_entries, list, seq); 12280 seq++; 12281 asoc->stream_reset_outstanding++; 12282 } 12283 if (send_tsn_req) { 12284 sctp_add_stream_reset_tsn(chk, seq); 12285 asoc->stream_reset_outstanding++; 12286 } 12287 asoc->str_reset = chk; 12288 /* insert the chunk for sending */ 12289 TAILQ_INSERT_TAIL(&asoc->control_send_queue, 12290 chk, 12291 sctp_next); 12292 asoc->ctrl_queue_cnt++; 12293 if (stcb->asoc.send_sack) { 12294 sctp_send_sack(stcb, SCTP_SO_LOCKED); 12295 } 12296 sctp_timer_start(SCTP_TIMER_TYPE_STRRESET, stcb->sctp_ep, stcb, chk->whoTo); 12297 return (0); 12298 } 12299 12300 void 12301 sctp_send_abort(struct mbuf *m, int iphlen, struct sockaddr *src, struct sockaddr *dst, 12302 struct sctphdr *sh, uint32_t vtag, struct mbuf *cause, 12303 uint8_t mflowtype, uint32_t mflowid, uint16_t fibnum, 12304 uint32_t vrf_id, uint16_t port) 12305 { 12306 /* Don't respond to an ABORT with an ABORT. */ 12307 if (sctp_is_there_an_abort_here(m, iphlen, &vtag)) { 12308 if (cause) 12309 sctp_m_freem(cause); 12310 return; 12311 } 12312 sctp_send_resp_msg(src, dst, sh, vtag, SCTP_ABORT_ASSOCIATION, cause, 12313 mflowtype, mflowid, fibnum, 12314 vrf_id, port); 12315 return; 12316 } 12317 12318 void 12319 sctp_send_operr_to(struct sockaddr *src, struct sockaddr *dst, 12320 struct sctphdr *sh, uint32_t vtag, struct mbuf *cause, 12321 uint8_t mflowtype, uint32_t mflowid, uint16_t fibnum, 12322 uint32_t vrf_id, uint16_t port) 12323 { 12324 sctp_send_resp_msg(src, dst, sh, vtag, SCTP_OPERATION_ERROR, cause, 12325 mflowtype, mflowid, fibnum, 12326 vrf_id, port); 12327 return; 12328 } 12329 12330 static struct mbuf * 12331 sctp_copy_resume(struct uio *uio, 12332 int max_send_len, 12333 int user_marks_eor, 12334 int *error, 12335 uint32_t *sndout, 12336 struct mbuf **new_tail) 12337 { 12338 struct mbuf *m; 12339 12340 m = m_uiotombuf(uio, M_WAITOK, max_send_len, 0, 12341 (M_PKTHDR | (user_marks_eor ? M_EOR : 0))); 12342 if (m == NULL) { 12343 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, ENOBUFS); 12344 *error = ENOBUFS; 12345 } else { 12346 *sndout = m_length(m, NULL); 12347 *new_tail = m_last(m); 12348 } 12349 return (m); 12350 } 12351 12352 static int 12353 sctp_copy_one(struct sctp_stream_queue_pending *sp, 12354 struct uio *uio, 12355 int resv_upfront) 12356 { 12357 sp->data = m_uiotombuf(uio, M_WAITOK, sp->length, 12358 resv_upfront, 0); 12359 if (sp->data == NULL) { 12360 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, ENOBUFS); 12361 return (ENOBUFS); 12362 } 12363 sp->tail_mbuf = m_last(sp->data); 12364 return (0); 12365 } 12366 12367 12368 12369 static struct sctp_stream_queue_pending * 12370 sctp_copy_it_in(struct sctp_tcb *stcb, 12371 struct sctp_association *asoc, 12372 struct sctp_sndrcvinfo *srcv, 12373 struct uio *uio, 12374 struct sctp_nets *net, 12375 int max_send_len, 12376 int user_marks_eor, 12377 int *error) 12378 { 12379 /*- 12380 * This routine must be very careful in its work. Protocol 12381 * processing is up and running so care must be taken to spl...() 12382 * when you need to do something that may effect the stcb/asoc. The 12383 * sb is locked however. When data is copied the protocol processing 12384 * should be enabled since this is a slower operation... 12385 */ 12386 struct sctp_stream_queue_pending *sp = NULL; 12387 int resv_in_first; 12388 12389 *error = 0; 12390 /* Now can we send this? */ 12391 if ((SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_SENT) || 12392 (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_ACK_SENT) || 12393 (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED) || 12394 (asoc->state & SCTP_STATE_SHUTDOWN_PENDING)) { 12395 /* got data while shutting down */ 12396 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ECONNRESET); 12397 *error = ECONNRESET; 12398 goto out_now; 12399 } 12400 sctp_alloc_a_strmoq(stcb, sp); 12401 if (sp == NULL) { 12402 SCTP_LTRACE_ERR_RET(NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 12403 *error = ENOMEM; 12404 goto out_now; 12405 } 12406 sp->act_flags = 0; 12407 sp->sender_all_done = 0; 12408 sp->sinfo_flags = srcv->sinfo_flags; 12409 sp->timetolive = srcv->sinfo_timetolive; 12410 sp->ppid = srcv->sinfo_ppid; 12411 sp->context = srcv->sinfo_context; 12412 sp->fsn = 0; 12413 (void)SCTP_GETTIME_TIMEVAL(&sp->ts); 12414 12415 sp->sid = srcv->sinfo_stream; 12416 sp->length = (uint32_t)min(uio->uio_resid, max_send_len); 12417 if ((sp->length == (uint32_t)uio->uio_resid) && 12418 ((user_marks_eor == 0) || 12419 (srcv->sinfo_flags & SCTP_EOF) || 12420 (user_marks_eor && (srcv->sinfo_flags & SCTP_EOR)))) { 12421 sp->msg_is_complete = 1; 12422 } else { 12423 sp->msg_is_complete = 0; 12424 } 12425 sp->sender_all_done = 0; 12426 sp->some_taken = 0; 12427 sp->put_last_out = 0; 12428 resv_in_first = SCTP_DATA_CHUNK_OVERHEAD(stcb); 12429 sp->data = sp->tail_mbuf = NULL; 12430 if (sp->length == 0) { 12431 goto skip_copy; 12432 } 12433 if (srcv->sinfo_keynumber_valid) { 12434 sp->auth_keyid = srcv->sinfo_keynumber; 12435 } else { 12436 sp->auth_keyid = stcb->asoc.authinfo.active_keyid; 12437 } 12438 if (sctp_auth_is_required_chunk(SCTP_DATA, stcb->asoc.peer_auth_chunks)) { 12439 sctp_auth_key_acquire(stcb, sp->auth_keyid); 12440 sp->holds_key_ref = 1; 12441 } 12442 *error = sctp_copy_one(sp, uio, resv_in_first); 12443 skip_copy: 12444 if (*error) { 12445 sctp_free_a_strmoq(stcb, sp, SCTP_SO_LOCKED); 12446 sp = NULL; 12447 } else { 12448 if (sp->sinfo_flags & SCTP_ADDR_OVER) { 12449 sp->net = net; 12450 atomic_add_int(&sp->net->ref_count, 1); 12451 } else { 12452 sp->net = NULL; 12453 } 12454 sctp_set_prsctp_policy(sp); 12455 } 12456 out_now: 12457 return (sp); 12458 } 12459 12460 12461 int 12462 sctp_sosend(struct socket *so, 12463 struct sockaddr *addr, 12464 struct uio *uio, 12465 struct mbuf *top, 12466 struct mbuf *control, 12467 int flags, 12468 struct thread *p 12469 ) 12470 { 12471 int error, use_sndinfo = 0; 12472 struct sctp_sndrcvinfo sndrcvninfo; 12473 struct sockaddr *addr_to_use; 12474 #if defined(INET) && defined(INET6) 12475 struct sockaddr_in sin; 12476 #endif 12477 12478 if (control) { 12479 /* process cmsg snd/rcv info (maybe a assoc-id) */ 12480 if (sctp_find_cmsg(SCTP_SNDRCV, (void *)&sndrcvninfo, control, 12481 sizeof(sndrcvninfo))) { 12482 /* got one */ 12483 use_sndinfo = 1; 12484 } 12485 } 12486 addr_to_use = addr; 12487 #if defined(INET) && defined(INET6) 12488 if ((addr) && (addr->sa_family == AF_INET6)) { 12489 struct sockaddr_in6 *sin6; 12490 12491 sin6 = (struct sockaddr_in6 *)addr; 12492 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { 12493 in6_sin6_2_sin(&sin, sin6); 12494 addr_to_use = (struct sockaddr *)&sin; 12495 } 12496 } 12497 #endif 12498 error = sctp_lower_sosend(so, addr_to_use, uio, top, 12499 control, 12500 flags, 12501 use_sndinfo ? &sndrcvninfo : NULL 12502 ,p 12503 ); 12504 return (error); 12505 } 12506 12507 12508 int 12509 sctp_lower_sosend(struct socket *so, 12510 struct sockaddr *addr, 12511 struct uio *uio, 12512 struct mbuf *i_pak, 12513 struct mbuf *control, 12514 int flags, 12515 struct sctp_sndrcvinfo *srcv 12516 , 12517 struct thread *p 12518 ) 12519 { 12520 unsigned int sndlen = 0, max_len; 12521 int error, len; 12522 struct mbuf *top = NULL; 12523 int queue_only = 0, queue_only_for_init = 0; 12524 int free_cnt_applied = 0; 12525 int un_sent; 12526 int now_filled = 0; 12527 unsigned int inqueue_bytes = 0; 12528 struct sctp_block_entry be; 12529 struct sctp_inpcb *inp; 12530 struct sctp_tcb *stcb = NULL; 12531 struct timeval now; 12532 struct sctp_nets *net; 12533 struct sctp_association *asoc; 12534 struct sctp_inpcb *t_inp; 12535 int user_marks_eor; 12536 int create_lock_applied = 0; 12537 int nagle_applies = 0; 12538 int some_on_control = 0; 12539 int got_all_of_the_send = 0; 12540 int hold_tcblock = 0; 12541 int non_blocking = 0; 12542 uint32_t local_add_more, local_soresv = 0; 12543 uint16_t port; 12544 uint16_t sinfo_flags; 12545 sctp_assoc_t sinfo_assoc_id; 12546 12547 error = 0; 12548 net = NULL; 12549 stcb = NULL; 12550 asoc = NULL; 12551 12552 t_inp = inp = (struct sctp_inpcb *)so->so_pcb; 12553 if (inp == NULL) { 12554 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12555 error = EINVAL; 12556 if (i_pak) { 12557 SCTP_RELEASE_PKT(i_pak); 12558 } 12559 return (error); 12560 } 12561 if ((uio == NULL) && (i_pak == NULL)) { 12562 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12563 return (EINVAL); 12564 } 12565 user_marks_eor = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXPLICIT_EOR); 12566 atomic_add_int(&inp->total_sends, 1); 12567 if (uio) { 12568 if (uio->uio_resid < 0) { 12569 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12570 return (EINVAL); 12571 } 12572 sndlen = (unsigned int)uio->uio_resid; 12573 } else { 12574 top = SCTP_HEADER_TO_CHAIN(i_pak); 12575 sndlen = SCTP_HEADER_LEN(i_pak); 12576 } 12577 SCTPDBG(SCTP_DEBUG_OUTPUT1, "Send called addr:%p send length %d\n", 12578 (void *)addr, 12579 sndlen); 12580 if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && 12581 SCTP_IS_LISTENING(inp)) { 12582 /* The listener can NOT send */ 12583 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, ENOTCONN); 12584 error = ENOTCONN; 12585 goto out_unlocked; 12586 } 12587 /** 12588 * Pre-screen address, if one is given the sin-len 12589 * must be set correctly! 12590 */ 12591 if (addr) { 12592 union sctp_sockstore *raddr = (union sctp_sockstore *)addr; 12593 12594 switch (raddr->sa.sa_family) { 12595 #ifdef INET 12596 case AF_INET: 12597 if (raddr->sin.sin_len != sizeof(struct sockaddr_in)) { 12598 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12599 error = EINVAL; 12600 goto out_unlocked; 12601 } 12602 port = raddr->sin.sin_port; 12603 break; 12604 #endif 12605 #ifdef INET6 12606 case AF_INET6: 12607 if (raddr->sin6.sin6_len != sizeof(struct sockaddr_in6)) { 12608 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12609 error = EINVAL; 12610 goto out_unlocked; 12611 } 12612 port = raddr->sin6.sin6_port; 12613 break; 12614 #endif 12615 default: 12616 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EAFNOSUPPORT); 12617 error = EAFNOSUPPORT; 12618 goto out_unlocked; 12619 } 12620 } else 12621 port = 0; 12622 12623 if (srcv) { 12624 sinfo_flags = srcv->sinfo_flags; 12625 sinfo_assoc_id = srcv->sinfo_assoc_id; 12626 if (INVALID_SINFO_FLAG(sinfo_flags) || 12627 PR_SCTP_INVALID_POLICY(sinfo_flags)) { 12628 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12629 error = EINVAL; 12630 goto out_unlocked; 12631 } 12632 if (srcv->sinfo_flags) 12633 SCTP_STAT_INCR(sctps_sends_with_flags); 12634 } else { 12635 sinfo_flags = inp->def_send.sinfo_flags; 12636 sinfo_assoc_id = inp->def_send.sinfo_assoc_id; 12637 } 12638 if (sinfo_flags & SCTP_SENDALL) { 12639 /* its a sendall */ 12640 error = sctp_sendall(inp, uio, top, srcv); 12641 top = NULL; 12642 goto out_unlocked; 12643 } 12644 if ((sinfo_flags & SCTP_ADDR_OVER) && (addr == NULL)) { 12645 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12646 error = EINVAL; 12647 goto out_unlocked; 12648 } 12649 /* now we must find the assoc */ 12650 if ((inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED) || 12651 (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { 12652 SCTP_INP_RLOCK(inp); 12653 stcb = LIST_FIRST(&inp->sctp_asoc_list); 12654 if (stcb) { 12655 SCTP_TCB_LOCK(stcb); 12656 hold_tcblock = 1; 12657 } 12658 SCTP_INP_RUNLOCK(inp); 12659 } else if (sinfo_assoc_id) { 12660 stcb = sctp_findassociation_ep_asocid(inp, sinfo_assoc_id, 1); 12661 if (stcb != NULL) { 12662 hold_tcblock = 1; 12663 } 12664 } else if (addr) { 12665 /*- 12666 * Since we did not use findep we must 12667 * increment it, and if we don't find a tcb 12668 * decrement it. 12669 */ 12670 SCTP_INP_WLOCK(inp); 12671 SCTP_INP_INCR_REF(inp); 12672 SCTP_INP_WUNLOCK(inp); 12673 stcb = sctp_findassociation_ep_addr(&t_inp, addr, &net, NULL, NULL); 12674 if (stcb == NULL) { 12675 SCTP_INP_WLOCK(inp); 12676 SCTP_INP_DECR_REF(inp); 12677 SCTP_INP_WUNLOCK(inp); 12678 } else { 12679 hold_tcblock = 1; 12680 } 12681 } 12682 if ((stcb == NULL) && (addr)) { 12683 /* Possible implicit send? */ 12684 SCTP_ASOC_CREATE_LOCK(inp); 12685 create_lock_applied = 1; 12686 if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 12687 (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { 12688 /* Should I really unlock ? */ 12689 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12690 error = EINVAL; 12691 goto out_unlocked; 12692 12693 } 12694 if (((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) && 12695 (addr->sa_family == AF_INET6)) { 12696 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12697 error = EINVAL; 12698 goto out_unlocked; 12699 } 12700 SCTP_INP_WLOCK(inp); 12701 SCTP_INP_INCR_REF(inp); 12702 SCTP_INP_WUNLOCK(inp); 12703 /* With the lock applied look again */ 12704 stcb = sctp_findassociation_ep_addr(&t_inp, addr, &net, NULL, NULL); 12705 if ((stcb == NULL) && (control != NULL) && (port > 0)) { 12706 stcb = sctp_findassociation_cmsgs(&t_inp, port, control, &net, &error); 12707 } 12708 if (stcb == NULL) { 12709 SCTP_INP_WLOCK(inp); 12710 SCTP_INP_DECR_REF(inp); 12711 SCTP_INP_WUNLOCK(inp); 12712 } else { 12713 hold_tcblock = 1; 12714 } 12715 if (error) { 12716 goto out_unlocked; 12717 } 12718 if (t_inp != inp) { 12719 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOTCONN); 12720 error = ENOTCONN; 12721 goto out_unlocked; 12722 } 12723 } 12724 if (stcb == NULL) { 12725 if (addr == NULL) { 12726 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOENT); 12727 error = ENOENT; 12728 goto out_unlocked; 12729 } else { 12730 /* We must go ahead and start the INIT process */ 12731 uint32_t vrf_id; 12732 12733 if ((sinfo_flags & SCTP_ABORT) || 12734 ((sinfo_flags & SCTP_EOF) && (sndlen == 0))) { 12735 /*- 12736 * User asks to abort a non-existant assoc, 12737 * or EOF a non-existant assoc with no data 12738 */ 12739 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOENT); 12740 error = ENOENT; 12741 goto out_unlocked; 12742 } 12743 /* get an asoc/stcb struct */ 12744 vrf_id = inp->def_vrf_id; 12745 #ifdef INVARIANTS 12746 if (create_lock_applied == 0) { 12747 panic("Error, should hold create lock and I don't?"); 12748 } 12749 #endif 12750 stcb = sctp_aloc_assoc(inp, addr, &error, 0, vrf_id, 12751 inp->sctp_ep.pre_open_stream_count, 12752 inp->sctp_ep.port, 12753 p); 12754 if (stcb == NULL) { 12755 /* Error is setup for us in the call */ 12756 goto out_unlocked; 12757 } 12758 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { 12759 stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; 12760 /* 12761 * Set the connected flag so we can queue 12762 * data 12763 */ 12764 soisconnecting(so); 12765 } 12766 hold_tcblock = 1; 12767 if (create_lock_applied) { 12768 SCTP_ASOC_CREATE_UNLOCK(inp); 12769 create_lock_applied = 0; 12770 } else { 12771 SCTP_PRINTF("Huh-3? create lock should have been on??\n"); 12772 } 12773 /* 12774 * Turn on queue only flag to prevent data from 12775 * being sent 12776 */ 12777 queue_only = 1; 12778 asoc = &stcb->asoc; 12779 SCTP_SET_STATE(asoc, SCTP_STATE_COOKIE_WAIT); 12780 (void)SCTP_GETTIME_TIMEVAL(&asoc->time_entered); 12781 12782 /* initialize authentication params for the assoc */ 12783 sctp_initialize_auth_params(inp, stcb); 12784 12785 if (control) { 12786 if (sctp_process_cmsgs_for_init(stcb, control, &error)) { 12787 sctp_free_assoc(inp, stcb, SCTP_PCBFREE_FORCE, 12788 SCTP_FROM_SCTP_OUTPUT + SCTP_LOC_5); 12789 hold_tcblock = 0; 12790 stcb = NULL; 12791 goto out_unlocked; 12792 } 12793 } 12794 /* out with the INIT */ 12795 queue_only_for_init = 1; 12796 /*- 12797 * we may want to dig in after this call and adjust the MTU 12798 * value. It defaulted to 1500 (constant) but the ro 12799 * structure may now have an update and thus we may need to 12800 * change it BEFORE we append the message. 12801 */ 12802 } 12803 } else 12804 asoc = &stcb->asoc; 12805 if (srcv == NULL) 12806 srcv = (struct sctp_sndrcvinfo *)&asoc->def_send; 12807 if (srcv->sinfo_flags & SCTP_ADDR_OVER) { 12808 if (addr) 12809 net = sctp_findnet(stcb, addr); 12810 else 12811 net = NULL; 12812 if ((net == NULL) || 12813 ((port != 0) && (port != stcb->rport))) { 12814 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12815 error = EINVAL; 12816 goto out_unlocked; 12817 } 12818 } else { 12819 if (stcb->asoc.alternate) { 12820 net = stcb->asoc.alternate; 12821 } else { 12822 net = stcb->asoc.primary_destination; 12823 } 12824 } 12825 atomic_add_int(&stcb->total_sends, 1); 12826 /* Keep the stcb from being freed under our feet */ 12827 atomic_add_int(&asoc->refcnt, 1); 12828 free_cnt_applied = 1; 12829 12830 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NO_FRAGMENT)) { 12831 if (sndlen > asoc->smallest_mtu) { 12832 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EMSGSIZE); 12833 error = EMSGSIZE; 12834 goto out_unlocked; 12835 } 12836 } 12837 if (SCTP_SO_IS_NBIO(so) 12838 || (flags & MSG_NBIO) 12839 ) { 12840 non_blocking = 1; 12841 } 12842 /* would we block? */ 12843 if (non_blocking) { 12844 uint32_t amount; 12845 12846 if (hold_tcblock == 0) { 12847 SCTP_TCB_LOCK(stcb); 12848 hold_tcblock = 1; 12849 } 12850 inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); 12851 if (user_marks_eor == 0) { 12852 amount = sndlen; 12853 } else { 12854 amount = 1; 12855 } 12856 if ((SCTP_SB_LIMIT_SND(so) < (amount + inqueue_bytes + stcb->asoc.sb_send_resv)) || 12857 (stcb->asoc.chunks_on_out_queue >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue))) { 12858 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EWOULDBLOCK); 12859 if (sndlen > SCTP_SB_LIMIT_SND(so)) 12860 error = EMSGSIZE; 12861 else 12862 error = EWOULDBLOCK; 12863 goto out_unlocked; 12864 } 12865 stcb->asoc.sb_send_resv += sndlen; 12866 SCTP_TCB_UNLOCK(stcb); 12867 hold_tcblock = 0; 12868 } else { 12869 atomic_add_int(&stcb->asoc.sb_send_resv, sndlen); 12870 } 12871 local_soresv = sndlen; 12872 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 12873 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ECONNRESET); 12874 error = ECONNRESET; 12875 goto out_unlocked; 12876 } 12877 if (create_lock_applied) { 12878 SCTP_ASOC_CREATE_UNLOCK(inp); 12879 create_lock_applied = 0; 12880 } 12881 /* Is the stream no. valid? */ 12882 if (srcv->sinfo_stream >= asoc->streamoutcnt) { 12883 /* Invalid stream number */ 12884 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12885 error = EINVAL; 12886 goto out_unlocked; 12887 } 12888 if ((asoc->strmout[srcv->sinfo_stream].state != SCTP_STREAM_OPEN) && 12889 (asoc->strmout[srcv->sinfo_stream].state != SCTP_STREAM_OPENING)) { 12890 /* 12891 * Can't queue any data while stream reset is underway. 12892 */ 12893 if (asoc->strmout[srcv->sinfo_stream].state > SCTP_STREAM_OPEN) { 12894 error = EAGAIN; 12895 } else { 12896 error = EINVAL; 12897 } 12898 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, error); 12899 goto out_unlocked; 12900 } 12901 if ((SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_WAIT) || 12902 (SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_ECHOED)) { 12903 queue_only = 1; 12904 } 12905 /* we are now done with all control */ 12906 if (control) { 12907 sctp_m_freem(control); 12908 control = NULL; 12909 } 12910 if ((SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_SENT) || 12911 (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED) || 12912 (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_ACK_SENT) || 12913 (asoc->state & SCTP_STATE_SHUTDOWN_PENDING)) { 12914 if (srcv->sinfo_flags & SCTP_ABORT) { 12915 ; 12916 } else { 12917 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ECONNRESET); 12918 error = ECONNRESET; 12919 goto out_unlocked; 12920 } 12921 } 12922 /* Ok, we will attempt a msgsnd :> */ 12923 if (p) { 12924 p->td_ru.ru_msgsnd++; 12925 } 12926 /* Are we aborting? */ 12927 if (srcv->sinfo_flags & SCTP_ABORT) { 12928 struct mbuf *mm; 12929 int tot_demand, tot_out = 0, max_out; 12930 12931 SCTP_STAT_INCR(sctps_sends_with_abort); 12932 if ((SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_WAIT) || 12933 (SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_ECHOED)) { 12934 /* It has to be up before we abort */ 12935 /* how big is the user initiated abort? */ 12936 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 12937 error = EINVAL; 12938 goto out; 12939 } 12940 if (hold_tcblock) { 12941 SCTP_TCB_UNLOCK(stcb); 12942 hold_tcblock = 0; 12943 } 12944 if (top) { 12945 struct mbuf *cntm = NULL; 12946 12947 mm = sctp_get_mbuf_for_msg(sizeof(struct sctp_paramhdr), 0, M_WAITOK, 1, MT_DATA); 12948 if (sndlen != 0) { 12949 for (cntm = top; cntm; cntm = SCTP_BUF_NEXT(cntm)) { 12950 tot_out += SCTP_BUF_LEN(cntm); 12951 } 12952 } 12953 } else { 12954 /* Must fit in a MTU */ 12955 tot_out = sndlen; 12956 tot_demand = (tot_out + sizeof(struct sctp_paramhdr)); 12957 if (tot_demand > SCTP_DEFAULT_ADD_MORE) { 12958 /* To big */ 12959 SCTP_LTRACE_ERR_RET(NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, EMSGSIZE); 12960 error = EMSGSIZE; 12961 goto out; 12962 } 12963 mm = sctp_get_mbuf_for_msg(tot_demand, 0, M_WAITOK, 1, MT_DATA); 12964 } 12965 if (mm == NULL) { 12966 SCTP_LTRACE_ERR_RET(NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOMEM); 12967 error = ENOMEM; 12968 goto out; 12969 } 12970 max_out = asoc->smallest_mtu - sizeof(struct sctp_paramhdr); 12971 max_out -= sizeof(struct sctp_abort_msg); 12972 if (tot_out > max_out) { 12973 tot_out = max_out; 12974 } 12975 if (mm) { 12976 struct sctp_paramhdr *ph; 12977 12978 /* now move forward the data pointer */ 12979 ph = mtod(mm, struct sctp_paramhdr *); 12980 ph->param_type = htons(SCTP_CAUSE_USER_INITIATED_ABT); 12981 ph->param_length = htons((uint16_t)(sizeof(struct sctp_paramhdr) + tot_out)); 12982 ph++; 12983 SCTP_BUF_LEN(mm) = tot_out + sizeof(struct sctp_paramhdr); 12984 if (top == NULL) { 12985 error = uiomove((caddr_t)ph, (int)tot_out, uio); 12986 if (error) { 12987 /*- 12988 * Here if we can't get his data we 12989 * still abort we just don't get to 12990 * send the users note :-0 12991 */ 12992 sctp_m_freem(mm); 12993 mm = NULL; 12994 } 12995 } else { 12996 if (sndlen != 0) { 12997 SCTP_BUF_NEXT(mm) = top; 12998 } 12999 } 13000 } 13001 if (hold_tcblock == 0) { 13002 SCTP_TCB_LOCK(stcb); 13003 } 13004 atomic_add_int(&stcb->asoc.refcnt, -1); 13005 free_cnt_applied = 0; 13006 /* release this lock, otherwise we hang on ourselves */ 13007 sctp_abort_an_association(stcb->sctp_ep, stcb, mm, SCTP_SO_LOCKED); 13008 /* now relock the stcb so everything is sane */ 13009 hold_tcblock = 0; 13010 stcb = NULL; 13011 /* 13012 * In this case top is already chained to mm avoid double 13013 * free, since we free it below if top != NULL and driver 13014 * would free it after sending the packet out 13015 */ 13016 if (sndlen != 0) { 13017 top = NULL; 13018 } 13019 goto out_unlocked; 13020 } 13021 /* Calculate the maximum we can send */ 13022 inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); 13023 if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes) { 13024 if (non_blocking) { 13025 /* we already checked for non-blocking above. */ 13026 max_len = sndlen; 13027 } else { 13028 max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes; 13029 } 13030 } else { 13031 max_len = 0; 13032 } 13033 if (hold_tcblock) { 13034 SCTP_TCB_UNLOCK(stcb); 13035 hold_tcblock = 0; 13036 } 13037 if (asoc->strmout == NULL) { 13038 /* huh? software error */ 13039 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EFAULT); 13040 error = EFAULT; 13041 goto out_unlocked; 13042 } 13043 /* Unless E_EOR mode is on, we must make a send FIT in one call. */ 13044 if ((user_marks_eor == 0) && 13045 (sndlen > SCTP_SB_LIMIT_SND(stcb->sctp_socket))) { 13046 /* It will NEVER fit */ 13047 SCTP_LTRACE_ERR_RET(NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, EMSGSIZE); 13048 error = EMSGSIZE; 13049 goto out_unlocked; 13050 } 13051 if ((uio == NULL) && user_marks_eor) { 13052 /*- 13053 * We do not support eeor mode for 13054 * sending with mbuf chains (like sendfile). 13055 */ 13056 SCTP_LTRACE_ERR_RET(NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 13057 error = EINVAL; 13058 goto out_unlocked; 13059 } 13060 if (user_marks_eor) { 13061 local_add_more = min(SCTP_SB_LIMIT_SND(so), SCTP_BASE_SYSCTL(sctp_add_more_threshold)); 13062 } else { 13063 /*- 13064 * For non-eeor the whole message must fit in 13065 * the socket send buffer. 13066 */ 13067 local_add_more = sndlen; 13068 } 13069 len = 0; 13070 if (non_blocking) { 13071 goto skip_preblock; 13072 } 13073 if (((max_len <= local_add_more) && 13074 (SCTP_SB_LIMIT_SND(so) >= local_add_more)) || 13075 (max_len == 0) || 13076 ((stcb->asoc.chunks_on_out_queue + stcb->asoc.stream_queue_cnt) >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue))) { 13077 /* No room right now ! */ 13078 SOCKBUF_LOCK(&so->so_snd); 13079 inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); 13080 while ((SCTP_SB_LIMIT_SND(so) < (inqueue_bytes + local_add_more)) || 13081 ((stcb->asoc.stream_queue_cnt + stcb->asoc.chunks_on_out_queue) >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue))) { 13082 SCTPDBG(SCTP_DEBUG_OUTPUT1, "pre_block limit:%u <(inq:%d + %d) || (%d+%d > %d)\n", 13083 (unsigned int)SCTP_SB_LIMIT_SND(so), 13084 inqueue_bytes, 13085 local_add_more, 13086 stcb->asoc.stream_queue_cnt, 13087 stcb->asoc.chunks_on_out_queue, 13088 SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue)); 13089 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { 13090 sctp_log_block(SCTP_BLOCK_LOG_INTO_BLKA, asoc, sndlen); 13091 } 13092 be.error = 0; 13093 stcb->block_entry = &be; 13094 error = sbwait(&so->so_snd); 13095 stcb->block_entry = NULL; 13096 if (error || so->so_error || be.error) { 13097 if (error == 0) { 13098 if (so->so_error) 13099 error = so->so_error; 13100 if (be.error) { 13101 error = be.error; 13102 } 13103 } 13104 SOCKBUF_UNLOCK(&so->so_snd); 13105 goto out_unlocked; 13106 } 13107 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { 13108 sctp_log_block(SCTP_BLOCK_LOG_OUTOF_BLK, 13109 asoc, stcb->asoc.total_output_queue_size); 13110 } 13111 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 13112 SOCKBUF_UNLOCK(&so->so_snd); 13113 goto out_unlocked; 13114 } 13115 inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); 13116 } 13117 if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes) { 13118 max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes; 13119 } else { 13120 max_len = 0; 13121 } 13122 SOCKBUF_UNLOCK(&so->so_snd); 13123 } 13124 skip_preblock: 13125 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 13126 goto out_unlocked; 13127 } 13128 /* 13129 * sndlen covers for mbuf case uio_resid covers for the non-mbuf 13130 * case NOTE: uio will be null when top/mbuf is passed 13131 */ 13132 if (sndlen == 0) { 13133 if (srcv->sinfo_flags & SCTP_EOF) { 13134 got_all_of_the_send = 1; 13135 goto dataless_eof; 13136 } else { 13137 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 13138 error = EINVAL; 13139 goto out; 13140 } 13141 } 13142 if (top == NULL) { 13143 struct sctp_stream_queue_pending *sp; 13144 struct sctp_stream_out *strm; 13145 uint32_t sndout; 13146 13147 SCTP_TCB_SEND_LOCK(stcb); 13148 if ((asoc->stream_locked) && 13149 (asoc->stream_locked_on != srcv->sinfo_stream)) { 13150 SCTP_TCB_SEND_UNLOCK(stcb); 13151 SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); 13152 error = EINVAL; 13153 goto out; 13154 } 13155 SCTP_TCB_SEND_UNLOCK(stcb); 13156 13157 strm = &stcb->asoc.strmout[srcv->sinfo_stream]; 13158 if (strm->last_msg_incomplete == 0) { 13159 do_a_copy_in: 13160 sp = sctp_copy_it_in(stcb, asoc, srcv, uio, net, max_len, user_marks_eor, &error); 13161 if (error) { 13162 goto out; 13163 } 13164 SCTP_TCB_SEND_LOCK(stcb); 13165 if (sp->msg_is_complete) { 13166 strm->last_msg_incomplete = 0; 13167 asoc->stream_locked = 0; 13168 } else { 13169 /* 13170 * Just got locked to this guy in case of an 13171 * interrupt. 13172 */ 13173 strm->last_msg_incomplete = 1; 13174 if (stcb->asoc.idata_supported == 0) { 13175 asoc->stream_locked = 1; 13176 asoc->stream_locked_on = srcv->sinfo_stream; 13177 } 13178 sp->sender_all_done = 0; 13179 } 13180 sctp_snd_sb_alloc(stcb, sp->length); 13181 atomic_add_int(&asoc->stream_queue_cnt, 1); 13182 if (srcv->sinfo_flags & SCTP_UNORDERED) { 13183 SCTP_STAT_INCR(sctps_sends_with_unord); 13184 } 13185 TAILQ_INSERT_TAIL(&strm->outqueue, sp, next); 13186 stcb->asoc.ss_functions.sctp_ss_add_to_stream(stcb, asoc, strm, sp, 1); 13187 SCTP_TCB_SEND_UNLOCK(stcb); 13188 } else { 13189 SCTP_TCB_SEND_LOCK(stcb); 13190 sp = TAILQ_LAST(&strm->outqueue, sctp_streamhead); 13191 SCTP_TCB_SEND_UNLOCK(stcb); 13192 if (sp == NULL) { 13193 /* ???? Huh ??? last msg is gone */ 13194 #ifdef INVARIANTS 13195 panic("Warning: Last msg marked incomplete, yet nothing left?"); 13196 #else 13197 SCTP_PRINTF("Warning: Last msg marked incomplete, yet nothing left?\n"); 13198 strm->last_msg_incomplete = 0; 13199 #endif 13200 goto do_a_copy_in; 13201 13202 } 13203 } 13204 while (uio->uio_resid > 0) { 13205 /* How much room do we have? */ 13206 struct mbuf *new_tail, *mm; 13207 13208 inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); 13209 if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes) 13210 max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes; 13211 else 13212 max_len = 0; 13213 13214 if ((max_len > SCTP_BASE_SYSCTL(sctp_add_more_threshold)) || 13215 (max_len && (SCTP_SB_LIMIT_SND(so) < SCTP_BASE_SYSCTL(sctp_add_more_threshold))) || 13216 (uio->uio_resid && (uio->uio_resid <= (int)max_len))) { 13217 sndout = 0; 13218 new_tail = NULL; 13219 if (hold_tcblock) { 13220 SCTP_TCB_UNLOCK(stcb); 13221 hold_tcblock = 0; 13222 } 13223 mm = sctp_copy_resume(uio, max_len, user_marks_eor, &error, &sndout, &new_tail); 13224 if ((mm == NULL) || error) { 13225 if (mm) { 13226 sctp_m_freem(mm); 13227 } 13228 goto out; 13229 } 13230 /* Update the mbuf and count */ 13231 SCTP_TCB_SEND_LOCK(stcb); 13232 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 13233 /* 13234 * we need to get out. Peer probably 13235 * aborted. 13236 */ 13237 sctp_m_freem(mm); 13238 if (stcb->asoc.state & SCTP_PCB_FLAGS_WAS_ABORTED) { 13239 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ECONNRESET); 13240 error = ECONNRESET; 13241 } 13242 SCTP_TCB_SEND_UNLOCK(stcb); 13243 goto out; 13244 } 13245 if (sp->tail_mbuf) { 13246 /* tack it to the end */ 13247 SCTP_BUF_NEXT(sp->tail_mbuf) = mm; 13248 sp->tail_mbuf = new_tail; 13249 } else { 13250 /* A stolen mbuf */ 13251 sp->data = mm; 13252 sp->tail_mbuf = new_tail; 13253 } 13254 sctp_snd_sb_alloc(stcb, sndout); 13255 atomic_add_int(&sp->length, sndout); 13256 len += sndout; 13257 if (srcv->sinfo_flags & SCTP_SACK_IMMEDIATELY) { 13258 sp->sinfo_flags |= SCTP_SACK_IMMEDIATELY; 13259 } 13260 /* Did we reach EOR? */ 13261 if ((uio->uio_resid == 0) && 13262 ((user_marks_eor == 0) || 13263 (srcv->sinfo_flags & SCTP_EOF) || 13264 (user_marks_eor && (srcv->sinfo_flags & SCTP_EOR)))) { 13265 sp->msg_is_complete = 1; 13266 } else { 13267 sp->msg_is_complete = 0; 13268 } 13269 SCTP_TCB_SEND_UNLOCK(stcb); 13270 } 13271 if (uio->uio_resid == 0) { 13272 /* got it all? */ 13273 continue; 13274 } 13275 /* PR-SCTP? */ 13276 if ((asoc->prsctp_supported) && (asoc->sent_queue_cnt_removeable > 0)) { 13277 /* 13278 * This is ugly but we must assure locking 13279 * order 13280 */ 13281 if (hold_tcblock == 0) { 13282 SCTP_TCB_LOCK(stcb); 13283 hold_tcblock = 1; 13284 } 13285 sctp_prune_prsctp(stcb, asoc, srcv, sndlen); 13286 inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); 13287 if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes) 13288 max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes; 13289 else 13290 max_len = 0; 13291 if (max_len > 0) { 13292 continue; 13293 } 13294 SCTP_TCB_UNLOCK(stcb); 13295 hold_tcblock = 0; 13296 } 13297 /* wait for space now */ 13298 if (non_blocking) { 13299 /* Non-blocking io in place out */ 13300 goto skip_out_eof; 13301 } 13302 /* What about the INIT, send it maybe */ 13303 if (queue_only_for_init) { 13304 if (hold_tcblock == 0) { 13305 SCTP_TCB_LOCK(stcb); 13306 hold_tcblock = 1; 13307 } 13308 if (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_OPEN) { 13309 /* a collision took us forward? */ 13310 queue_only = 0; 13311 } else { 13312 sctp_send_initiate(inp, stcb, SCTP_SO_LOCKED); 13313 SCTP_SET_STATE(asoc, SCTP_STATE_COOKIE_WAIT); 13314 queue_only = 1; 13315 } 13316 } 13317 if ((net->flight_size > net->cwnd) && 13318 (asoc->sctp_cmt_on_off == 0)) { 13319 SCTP_STAT_INCR(sctps_send_cwnd_avoid); 13320 queue_only = 1; 13321 } else if (asoc->ifp_had_enobuf) { 13322 SCTP_STAT_INCR(sctps_ifnomemqueued); 13323 if (net->flight_size > (2 * net->mtu)) { 13324 queue_only = 1; 13325 } 13326 asoc->ifp_had_enobuf = 0; 13327 } 13328 un_sent = stcb->asoc.total_output_queue_size - stcb->asoc.total_flight; 13329 if ((sctp_is_feature_off(inp, SCTP_PCB_FLAGS_NODELAY)) && 13330 (stcb->asoc.total_flight > 0) && 13331 (stcb->asoc.stream_queue_cnt < SCTP_MAX_DATA_BUNDLING) && 13332 (un_sent < (int)(stcb->asoc.smallest_mtu - SCTP_MIN_OVERHEAD))) { 13333 13334 /*- 13335 * Ok, Nagle is set on and we have data outstanding. 13336 * Don't send anything and let SACKs drive out the 13337 * data unless we have a "full" segment to send. 13338 */ 13339 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_NAGLE_LOGGING_ENABLE) { 13340 sctp_log_nagle_event(stcb, SCTP_NAGLE_APPLIED); 13341 } 13342 SCTP_STAT_INCR(sctps_naglequeued); 13343 nagle_applies = 1; 13344 } else { 13345 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_NAGLE_LOGGING_ENABLE) { 13346 if (sctp_is_feature_off(inp, SCTP_PCB_FLAGS_NODELAY)) 13347 sctp_log_nagle_event(stcb, SCTP_NAGLE_SKIPPED); 13348 } 13349 SCTP_STAT_INCR(sctps_naglesent); 13350 nagle_applies = 0; 13351 } 13352 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { 13353 13354 sctp_misc_ints(SCTP_CWNDLOG_PRESEND, queue_only_for_init, queue_only, 13355 nagle_applies, un_sent); 13356 sctp_misc_ints(SCTP_CWNDLOG_PRESEND, stcb->asoc.total_output_queue_size, 13357 stcb->asoc.total_flight, 13358 stcb->asoc.chunks_on_out_queue, stcb->asoc.total_flight_count); 13359 } 13360 if (queue_only_for_init) 13361 queue_only_for_init = 0; 13362 if ((queue_only == 0) && (nagle_applies == 0)) { 13363 /*- 13364 * need to start chunk output 13365 * before blocking.. note that if 13366 * a lock is already applied, then 13367 * the input via the net is happening 13368 * and I don't need to start output :-D 13369 */ 13370 if (hold_tcblock == 0) { 13371 if (SCTP_TCB_TRYLOCK(stcb)) { 13372 hold_tcblock = 1; 13373 sctp_chunk_output(inp, 13374 stcb, 13375 SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); 13376 } 13377 } else { 13378 sctp_chunk_output(inp, 13379 stcb, 13380 SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); 13381 } 13382 if (hold_tcblock == 1) { 13383 SCTP_TCB_UNLOCK(stcb); 13384 hold_tcblock = 0; 13385 } 13386 } 13387 SOCKBUF_LOCK(&so->so_snd); 13388 /*- 13389 * This is a bit strange, but I think it will 13390 * work. The total_output_queue_size is locked and 13391 * protected by the TCB_LOCK, which we just released. 13392 * There is a race that can occur between releasing it 13393 * above, and me getting the socket lock, where sacks 13394 * come in but we have not put the SB_WAIT on the 13395 * so_snd buffer to get the wakeup. After the LOCK 13396 * is applied the sack_processing will also need to 13397 * LOCK the so->so_snd to do the actual sowwakeup(). So 13398 * once we have the socket buffer lock if we recheck the 13399 * size we KNOW we will get to sleep safely with the 13400 * wakeup flag in place. 13401 */ 13402 inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); 13403 if (SCTP_SB_LIMIT_SND(so) <= (inqueue_bytes + 13404 min(SCTP_BASE_SYSCTL(sctp_add_more_threshold), SCTP_SB_LIMIT_SND(so)))) { 13405 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { 13406 sctp_log_block(SCTP_BLOCK_LOG_INTO_BLK, 13407 asoc, (size_t)uio->uio_resid); 13408 } 13409 be.error = 0; 13410 stcb->block_entry = &be; 13411 error = sbwait(&so->so_snd); 13412 stcb->block_entry = NULL; 13413 13414 if (error || so->so_error || be.error) { 13415 if (error == 0) { 13416 if (so->so_error) 13417 error = so->so_error; 13418 if (be.error) { 13419 error = be.error; 13420 } 13421 } 13422 SOCKBUF_UNLOCK(&so->so_snd); 13423 goto out_unlocked; 13424 } 13425 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { 13426 sctp_log_block(SCTP_BLOCK_LOG_OUTOF_BLK, 13427 asoc, stcb->asoc.total_output_queue_size); 13428 } 13429 } 13430 SOCKBUF_UNLOCK(&so->so_snd); 13431 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 13432 goto out_unlocked; 13433 } 13434 } 13435 SCTP_TCB_SEND_LOCK(stcb); 13436 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 13437 SCTP_TCB_SEND_UNLOCK(stcb); 13438 goto out_unlocked; 13439 } 13440 if (sp) { 13441 if (sp->msg_is_complete == 0) { 13442 strm->last_msg_incomplete = 1; 13443 if (stcb->asoc.idata_supported == 0) { 13444 asoc->stream_locked = 1; 13445 asoc->stream_locked_on = srcv->sinfo_stream; 13446 } 13447 } else { 13448 sp->sender_all_done = 1; 13449 strm->last_msg_incomplete = 0; 13450 asoc->stream_locked = 0; 13451 } 13452 } else { 13453 SCTP_PRINTF("Huh no sp TSNH?\n"); 13454 strm->last_msg_incomplete = 0; 13455 asoc->stream_locked = 0; 13456 } 13457 SCTP_TCB_SEND_UNLOCK(stcb); 13458 if (uio->uio_resid == 0) { 13459 got_all_of_the_send = 1; 13460 } 13461 } else { 13462 /* We send in a 0, since we do NOT have any locks */ 13463 error = sctp_msg_append(stcb, net, top, srcv, 0); 13464 top = NULL; 13465 if (srcv->sinfo_flags & SCTP_EOF) { 13466 /* 13467 * This should only happen for Panda for the mbuf 13468 * send case, which does NOT yet support EEOR mode. 13469 * Thus, we can just set this flag to do the proper 13470 * EOF handling. 13471 */ 13472 got_all_of_the_send = 1; 13473 } 13474 } 13475 if (error) { 13476 goto out; 13477 } 13478 dataless_eof: 13479 /* EOF thing ? */ 13480 if ((srcv->sinfo_flags & SCTP_EOF) && 13481 (got_all_of_the_send == 1)) { 13482 SCTP_STAT_INCR(sctps_sends_with_eof); 13483 error = 0; 13484 if (hold_tcblock == 0) { 13485 SCTP_TCB_LOCK(stcb); 13486 hold_tcblock = 1; 13487 } 13488 if (TAILQ_EMPTY(&asoc->send_queue) && 13489 TAILQ_EMPTY(&asoc->sent_queue) && 13490 sctp_is_there_unsent_data(stcb, SCTP_SO_LOCKED) == 0) { 13491 if ((*asoc->ss_functions.sctp_ss_is_user_msgs_incomplete) (stcb, asoc)) { 13492 goto abort_anyway; 13493 } 13494 /* there is nothing queued to send, so I'm done... */ 13495 if ((SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) && 13496 (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_RECEIVED) && 13497 (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { 13498 struct sctp_nets *netp; 13499 13500 /* only send SHUTDOWN the first time through */ 13501 if (SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) { 13502 SCTP_STAT_DECR_GAUGE32(sctps_currestab); 13503 } 13504 SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); 13505 SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); 13506 sctp_stop_timers_for_shutdown(stcb); 13507 if (stcb->asoc.alternate) { 13508 netp = stcb->asoc.alternate; 13509 } else { 13510 netp = stcb->asoc.primary_destination; 13511 } 13512 sctp_send_shutdown(stcb, netp); 13513 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb, 13514 netp); 13515 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, 13516 asoc->primary_destination); 13517 } 13518 } else { 13519 /*- 13520 * we still got (or just got) data to send, so set 13521 * SHUTDOWN_PENDING 13522 */ 13523 /*- 13524 * XXX sockets draft says that SCTP_EOF should be 13525 * sent with no data. currently, we will allow user 13526 * data to be sent first and move to 13527 * SHUTDOWN-PENDING 13528 */ 13529 if ((SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) && 13530 (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_RECEIVED) && 13531 (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { 13532 if (hold_tcblock == 0) { 13533 SCTP_TCB_LOCK(stcb); 13534 hold_tcblock = 1; 13535 } 13536 if ((*asoc->ss_functions.sctp_ss_is_user_msgs_incomplete) (stcb, asoc)) { 13537 asoc->state |= SCTP_STATE_PARTIAL_MSG_LEFT; 13538 } 13539 asoc->state |= SCTP_STATE_SHUTDOWN_PENDING; 13540 if (TAILQ_EMPTY(&asoc->send_queue) && 13541 TAILQ_EMPTY(&asoc->sent_queue) && 13542 (asoc->state & SCTP_STATE_PARTIAL_MSG_LEFT)) { 13543 struct mbuf *op_err; 13544 char msg[SCTP_DIAG_INFO_LEN]; 13545 13546 abort_anyway: 13547 if (free_cnt_applied) { 13548 atomic_add_int(&stcb->asoc.refcnt, -1); 13549 free_cnt_applied = 0; 13550 } 13551 snprintf(msg, sizeof(msg), 13552 "%s:%d at %s", __FILE__, __LINE__, __func__); 13553 op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), 13554 msg); 13555 sctp_abort_an_association(stcb->sctp_ep, stcb, 13556 op_err, SCTP_SO_LOCKED); 13557 /* 13558 * now relock the stcb so everything 13559 * is sane 13560 */ 13561 hold_tcblock = 0; 13562 stcb = NULL; 13563 goto out; 13564 } 13565 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, 13566 asoc->primary_destination); 13567 sctp_feature_off(inp, SCTP_PCB_FLAGS_NODELAY); 13568 } 13569 } 13570 } 13571 skip_out_eof: 13572 if (!TAILQ_EMPTY(&stcb->asoc.control_send_queue)) { 13573 some_on_control = 1; 13574 } 13575 if (queue_only_for_init) { 13576 if (hold_tcblock == 0) { 13577 SCTP_TCB_LOCK(stcb); 13578 hold_tcblock = 1; 13579 } 13580 if (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_OPEN) { 13581 /* a collision took us forward? */ 13582 queue_only = 0; 13583 } else { 13584 sctp_send_initiate(inp, stcb, SCTP_SO_LOCKED); 13585 SCTP_SET_STATE(&stcb->asoc, SCTP_STATE_COOKIE_WAIT); 13586 queue_only = 1; 13587 } 13588 } 13589 if ((net->flight_size > net->cwnd) && 13590 (stcb->asoc.sctp_cmt_on_off == 0)) { 13591 SCTP_STAT_INCR(sctps_send_cwnd_avoid); 13592 queue_only = 1; 13593 } else if (asoc->ifp_had_enobuf) { 13594 SCTP_STAT_INCR(sctps_ifnomemqueued); 13595 if (net->flight_size > (2 * net->mtu)) { 13596 queue_only = 1; 13597 } 13598 asoc->ifp_had_enobuf = 0; 13599 } 13600 un_sent = stcb->asoc.total_output_queue_size - stcb->asoc.total_flight; 13601 if ((sctp_is_feature_off(inp, SCTP_PCB_FLAGS_NODELAY)) && 13602 (stcb->asoc.total_flight > 0) && 13603 (stcb->asoc.stream_queue_cnt < SCTP_MAX_DATA_BUNDLING) && 13604 (un_sent < (int)(stcb->asoc.smallest_mtu - SCTP_MIN_OVERHEAD))) { 13605 /*- 13606 * Ok, Nagle is set on and we have data outstanding. 13607 * Don't send anything and let SACKs drive out the 13608 * data unless wen have a "full" segment to send. 13609 */ 13610 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_NAGLE_LOGGING_ENABLE) { 13611 sctp_log_nagle_event(stcb, SCTP_NAGLE_APPLIED); 13612 } 13613 SCTP_STAT_INCR(sctps_naglequeued); 13614 nagle_applies = 1; 13615 } else { 13616 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_NAGLE_LOGGING_ENABLE) { 13617 if (sctp_is_feature_off(inp, SCTP_PCB_FLAGS_NODELAY)) 13618 sctp_log_nagle_event(stcb, SCTP_NAGLE_SKIPPED); 13619 } 13620 SCTP_STAT_INCR(sctps_naglesent); 13621 nagle_applies = 0; 13622 } 13623 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { 13624 sctp_misc_ints(SCTP_CWNDLOG_PRESEND, queue_only_for_init, queue_only, 13625 nagle_applies, un_sent); 13626 sctp_misc_ints(SCTP_CWNDLOG_PRESEND, stcb->asoc.total_output_queue_size, 13627 stcb->asoc.total_flight, 13628 stcb->asoc.chunks_on_out_queue, stcb->asoc.total_flight_count); 13629 } 13630 if ((queue_only == 0) && (nagle_applies == 0) && (stcb->asoc.peers_rwnd && un_sent)) { 13631 /* we can attempt to send too. */ 13632 if (hold_tcblock == 0) { 13633 /* 13634 * If there is activity recv'ing sacks no need to 13635 * send 13636 */ 13637 if (SCTP_TCB_TRYLOCK(stcb)) { 13638 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); 13639 hold_tcblock = 1; 13640 } 13641 } else { 13642 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); 13643 } 13644 } else if ((queue_only == 0) && 13645 (stcb->asoc.peers_rwnd == 0) && 13646 (stcb->asoc.total_flight == 0)) { 13647 /* We get to have a probe outstanding */ 13648 if (hold_tcblock == 0) { 13649 hold_tcblock = 1; 13650 SCTP_TCB_LOCK(stcb); 13651 } 13652 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); 13653 } else if (some_on_control) { 13654 int num_out, reason, frag_point; 13655 13656 /* Here we do control only */ 13657 if (hold_tcblock == 0) { 13658 hold_tcblock = 1; 13659 SCTP_TCB_LOCK(stcb); 13660 } 13661 frag_point = sctp_get_frag_point(stcb, &stcb->asoc); 13662 (void)sctp_med_chunk_output(inp, stcb, &stcb->asoc, &num_out, 13663 &reason, 1, 1, &now, &now_filled, frag_point, SCTP_SO_LOCKED); 13664 } 13665 SCTPDBG(SCTP_DEBUG_OUTPUT1, "USR Send complete qo:%d prw:%d unsent:%d tf:%d cooq:%d toqs:%d err:%d\n", 13666 queue_only, stcb->asoc.peers_rwnd, un_sent, 13667 stcb->asoc.total_flight, stcb->asoc.chunks_on_out_queue, 13668 stcb->asoc.total_output_queue_size, error); 13669 13670 out: 13671 out_unlocked: 13672 13673 if (local_soresv && stcb) { 13674 atomic_subtract_int(&stcb->asoc.sb_send_resv, sndlen); 13675 } 13676 if (create_lock_applied) { 13677 SCTP_ASOC_CREATE_UNLOCK(inp); 13678 } 13679 if ((stcb) && hold_tcblock) { 13680 SCTP_TCB_UNLOCK(stcb); 13681 } 13682 if (stcb && free_cnt_applied) { 13683 atomic_add_int(&stcb->asoc.refcnt, -1); 13684 } 13685 #ifdef INVARIANTS 13686 if (stcb) { 13687 if (mtx_owned(&stcb->tcb_mtx)) { 13688 panic("Leaving with tcb mtx owned?"); 13689 } 13690 if (mtx_owned(&stcb->tcb_send_mtx)) { 13691 panic("Leaving with tcb send mtx owned?"); 13692 } 13693 } 13694 #endif 13695 if (top) { 13696 sctp_m_freem(top); 13697 } 13698 if (control) { 13699 sctp_m_freem(control); 13700 } 13701 return (error); 13702 } 13703 13704 13705 /* 13706 * generate an AUTHentication chunk, if required 13707 */ 13708 struct mbuf * 13709 sctp_add_auth_chunk(struct mbuf *m, struct mbuf **m_end, 13710 struct sctp_auth_chunk **auth_ret, uint32_t *offset, 13711 struct sctp_tcb *stcb, uint8_t chunk) 13712 { 13713 struct mbuf *m_auth; 13714 struct sctp_auth_chunk *auth; 13715 int chunk_len; 13716 struct mbuf *cn; 13717 13718 if ((m_end == NULL) || (auth_ret == NULL) || (offset == NULL) || 13719 (stcb == NULL)) 13720 return (m); 13721 13722 if (stcb->asoc.auth_supported == 0) { 13723 return (m); 13724 } 13725 /* does the requested chunk require auth? */ 13726 if (!sctp_auth_is_required_chunk(chunk, stcb->asoc.peer_auth_chunks)) { 13727 return (m); 13728 } 13729 m_auth = sctp_get_mbuf_for_msg(sizeof(*auth), 0, M_NOWAIT, 1, MT_HEADER); 13730 if (m_auth == NULL) { 13731 /* no mbuf's */ 13732 return (m); 13733 } 13734 /* reserve some space if this will be the first mbuf */ 13735 if (m == NULL) 13736 SCTP_BUF_RESV_UF(m_auth, SCTP_MIN_OVERHEAD); 13737 /* fill in the AUTH chunk details */ 13738 auth = mtod(m_auth, struct sctp_auth_chunk *); 13739 memset(auth, 0, sizeof(*auth)); 13740 auth->ch.chunk_type = SCTP_AUTHENTICATION; 13741 auth->ch.chunk_flags = 0; 13742 chunk_len = sizeof(*auth) + 13743 sctp_get_hmac_digest_len(stcb->asoc.peer_hmac_id); 13744 auth->ch.chunk_length = htons(chunk_len); 13745 auth->hmac_id = htons(stcb->asoc.peer_hmac_id); 13746 /* key id and hmac digest will be computed and filled in upon send */ 13747 13748 /* save the offset where the auth was inserted into the chain */ 13749 *offset = 0; 13750 for (cn = m; cn; cn = SCTP_BUF_NEXT(cn)) { 13751 *offset += SCTP_BUF_LEN(cn); 13752 } 13753 13754 /* update length and return pointer to the auth chunk */ 13755 SCTP_BUF_LEN(m_auth) = chunk_len; 13756 m = sctp_copy_mbufchain(m_auth, m, m_end, 1, chunk_len, 0); 13757 if (auth_ret != NULL) 13758 *auth_ret = auth; 13759 13760 return (m); 13761 } 13762 13763 #ifdef INET6 13764 int 13765 sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t *ro) 13766 { 13767 struct nd_prefix *pfx = NULL; 13768 struct nd_pfxrouter *pfxrtr = NULL; 13769 struct sockaddr_in6 gw6; 13770 13771 if (ro == NULL || ro->ro_rt == NULL || src6->sin6_family != AF_INET6) 13772 return (0); 13773 13774 /* get prefix entry of address */ 13775 ND6_RLOCK(); 13776 LIST_FOREACH(pfx, &MODULE_GLOBAL(nd_prefix), ndpr_entry) { 13777 if (pfx->ndpr_stateflags & NDPRF_DETACHED) 13778 continue; 13779 if (IN6_ARE_MASKED_ADDR_EQUAL(&pfx->ndpr_prefix.sin6_addr, 13780 &src6->sin6_addr, &pfx->ndpr_mask)) 13781 break; 13782 } 13783 /* no prefix entry in the prefix list */ 13784 if (pfx == NULL) { 13785 ND6_RUNLOCK(); 13786 SCTPDBG(SCTP_DEBUG_OUTPUT2, "No prefix entry for "); 13787 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, (struct sockaddr *)src6); 13788 return (0); 13789 } 13790 SCTPDBG(SCTP_DEBUG_OUTPUT2, "v6src_match_nexthop(), Prefix entry is "); 13791 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, (struct sockaddr *)src6); 13792 13793 /* search installed gateway from prefix entry */ 13794 LIST_FOREACH(pfxrtr, &pfx->ndpr_advrtrs, pfr_entry) { 13795 memset(&gw6, 0, sizeof(struct sockaddr_in6)); 13796 gw6.sin6_family = AF_INET6; 13797 gw6.sin6_len = sizeof(struct sockaddr_in6); 13798 memcpy(&gw6.sin6_addr, &pfxrtr->router->rtaddr, 13799 sizeof(struct in6_addr)); 13800 SCTPDBG(SCTP_DEBUG_OUTPUT2, "prefix router is "); 13801 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, (struct sockaddr *)&gw6); 13802 SCTPDBG(SCTP_DEBUG_OUTPUT2, "installed router is "); 13803 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, ro->ro_rt->rt_gateway); 13804 if (sctp_cmpaddr((struct sockaddr *)&gw6, ro->ro_rt->rt_gateway)) { 13805 ND6_RUNLOCK(); 13806 SCTPDBG(SCTP_DEBUG_OUTPUT2, "pfxrouter is installed\n"); 13807 return (1); 13808 } 13809 } 13810 ND6_RUNLOCK(); 13811 SCTPDBG(SCTP_DEBUG_OUTPUT2, "pfxrouter is not installed\n"); 13812 return (0); 13813 } 13814 #endif 13815 13816 int 13817 sctp_v4src_match_nexthop(struct sctp_ifa *sifa, sctp_route_t *ro) 13818 { 13819 #ifdef INET 13820 struct sockaddr_in *sin, *mask; 13821 struct ifaddr *ifa; 13822 struct in_addr srcnetaddr, gwnetaddr; 13823 13824 if (ro == NULL || ro->ro_rt == NULL || 13825 sifa->address.sa.sa_family != AF_INET) { 13826 return (0); 13827 } 13828 ifa = (struct ifaddr *)sifa->ifa; 13829 mask = (struct sockaddr_in *)(ifa->ifa_netmask); 13830 sin = &sifa->address.sin; 13831 srcnetaddr.s_addr = (sin->sin_addr.s_addr & mask->sin_addr.s_addr); 13832 SCTPDBG(SCTP_DEBUG_OUTPUT1, "match_nexthop4: src address is "); 13833 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, &sifa->address.sa); 13834 SCTPDBG(SCTP_DEBUG_OUTPUT1, "network address is %x\n", srcnetaddr.s_addr); 13835 13836 sin = (struct sockaddr_in *)ro->ro_rt->rt_gateway; 13837 gwnetaddr.s_addr = (sin->sin_addr.s_addr & mask->sin_addr.s_addr); 13838 SCTPDBG(SCTP_DEBUG_OUTPUT1, "match_nexthop4: nexthop is "); 13839 SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, ro->ro_rt->rt_gateway); 13840 SCTPDBG(SCTP_DEBUG_OUTPUT1, "network address is %x\n", gwnetaddr.s_addr); 13841 if (srcnetaddr.s_addr == gwnetaddr.s_addr) { 13842 return (1); 13843 } 13844 #endif 13845 return (0); 13846 } 13847