Skip to main content

Stream Control Transmission Protocol
RFC 4960

Document Type RFC - Proposed Standard (September 2007) Errata IPR
Obsoleted by RFC 9260
Obsoletes RFC 2960, RFC 3309
Author Randall R. Stewart
Last updated 2020-01-21
RFC stream Internet Engineering Task Force (IETF)
Formats
Additional resources Mailing list discussion
IESG Responsible AD Lars Eggert
Send notices to (None)
RFC 4960
RFC 4960          Stream Control Transmission Protocol    September 2007

         b >>= 1;
     }
     return (rw);
   }

   unsigned long
   build_crc_table (int index)
   {
     int i;
     unsigned long rb;

     rb = reflect_32 (index);

     for (i = 0; i < 8; i++){
         if (rb & 0x80000000L)
          rb = (rb << 1) ^ CRC32C_POLY;
         else
          rb <<= 1;
     }
     return (reflect_32 (rb));
   }

   main ()
   {
     int i;

     printf ("\nGenerating CRC-32c table file <%s>\n",
     OUTPUT_FILE);
     if ((tf = fopen (OUTPUT_FILE, "w")) == NULL){
         printf ("Unable to open %s\n", OUTPUT_FILE);
         exit (1);
     }
     fprintf (tf, "#ifndef __crc32cr_table_h__\n");
     fprintf (tf, "#define __crc32cr_table_h__\n\n");
     fprintf (tf, "#define CRC32C_POLY 0x%08lX\n",
     CRC32C_POLY);
     fprintf (tf,
     "#define CRC32C(c,d) (c=(c>>8)^crc_c[(c^(d))&0xFF])\n");
     fprintf (tf, "\nunsigned long  crc_c[256] =\n{\n");
     for (i = 0; i < 256; i++){
         fprintf (tf, "0x%08lXL, ", build_crc_table (i));
         if ((i & 3) == 3)
           fprintf (tf, "\n");
     }
     fprintf (tf, "};\n\n#endif\n");

     if (fclose (tf) != 0)
       printf ("Unable to close <%s>." OUTPUT_FILE);

Stewart                     Standards Track                   [Page 146]
RFC 4960          Stream Control Transmission Protocol    September 2007

     else
       printf ("\nThe CRC-32c table has been written to <%s>.\n",
         OUTPUT_FILE);
   }

   /* Example of crc insertion */

   #include "crc32cr.h"

   unsigned long
   generate_crc32c(unsigned char *buffer, unsigned int length)
   {
     unsigned int i;
     unsigned long crc32 = ~0L;
     unsigned long result;
     unsigned char byte0,byte1,byte2,byte3;

     for (i = 0; i < length; i++){
         CRC32C(crc32, buffer[i]);
     }

     result = ~crc32;

     /*  result now holds the negated polynomial remainder;
      *  since the table and algorithm is "reflected" [williams95].
      *  That is, result has the same value as if we mapped the message
      *  to a polynomial, computed the host-bit-order polynomial
      *  remainder, performed final negation, then did an end-for-end
      *  bit-reversal.
      *  Note that a 32-bit bit-reversal is identical to four inplace
      *  8-bit reversals followed by an end-for-end byteswap.
      *  In other words, the bytes of each bit are in the right order,
      *  but the bytes have been byteswapped.  So we now do an explicit
      *  byteswap.  On a little-endian machine, this byteswap and
      *  the final ntohl cancel out and could be elided.
      */

     byte0 = result & 0xff;
     byte1 = (result>>8) & 0xff;
     byte2 = (result>>16) & 0xff;
     byte3 = (result>>24) & 0xff;
     crc32 = ((byte0 << 24) |
              (byte1 << 16) |
              (byte2 << 8)  |
              byte3);
     return ( crc32 );
   }

