The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netinet/sctp_header.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $KAME: sctp_header.h,v 1.14 2005/03/06 16:04:17 itojun Exp $    */
    2 /*      $NetBSD: sctp_header.h,v 1.3 2021/12/05 04:28:53 msaitoh Exp $ */
    3 
    4 #ifndef __SCTP_HEADER_H__
    5 #define __SCTP_HEADER_H__
    6 
    7 /*
    8  * Copyright (c) 2001, 2002, 2003, 2004 Cisco Systems, Inc.
    9  * All rights reserved.
   10  *
   11  * Redistribution and use in source and binary forms, with or without
   12  * modification, are permitted provided that the following conditions
   13  * are met:
   14  * 1. Redistributions of source code must retain the above copyright
   15  *    notice, this list of conditions and the following disclaimer.
   16  * 2. Redistributions in binary form must reproduce the above copyright
   17  *    notice, this list of conditions and the following disclaimer in the
   18  *    documentation and/or other materials provided with the distribution.
   19  * 3. All advertising materials mentioning features or use of this software
   20  *    must display the following acknowledgement:
   21  *      This product includes software developed by Cisco Systems, Inc.
   22  * 4. Neither the name of the project nor the names of its contributors
   23  *    may be used to endorse or promote products derived from this software
   24  *    without specific prior written permission.
   25  *
   26  * THIS SOFTWARE IS PROVIDED BY CISCO SYSTEMS AND CONTRIBUTORS ``AS IS'' AND
   27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   29  * ARE DISCLAIMED.  IN NO EVENT SHALL CISCO SYSTEMS OR CONTRIBUTORS BE LIABLE
   30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   36  * SUCH DAMAGE.
   37  */
   38 
   39 #include <sys/time.h>
   40 #include <netinet/sctp.h>
   41 #include <netinet/sctp_constants.h>
   42 
   43 /*
   44  * Parameter structures
   45  */
   46 struct sctp_ipv4addr_param {
   47         struct sctp_paramhdr ph;        /* type=SCTP_IPV4_PARAM_TYPE, len=8 */
   48         u_int32_t addr;                 /* IPV4 address */
   49 } __packed;
   50 
   51 struct sctp_ipv6addr_param {
   52         struct sctp_paramhdr ph;        /* type=SCTP_IPV6_PARAM_TYPE, len=20 */
   53         u_int8_t  addr[16];             /* IPV6 address */
   54 } __packed;
   55 
   56 /* Cookie Preservative */
   57 struct sctp_cookie_perserve_param {
   58         struct sctp_paramhdr ph;        /* type=SCTP_COOKIE_PRESERVE, len=8 */
   59         u_int32_t time;                 /* time in ms to extend cookie */
   60 } __packed;
   61 
   62 /* Host Name Address */
   63 struct sctp_host_name_param {
   64         struct sctp_paramhdr ph;        /* type=SCTP_HOSTNAME_ADDRESS */
   65         char name[1];                   /* host name */
   66 } __packed;
   67 
   68 /* supported address type */
   69 struct sctp_supported_addr_param {
   70         struct sctp_paramhdr ph;        /* type=SCTP_SUPPORTED_ADDRTYPE */
   71         u_int16_t addr_type[1];         /* array of supported address types */
   72 } __packed;
   73 
   74 /* ECN parameter */
   75 struct sctp_ecn_supported_param {
   76         struct sctp_paramhdr ph;        /* type=SCTP_ECN_CAPABLE */
   77 } __packed;
   78 
   79 
   80 /* heartbeat info parameter */
   81 struct sctp_heartbeat_info_param {
   82         struct sctp_paramhdr ph;
   83         u_int32_t time_value_1;
   84         u_int32_t time_value_2;
   85         u_int32_t random_value1;
   86         u_int32_t random_value2;
   87         u_int16_t user_req;
   88         u_int8_t addr_family;
   89         u_int8_t addr_len;
   90         char address[SCTP_ADDRMAX];
   91 } __packed;
   92 
   93 
   94 /* draft-ietf-tsvwg-prsctp */
   95 /* PR-SCTP supported parameter */
   96 struct sctp_prsctp_supported_param {
   97         struct sctp_paramhdr ph;
   98 } __packed;
   99 
  100 
  101 /* draft-ietf-tsvwg-addip-sctp */
  102 struct sctp_asconf_paramhdr {           /* an ASCONF "parameter" */
  103         struct sctp_paramhdr ph;        /* a SCTP parameter header */
  104         u_int32_t correlation_id;       /* correlation id for this param */
  105 } __packed;
  106 
  107 struct sctp_asconf_addr_param {         /* an ASCONF address parameter */
  108         struct sctp_asconf_paramhdr aph;        /* asconf "parameter" */
  109         struct sctp_ipv6addr_param  addrp;      /* max storage size */
  110 } __packed;
  111 
  112 struct sctp_asconf_addrv4_param {               /* an ASCONF address (v4) parameter */
  113         struct sctp_asconf_paramhdr aph;        /* asconf "parameter" */
  114         struct sctp_ipv4addr_param  addrp;      /* max storage size */
  115 } __packed;
  116 
  117 
  118 /* ECN Nonce: draft-ladha-sctp-ecn-nonce */
  119 struct sctp_ecn_nonce_supported_param {
  120         struct sctp_paramhdr ph;        /* type = 0x8001  len = 4 */
  121 } __packed;
  122 
  123 struct sctp_supported_chunk_types_param {
  124         struct sctp_paramhdr ph;        /* type = 0x8002  len = x */
  125         u_int8_t chunk_types[0];
  126 } __packed;
  127 
  128 /*
  129  * Structures for DATA chunks
  130  */
  131 struct sctp_data {
  132         u_int32_t tsn;
  133         u_int16_t stream_id;
  134         u_int16_t stream_sequence;
  135         u_int32_t protocol_id;
  136         /* user data follows */
  137 } __packed;
  138 
  139 struct sctp_data_chunk {
  140         struct sctp_chunkhdr ch;
  141         struct sctp_data dp;
  142 } __packed;
  143 
  144 /*
  145  * Structures for the control chunks
  146  */
  147 
  148 /* Initiate (INIT)/Initiate Ack (INIT ACK) */
  149 struct sctp_init {
  150         u_int32_t initiate_tag;         /* initiate tag */
  151         u_int32_t a_rwnd;               /* a_rwnd */
  152         u_int16_t num_outbound_streams; /* OS */
  153         u_int16_t num_inbound_streams;  /* MIS */
  154         u_int32_t initial_tsn;          /* I-TSN */
  155         /* optional param's follow */
  156 } __packed;
  157 
  158 /* state cookie header */
  159 struct sctp_state_cookie {              /* this is our definition... */
  160         u_int8_t  identification[16];   /* id of who we are */
  161         u_int32_t cookie_life;          /* life I will award this cookie */
  162         u_int32_t tie_tag_my_vtag;      /* my tag in old association */
  163         u_int32_t tie_tag_peer_vtag;    /* peers tag in old association */
  164         u_int32_t peers_vtag;           /* peers tag in INIT (for quick ref) */
  165         u_int32_t my_vtag;              /* my tag in INIT-ACK (for quick ref) */
  166         struct timeval time_entered;    /* the time I built cookie */
  167         u_int32_t address[4];           /* 4 ints/128 bits */
  168         u_int32_t addr_type;            /* address type */
  169         u_int32_t laddress[4];          /* my local from address */
  170         u_int32_t laddr_type;           /* my local from address type */
  171         u_int32_t scope_id;             /* v6 scope id for link-locals */
  172         u_int16_t peerport;             /* port address of the peer in the INIT */
  173         u_int16_t myport;               /* my port address used in the INIT */
  174         u_int8_t ipv4_addr_legal;       /* Are V4 addr legal? */
  175         u_int8_t ipv6_addr_legal;       /* Are V6 addr legal? */
  176         u_int8_t local_scope;           /* IPv6 local scope flag */
  177         u_int8_t site_scope;            /* IPv6 site scope flag */
  178         u_int8_t ipv4_scope;            /* IPv4 private addr scope */
  179         u_int8_t loopback_scope;        /* loopback scope information */
  180         u_int16_t reserved;
  181         /*
  182          * at the end is tacked on the INIT chunk and the
  183          * INIT-ACK chunk (minus the cookie).
  184          */
  185 } __packed;
  186 
  187 struct sctp_inv_mandatory_param {
  188         u_int16_t cause;
  189         u_int16_t length;
  190         u_int32_t num_param;
  191         u_int16_t param;
  192         /*
  193          * We include this to 0 it since only a missing cookie
  194          * will cause this error.
  195          */
  196         u_int16_t resv;
  197 } __packed;
  198 
  199 struct sctp_unresolv_addr {
  200         u_int16_t cause;
  201         u_int16_t length;
  202         u_int16_t addr_type;
  203         u_int16_t reserved;     /* Only one invalid addr type */
  204 } __packed;
  205 
  206 /* state cookie parameter */
  207 struct sctp_state_cookie_param {
  208         struct sctp_paramhdr ph;
  209         struct sctp_state_cookie cookie;
  210 } __packed;
  211 
  212 struct sctp_init_chunk {
  213         struct sctp_chunkhdr ch;
  214         struct sctp_init init;
  215 } __packed;
  216 
  217 struct sctp_init_msg {
  218         struct sctphdr sh;
  219         struct sctp_init_chunk msg;
  220 } __packed;
  221 /* ... used for both INIT and INIT ACK */
  222 #define sctp_init_ack           sctp_init
  223 #define sctp_init_ack_chunk     sctp_init_chunk
  224 #define sctp_init_ack_msg       sctp_init_msg
  225 
  226 
  227 /* Selective Ack (SACK) */
  228 struct sctp_gap_ack_block {
  229         u_int16_t start;                /* Gap Ack block start */
  230         u_int16_t end;                  /* Gap Ack block end */
  231 } __packed;
  232 
  233 struct sctp_sack {
  234         u_int32_t cum_tsn_ack;          /* cumulative TSN Ack */
  235         u_int32_t a_rwnd;               /* updated a_rwnd of sender */
  236         u_int16_t num_gap_ack_blks;     /* number of Gap Ack blocks */
  237         u_int16_t num_dup_tsns;         /* number of duplicate TSNs */
  238         /* struct sctp_gap_ack_block's follow */
  239         /* u_int32_t duplicate_tsn's follow */
  240 } __packed;
  241 
  242 struct sctp_sack_chunk {
  243         struct sctp_chunkhdr ch;
  244         struct sctp_sack sack;
  245 } __packed;
  246 
  247 
  248 /* Heartbeat Request (HEARTBEAT) */
  249 struct sctp_heartbeat {
  250         struct sctp_heartbeat_info_param hb_info;
  251 } __packed;
  252 
  253 struct sctp_heartbeat_chunk {
  254         struct sctp_chunkhdr ch;
  255         struct sctp_heartbeat heartbeat;
  256 } __packed;
  257 /* ... used for Heartbeat Ack (HEARTBEAT ACK) */
  258 #define sctp_heartbeat_ack              sctp_heartbeat
  259 #define sctp_heartbeat_ack_chunk        sctp_heartbeat_chunk
  260 
  261 
  262 /* Abort Asssociation (ABORT) */
  263 struct sctp_abort_chunk {
  264         struct sctp_chunkhdr ch;
  265         /* optional error cause may follow */
  266 } __packed;
  267 
  268 struct sctp_abort_msg {
  269         struct sctphdr sh;
  270         struct sctp_abort_chunk msg;
  271 } __packed;
  272 
  273 
  274 /* Shutdown Association (SHUTDOWN) */
  275 struct sctp_shutdown_chunk {
  276         struct sctp_chunkhdr ch;
  277         u_int32_t cumulative_tsn_ack;
  278 } __packed;
  279 
  280 
  281 /* Shutdown Acknowledgment (SHUTDOWN ACK) */
  282 struct sctp_shutdown_ack_chunk {
  283         struct sctp_chunkhdr ch;
  284 } __packed;
  285 
  286 
  287 /* Operation Error (ERROR) */
  288 struct sctp_error_chunk {
  289         struct sctp_chunkhdr ch;
  290         /* optional error causes follow */
  291 } __packed;
  292 
  293 
  294 /* Cookie Echo (COOKIE ECHO) */
  295 struct sctp_cookie_echo_chunk {
  296         struct sctp_chunkhdr ch;
  297         struct sctp_state_cookie cookie;
  298 } __packed;
  299 
  300 /* Cookie Acknowledgment (COOKIE ACK) */
  301 struct sctp_cookie_ack_chunk {
  302         struct sctp_chunkhdr ch;
  303 } __packed;
  304 
  305 /* Explicit Congestion Notification Echo (ECNE) */
  306 struct sctp_ecne_chunk {
  307         struct sctp_chunkhdr ch;
  308         u_int32_t tsn;
  309 } __packed;
  310 
  311 /* Congestion Window Reduced (CWR) */
  312 struct sctp_cwr_chunk {
  313         struct sctp_chunkhdr ch;
  314         u_int32_t tsn;
  315 } __packed;
  316 
  317 /* Shutdown Complete (SHUTDOWN COMPLETE) */
  318 struct sctp_shutdown_complete_chunk {
  319         struct sctp_chunkhdr ch;
  320 } __packed;
  321 
  322 /* Oper error holding a stale cookie */
  323 struct sctp_stale_cookie_msg {
  324         struct sctp_paramhdr ph;        /* really an error cause */
  325         u_int32_t time_usec;
  326 } __packed;
  327 
  328 struct sctp_adaption_layer_indication {
  329         struct sctp_paramhdr ph;
  330         u_int32_t indication;
  331 } __packed;
  332 
  333 struct sctp_cookie_while_shutting_down {
  334         struct sctphdr sh;
  335         struct sctp_chunkhdr ch;
  336         struct sctp_paramhdr ph;        /* really an error cause */
  337 } __packed;
  338 
  339 struct sctp_shutdown_complete_msg {
  340         struct sctphdr sh;
  341         struct sctp_shutdown_complete_chunk shut_cmp;
  342 } __packed;
  343 
  344 /* draft-ietf-tsvwg-addip-sctp */
  345 /* Address/Stream Configuration Change (ASCONF) */
  346 struct sctp_asconf_chunk {
  347         struct sctp_chunkhdr ch;
  348         u_int32_t serial_number;
  349         /* lookup address parameter (mandatory) */
  350         /* asconf parameters follow */
  351 } __packed;
  352 
  353 /* Address/Stream Configuration Acknowledge (ASCONF ACK) */
  354 struct sctp_asconf_ack_chunk {
  355         struct sctp_chunkhdr ch;
  356         u_int32_t serial_number;
  357         /* asconf parameters follow */
  358 } __packed;
  359 
  360 /* draft-ietf-tsvwg-prsctp */
  361 /* Forward Cumulative TSN (FORWARD TSN) */
  362 struct sctp_forward_tsn_chunk {
  363         struct sctp_chunkhdr ch;
  364         u_int32_t new_cumulative_tsn;
  365         /* stream/sequence pairs (sctp_strseq) follow */
  366 } __packed;
  367 
  368 struct sctp_strseq {
  369         u_int16_t stream;
  370         u_int16_t sequence;
  371 } __packed;
  372 
  373 struct sctp_forward_tsn_msg {
  374         struct sctphdr sh;
  375         struct sctp_forward_tsn_chunk msg;
  376 } __packed;
  377 
  378 /* should be a multiple of 4 - 1 aka 3/7/11 etc. */
  379 
  380 #define SCTP_NUM_DB_TO_VERIFY 3
  381 
  382 struct sctp_chunk_desc {
  383         u_int8_t chunk_type;
  384         u_int8_t data_bytes[SCTP_NUM_DB_TO_VERIFY];
  385         u_int32_t tsn_ifany;
  386 } __packed;
  387 
  388 
  389 struct sctp_pktdrop_chunk {
  390         struct sctp_chunkhdr ch;
  391         u_int32_t bottle_bw;
  392         u_int32_t current_onq;
  393         u_int16_t trunc_len;
  394         u_int16_t reserved;
  395         u_int8_t data[0];
  396 } __packed;
  397 
  398 #define SCTP_RESET_YOUR  0x01   /* reset your streams and send response */
  399 #define SCTP_RESET_ALL   0x02   /* reset all of your streams */
  400 #define SCTP_RECIPRICAL  0x04   /* reset my streams too */
  401 
  402 struct sctp_stream_reset_request {
  403         struct sctp_paramhdr ph;
  404         u_int8_t reset_flags;              /* actual request */
  405         u_int8_t reset_pad[3];
  406         u_int32_t reset_req_seq;           /* monotonically increasing seq no */
  407         u_int16_t list_of_streams[0];      /* if not all list of streams */
  408 } __packed;
  409 
  410 #define SCTP_RESET_PERFORMED        0x01   /* Peers sending str was reset */
  411 #define SCTP_RESET_DENIED           0x02   /* Asked for but refused       */
  412 
  413 struct sctp_stream_reset_response {
  414         struct sctp_paramhdr ph;
  415         u_int8_t reset_flags;              /* actual request */
  416         u_int8_t reset_pad[3];
  417         u_int32_t reset_req_seq_resp;   /* copied from reset_req reset_req_seq */
  418         u_int32_t reset_at_tsn;         /* resetters next TSN to be assigned send wise */
  419         u_int32_t cumulative_tsn;       /* resetters cum-ack point receive wise */
  420         u_int16_t list_of_streams[0];   /* if not all list of streams */
  421 } __packed;
  422 
  423 /* convenience structures, note that if you
  424  * are making a request for specific streams
  425  * then the request will need to be an overlay
  426  * structure.
  427  */
  428 
  429 struct sctp_stream_reset_req {
  430         struct sctp_chunkhdr ch;
  431         struct sctp_stream_reset_request sr_req;
  432 } __packed;
  433 
  434 struct sctp_stream_reset_resp {
  435         struct sctp_chunkhdr ch;
  436         struct sctp_stream_reset_response sr_resp;
  437 } __packed;
  438 
  439 
  440 /*
  441  * we pre-reserve enough room for a ECNE or CWR AND a SACK with no
  442  * missing pieces. If ENCE is missing we could have a couple of blocks.
  443  * This way we optimize so we MOST likely can bundle a SACK/ECN with
  444  * the smallest size data chunk I will split into. We could increase
  445  * throughput slightly by taking out these two but the  24-sack/8-CWR
  446  * i.e. 32 bytes I pre-reserve I feel is worth it for now.
  447  */
  448 #ifndef SCTP_MAX_OVERHEAD
  449 #ifdef AF_INET6
  450 #define SCTP_MAX_OVERHEAD (sizeof(struct sctp_data_chunk) + \
  451                            sizeof(struct sctphdr) + \
  452                            sizeof(struct sctp_ecne_chunk) + \
  453                            sizeof(struct sctp_sack_chunk) + \
  454                            sizeof(struct ip6_hdr))
  455 
  456 #define SCTP_MED_OVERHEAD (sizeof(struct sctp_data_chunk) + \
  457                            sizeof(struct sctphdr) + \
  458                            sizeof(struct ip6_hdr))
  459 
  460 
  461 #define SCTP_MIN_OVERHEAD (sizeof(struct ip6_hdr) + \
  462                            sizeof(struct sctphdr))
  463 
  464 #else
  465 #define SCTP_MAX_OVERHEAD (sizeof(struct sctp_data_chunk) + \
  466                            sizeof(struct sctphdr) + \
  467                            sizeof(struct sctp_ecne_chunk) + \
  468                            sizeof(struct sctp_sack_chunk) + \
  469                            sizeof(struct ip))
  470 
  471 #define SCTP_MED_OVERHEAD (sizeof(struct sctp_data_chunk) + \
  472                            sizeof(struct sctphdr) + \
  473                            sizeof(struct ip))
  474 
  475 
  476 #define SCTP_MIN_OVERHEAD (sizeof(struct ip) + \
  477                            sizeof(struct sctphdr))
  478 
  479 #endif /* AF_INET6 */
  480 #endif /* !SCTP_MAX_OVERHEAD */
  481 
  482 #define SCTP_MED_V4_OVERHEAD (sizeof(struct sctp_data_chunk) + \
  483                               sizeof(struct sctphdr) + \
  484                               sizeof(struct ip))
  485 
  486 #define SCTP_MIN_V4_OVERHEAD (sizeof(struct ip) + \
  487                               sizeof(struct sctphdr))
  488 
  489 #endif /* !__SCTP_HEADER_H__ */

Cache object: 2429cdca41ff5a91cf384fbc317eabc8


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.