Stewart                     Standards Track                   [Page 147]
RFC 4960          Stream Control Transmission Protocol    September 2007

   int
   insert_crc32(unsigned char *buffer, unsigned int length)
   {
     SCTP_message *message;
     unsigned long crc32;
     message = (SCTP_message *) buffer;
     message->common_header.checksum = 0L;
     crc32 = generate_crc32c(buffer,length);
     /* and insert it into the message */
     message->common_header.checksum = htonl(crc32);
     return 1;
   }

   int
   validate_crc32(unsigned char *buffer, unsigned int length)
   {
     SCTP_message *message;
     unsigned int i;
     unsigned long original_crc32;
     unsigned long crc32 = ~0L;

     /* save and zero checksum */
     message = (SCTP_message *) buffer;
     original_crc32 = ntohl(message->common_header.checksum);
     message->common_header.checksum = 0L;
     crc32 = generate_crc32c(buffer,length);
     return ((original_crc32 == crc32)? 1 : -1);
   }

Stewart                     Standards Track                   [Page 148]
RFC 4960          Stream Control Transmission Protocol    September 2007

References

Normative References

   [ITU32]      "ITU-T Recommendation V.42, "Error-correcting procedures
                for DCEs using asynchronous-to-synchronous
                conversion".", ITU-T section 8.1.1.6.2.

   [RFC0768]    Postel, J., "User Datagram Protocol", STD 6, RFC 768,
                August 1980.

   [RFC0793]    Postel, J., "Transmission Control Protocol", STD 7, RFC
                793, September 1981.

   [RFC1122]    Braden, R., Ed., "Requirements for Internet Hosts -
                Communication Layers", STD 3, RFC 1122, October 1989.

   [RFC1123]    Braden, R., Ed., "Requirements for Internet Hosts -
                Application and Support", STD 3, RFC 1123, October 1989.

   [RFC1191]    Mogul, J. and S. Deering, "Path MTU discovery", RFC
                1191, November 1990.

   [RFC1981]    McCann, J., Deering, S., and J. Mogul, "Path MTU
                Discovery for IP version 6", RFC 1981, August 1996.

   [RFC1982]    Elz, R. and R. Bush, "Serial Number Arithmetic", RFC
                1982, August 1996.

   [RFC2119]    Bradner, S., "Key words for use in RFCs to Indicate
                Requirement Levels", BCP 14, RFC 2119, March 1997.

   [RFC2434]    Narten, T. and H. Alvestrand, "Guidelines for Writing an
                IANA Considerations Section in RFCs", BCP 26, RFC 2434,
                October 1998.

   [RFC2460]    Deering, S. and R. Hinden, "Internet Protocol, Version 6
                (IPv6) Specification", RFC 2460, December 1998.

   [RFC2581]    Allman, M., Paxson, V., and W. Stevens, "TCP Congestion
                Control", RFC 2581, April 1999.

   [RFC3873]    Pastor, J. and M. Belinchon, "Stream Control
                Transmission Protocol (SCTP) Management Information Base
                (MIB)", RFC 3873, September 2004.

   [RFC4291]    Hinden, R. and S. Deering, "IP Version 6 Addressing
                Architecture", RFC 4291, February 2006.

Stewart                     Standards Track                   [Page 149]
RFC 4960          Stream Control Transmission Protocol    September 2007

   [RFC4301]    Kent, S. and K. Seo, "Security Architecture for the
                Internet Protocol", RFC 4301, December 2005.

   [RFC4303]    Kent, S., "IP Encapsulating Security Payload (ESP)", RFC
                4303, December 2005.

   [RFC4306]    Kaufman, C., Ed., "Internet Key Exchange (IKEv2)
                Protocol", RFC 4306, December 2005.

   [RFC4821]    Mathis, M. and J. Heffner, "Packetization Layer Path MTU
                Discovery", RFC 4821, March 2007.

Informative References

   [FALL96]     Fall, K. and S. Floyd, "Simulation-based Comparisons of
                Tahoe, Reno, and SACK TCP", SIGCOMM'99 V. 26 N. 3 pp 5-
                21, July 1996.

   [SAVAGE99]   Savage, S., Cardwell, N., Wetherall, D., and T.
                Anderson, "TCP Congestion Control with a Misbehaving
                Receiver", ACM Computer Communications Review 29(5),
                October 1999.

   [ALLMAN99]   Allman, M. and V. Paxson, "On Estimating End-to-End
                Network Path Properties", SIGCOMM'99 , 1999.

   [WILLIAMS93] Williams, R., "A PAINLESS GUIDE TO CRC ERROR DETECTION
                ALGORITHMS", Internet publication,
                http://www.geocities.com/SiliconValley/Pines/
                8659/crc.htm, August 1993.

   [RFC0813]    Clark, D., "Window and Acknowledgement Strategy in TCP",
                RFC 813, July 1982.

   [RFC1858]    Ziemba, G., Reed, D., and P. Traina, "Security
                Considerations for IP Fragment Filtering", RFC 1858,
                October 1995.

   [RFC2104]    Krawczyk, H., Bellare, M., and R. Canetti, "HMAC:
                Keyed-Hashing for Message Authentication", RFC 2104,
                February 1997.

   [RFC2196]    Fraser, B., "Site Security Handbook", FYI 8, RFC 2196,
                September 1997.

   [RFC2522]    Karn, P. and W. Simpson, "Photuris: Session-Key
                Management Protocol", RFC 2522, March 1999.

Stewart                     Standards Track                   [Page 150]
RFC 4960          Stream Control Transmission Protocol    September 2007

   [RFC2960]    Stewart, R., Xie, Q., Morneault, K., Sharp, C.,
                Schwarzbauer, H., Taylor, T., Rytina, I., Kalla, M.,
                Zhang, L., and V. Paxson, "Stream Control Transmission
                Protocol", RFC 2960, October 2000.

   [RFC3309]    Stone, J., Stewart, R., and D. Otis, "Stream Control
                Transmission Protocol (SCTP) Checksum Change", RFC 3309,
                September 2002.

   [RFC3168]    Ramakrishnan, K., Floyd, S., and D. Black, "The Addition
                of Explicit Congestion Notification (ECN) to IP", RFC
                3168, September 2001.

   [RFC4086]    Eastlake, D., 3rd, Schiller, J., and S. Crocker,
                "Randomness Requirements for Security", BCP 106, RFC
                4086, June 2005.

   [RFC4460]    Stewart, R., Arias-Rodriguez, I., Poon, K., Caro, A.,
                and M. Tuexen, "Stream Control Transmission Protocol
                (SCTP) Specification Errata and Issues", RFC 4460, April
                2006.

   [RFC4895]    Tuexen, M., Stewart, R., Lei, P., and E. Rescorla,
                "Authenticated Chunks for Stream Control Transmission
                Protocol (SCTP)", RFC 4895, August 2007.

Editor's Address

   Randall R. Stewart
   4875 Forest Drive
   Suite 200
   Columbia, SC  29206
   US

   EMail: rrs@cisco.com

Stewart                     Standards Track                   [Page 151]
RFC 4960          Stream Control Transmission Protocol    September 2007

Full Copyright Statement

   Copyright (C) The IETF Trust (2007).

   This document is subject to the rights, licenses and restrictions
   contained in BCP 78, and except as set forth therein, the authors
   retain all their rights.

   This document and the information contained herein are provided on an
   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
   THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
   OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
   THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Intellectual Property

   The IETF takes no position regarding the validity or scope of any
   Intellectual Property Rights or other rights that might be claimed to
   pertain to the implementation or use of the technology described in
   this document or the extent to which any license under such rights
   might or might not be available; nor does it represent that it has
   made any independent effort to identify any such rights.  Information
   on the procedures with respect to rights in RFC documents can be
   found in BCP 78 and BCP 79.

   Copies of IPR disclosures made to the IETF Secretariat and any
   assurances of licenses to be made available, or the result of an
   attempt made to obtain a general license or permission for the use of
   such proprietary rights by implementers or users of this
   specification can be obtained from the IETF on-line IPR repository at
   http://www.ietf.org/ipr.

   The IETF invites any interested party to bring to its attention any
   copyrights, patents or patent applications, or other proprietary
   rights that may cover technology that may be required to implement
   this standard.  Please address the information to the IETF at
   ietf-ipr@ietf.org.

Stewart                     Standards Track                   [Page 152]