tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

sctp_header.h (17343B)


      1 /*-
      2 * SPDX-License-Identifier: BSD-3-Clause
      3 *
      4 * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved.
      5 * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved.
      6 * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved.
      7 *
      8 * Redistribution and use in source and binary forms, with or without
      9 * modification, are permitted provided that the following conditions are met:
     10 *
     11 * a) Redistributions of source code must retain the above copyright notice,
     12 *    this list of conditions and the following disclaimer.
     13 *
     14 * b) Redistributions in binary form must reproduce the above copyright
     15 *    notice, this list of conditions and the following disclaimer in
     16 *    the documentation and/or other materials provided with the distribution.
     17 *
     18 * c) Neither the name of Cisco Systems, Inc. nor the names of its
     19 *    contributors may be used to endorse or promote products derived
     20 *    from this software without specific prior written permission.
     21 *
     22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     24 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     32 * THE POSSIBILITY OF SUCH DAMAGE.
     33 */
     34 
     35 #ifndef _NETINET_SCTP_HEADER_H_
     36 #define _NETINET_SCTP_HEADER_H_
     37 
     38 #if defined(_WIN32) && !defined(__Userspace__)
     39 #include <packon.h>
     40 #endif
     41 #if !defined(_WIN32)
     42 #include <sys/time.h>
     43 #endif
     44 #include <netinet/sctp.h>
     45 #include <netinet/sctp_constants.h>
     46 
     47 #if !defined(_WIN32)
     48 #define SCTP_PACKED __attribute__((packed))
     49 #else
     50 #pragma pack (push, 1)
     51 #define SCTP_PACKED
     52 #endif
     53 
     54 /*
     55 * Parameter structures
     56 */
     57 struct sctp_ipv4addr_param {
     58 struct sctp_paramhdr ph;/* type=SCTP_IPV4_PARAM_TYPE, len=8 */
     59 uint32_t addr;		/* IPV4 address */
     60 } SCTP_PACKED;
     61 
     62 #define SCTP_V6_ADDR_BYTES 16
     63 
     64 struct sctp_ipv6addr_param {
     65 struct sctp_paramhdr ph;/* type=SCTP_IPV6_PARAM_TYPE, len=20 */
     66 uint8_t addr[SCTP_V6_ADDR_BYTES];	/* IPV6 address */
     67 } SCTP_PACKED;
     68 
     69 /* Cookie Preservative */
     70 struct sctp_cookie_perserve_param {
     71 struct sctp_paramhdr ph;/* type=SCTP_COOKIE_PRESERVE, len=8 */
     72 uint32_t time;		/* time in ms to extend cookie */
     73 } SCTP_PACKED;
     74 
     75 #define SCTP_ARRAY_MIN_LEN 1
     76 /* Host Name Address */
     77 struct sctp_host_name_param {
     78 struct sctp_paramhdr ph;/* type=SCTP_HOSTNAME_ADDRESS */
     79 char name[SCTP_ARRAY_MIN_LEN];		/* host name */
     80 } SCTP_PACKED;
     81 
     82 /*
     83 * This is the maximum padded size of a s-a-p
     84 * so paramheadr + 3 address types (6 bytes) + 2 byte pad = 12
     85 */
     86 #define SCTP_MAX_ADDR_PARAMS_SIZE 12
     87 /* supported address type */
     88 struct sctp_supported_addr_param {
     89 struct sctp_paramhdr ph;/* type=SCTP_SUPPORTED_ADDRTYPE */
     90 uint16_t addr_type[2];	/* array of supported address types */
     91 } SCTP_PACKED;
     92 
     93 /* heartbeat info parameter */
     94 struct sctp_heartbeat_info_param {
     95 struct sctp_paramhdr ph;
     96 time_t time_value_1;
     97 uint32_t time_value_2;
     98 uint32_t random_value1;
     99 uint32_t random_value2;
    100 uint8_t addr_family;
    101 uint8_t addr_len;
    102 /* make sure that this structure is 4 byte aligned */
    103 uint8_t padding[2];
    104 char address[SCTP_ADDRMAX];
    105 } SCTP_PACKED;
    106 
    107 /* draft-ietf-tsvwg-prsctp */
    108 /* PR-SCTP supported parameter */
    109 struct sctp_prsctp_supported_param {
    110 struct sctp_paramhdr ph;
    111 } SCTP_PACKED;
    112 
    113 /* draft-ietf-tsvwg-addip-sctp */
    114 struct sctp_asconf_paramhdr {	/* an ASCONF "parameter" */
    115 struct sctp_paramhdr ph;/* a SCTP parameter header */
    116 uint32_t correlation_id;/* correlation id for this param */
    117 } SCTP_PACKED;
    118 
    119 struct sctp_asconf_addr_param {	/* an ASCONF address parameter */
    120 struct sctp_asconf_paramhdr aph;	/* asconf "parameter" */
    121 struct sctp_ipv6addr_param addrp;	/* max storage size */
    122 } SCTP_PACKED;
    123 
    124 struct sctp_asconf_tag_param {	/* an ASCONF NAT-Vtag parameter */
    125 struct sctp_asconf_paramhdr aph;	/* asconf "parameter" */
    126 uint32_t local_vtag;
    127 uint32_t remote_vtag;
    128 } SCTP_PACKED;
    129 
    130 struct sctp_asconf_addrv4_param {	/* an ASCONF address (v4) parameter */
    131 struct sctp_asconf_paramhdr aph;	/* asconf "parameter" */
    132 struct sctp_ipv4addr_param addrp;	/* max storage size */
    133 } SCTP_PACKED;
    134 
    135 #define SCTP_MAX_SUPPORTED_EXT 256
    136 
    137 struct sctp_supported_chunk_types_param {
    138 struct sctp_paramhdr ph;/* type = 0x8008  len = x */
    139 uint8_t chunk_types[];
    140 } SCTP_PACKED;
    141 
    142 /*
    143 * Structures for DATA chunks
    144 */
    145 struct sctp_data {
    146 uint32_t tsn;
    147 uint16_t sid;
    148 uint16_t ssn;
    149 uint32_t ppid;
    150 /* user data follows */
    151 } SCTP_PACKED;
    152 
    153 struct sctp_data_chunk {
    154 struct sctp_chunkhdr ch;
    155 struct sctp_data dp;
    156 } SCTP_PACKED;
    157 
    158 struct sctp_idata {
    159 uint32_t tsn;
    160 uint16_t sid;
    161 uint16_t reserved;	/* Where does the SSN go? */
    162 uint32_t mid;
    163 union {
    164 	uint32_t ppid;
    165 	uint32_t fsn;	/* Fragment Sequence Number */
    166 } ppid_fsn;
    167 /* user data follows */
    168 } SCTP_PACKED;
    169 
    170 struct sctp_idata_chunk {
    171 struct sctp_chunkhdr ch;
    172 struct sctp_idata dp;
    173 } SCTP_PACKED;
    174 
    175 /*
    176 * Structures for the control chunks
    177 */
    178 
    179 /* Initiate (INIT)/Initiate Ack (INIT ACK) */
    180 struct sctp_init {
    181 uint32_t initiate_tag;	/* initiate tag */
    182 uint32_t a_rwnd;	/* a_rwnd */
    183 uint16_t num_outbound_streams;	/* OS */
    184 uint16_t num_inbound_streams;	/* MIS */
    185 uint32_t initial_tsn;	/* I-TSN */
    186 /* optional param's follow */
    187 } SCTP_PACKED;
    188 #define SCTP_IDENTIFICATION_SIZE 16
    189 #define SCTP_ADDRESS_SIZE 4
    190 #if defined(__Userspace__)
    191 #define SCTP_RESERVE_SPACE 4
    192 #else
    193 #define SCTP_RESERVE_SPACE 5
    194 #endif
    195 /* state cookie header */
    196 struct sctp_state_cookie {	/* this is our definition... */
    197 uint8_t identification[SCTP_IDENTIFICATION_SIZE];/* id of who we are */
    198 struct timeval time_entered;	/* the time I built cookie */
    199 uint32_t cookie_life;	/* life I will award this cookie */
    200 uint32_t tie_tag_my_vtag;	/* my tag in old association */
    201 
    202 uint32_t tie_tag_peer_vtag;	/* peers tag in old association */
    203 uint32_t peers_vtag;	/* peers tag in INIT (for quick ref) */
    204 
    205 uint32_t my_vtag;	/* my tag in INIT-ACK (for quick ref) */
    206 uint32_t address[SCTP_ADDRESS_SIZE];	/* 4 ints/128 bits */
    207 uint32_t addr_type;	/* address type */
    208 uint32_t laddress[SCTP_ADDRESS_SIZE];	/* my local from address */
    209 uint32_t laddr_type;	/* my local from address type */
    210 uint32_t scope_id;	/* v6 scope id for link-locals */
    211 
    212 uint16_t peerport;	/* port address of the peer in the INIT */
    213 uint16_t myport;	/* my port address used in the INIT */
    214 uint8_t ipv4_addr_legal;/* Are V4 addr legal? */
    215 uint8_t ipv6_addr_legal;/* Are V6 addr legal? */
    216 #if defined(__Userspace__)
    217 uint8_t conn_addr_legal;
    218 #endif
    219 uint8_t local_scope;	/* IPv6 local scope flag */
    220 uint8_t site_scope;	/* IPv6 site scope flag */
    221 
    222 uint8_t ipv4_scope;	/* IPv4 private addr scope */
    223 uint8_t loopback_scope;	/* loopback scope information */
    224 uint8_t rcv_edmid;	/* copy of the inp value */
    225 uint8_t reserved[SCTP_RESERVE_SPACE];    /* Align to 64 bits */
    226 /*
    227  * at the end is tacked on the INIT chunk and the INIT-ACK chunk
    228  * (minus the cookie).
    229  */
    230 } SCTP_PACKED;
    231 
    232 /* state cookie parameter */
    233 struct sctp_state_cookie_param {
    234 struct sctp_paramhdr ph;
    235 struct sctp_state_cookie cookie;
    236 } SCTP_PACKED;
    237 
    238 struct sctp_init_chunk {
    239 struct sctp_chunkhdr ch;
    240 struct sctp_init init;
    241 } SCTP_PACKED;
    242 
    243 struct sctp_init_msg {
    244 struct sctphdr sh;
    245 struct sctp_init_chunk msg;
    246 } SCTP_PACKED;
    247 
    248 /* ... used for both INIT and INIT ACK */
    249 #define sctp_init_ack		sctp_init
    250 #define sctp_init_ack_chunk	sctp_init_chunk
    251 #define sctp_init_ack_msg	sctp_init_msg
    252 
    253 /* Selective Ack (SACK) */
    254 struct sctp_gap_ack_block {
    255 uint16_t start;		/* Gap Ack block start */
    256 uint16_t end;		/* Gap Ack block end */
    257 } SCTP_PACKED;
    258 
    259 struct sctp_sack {
    260 uint32_t cum_tsn_ack;	/* cumulative TSN Ack */
    261 uint32_t a_rwnd;	/* updated a_rwnd of sender */
    262 uint16_t num_gap_ack_blks;	/* number of Gap Ack blocks */
    263 uint16_t num_dup_tsns;	/* number of duplicate TSNs */
    264 /* struct sctp_gap_ack_block's follow */
    265 /* uint32_t duplicate_tsn's follow */
    266 } SCTP_PACKED;
    267 
    268 struct sctp_sack_chunk {
    269 struct sctp_chunkhdr ch;
    270 struct sctp_sack sack;
    271 } SCTP_PACKED;
    272 
    273 struct sctp_nr_sack {
    274 uint32_t cum_tsn_ack;	/* cumulative TSN Ack */
    275 uint32_t a_rwnd;	/* updated a_rwnd of sender */
    276 uint16_t num_gap_ack_blks;	/* number of Gap Ack blocks */
    277 uint16_t num_nr_gap_ack_blks;	/* number of NR Gap Ack blocks */
    278 uint16_t num_dup_tsns;	/* number of duplicate TSNs */
    279 uint16_t reserved;	/* not currently used*/
    280 /* struct sctp_gap_ack_block's follow */
    281 /* uint32_t duplicate_tsn's follow */
    282 } SCTP_PACKED;
    283 
    284 struct sctp_nr_sack_chunk {
    285 struct sctp_chunkhdr ch;
    286 struct sctp_nr_sack nr_sack;
    287 } SCTP_PACKED;
    288 
    289 /* Heartbeat Request (HEARTBEAT) */
    290 struct sctp_heartbeat {
    291 struct sctp_heartbeat_info_param hb_info;
    292 } SCTP_PACKED;
    293 
    294 struct sctp_heartbeat_chunk {
    295 struct sctp_chunkhdr ch;
    296 struct sctp_heartbeat heartbeat;
    297 } SCTP_PACKED;
    298 
    299 /* ... used for Heartbeat Ack (HEARTBEAT ACK) */
    300 #define sctp_heartbeat_ack		sctp_heartbeat
    301 #define sctp_heartbeat_ack_chunk	sctp_heartbeat_chunk
    302 
    303 /* Abort Asssociation (ABORT) */
    304 struct sctp_abort_chunk {
    305 struct sctp_chunkhdr ch;
    306 /* optional error cause may follow */
    307 } SCTP_PACKED;
    308 
    309 struct sctp_abort_msg {
    310 struct sctphdr sh;
    311 struct sctp_abort_chunk msg;
    312 } SCTP_PACKED;
    313 
    314 /* Shutdown Association (SHUTDOWN) */
    315 struct sctp_shutdown_chunk {
    316 struct sctp_chunkhdr ch;
    317 uint32_t cumulative_tsn_ack;
    318 } SCTP_PACKED;
    319 
    320 /* Shutdown Acknowledgment (SHUTDOWN ACK) */
    321 struct sctp_shutdown_ack_chunk {
    322 struct sctp_chunkhdr ch;
    323 } SCTP_PACKED;
    324 
    325 /* Operation Error (ERROR) */
    326 struct sctp_error_chunk {
    327 struct sctp_chunkhdr ch;
    328 /* optional error causes follow */
    329 } SCTP_PACKED;
    330 
    331 /* Cookie Echo (COOKIE ECHO) */
    332 struct sctp_cookie_echo_chunk {
    333 struct sctp_chunkhdr ch;
    334 struct sctp_state_cookie cookie;
    335 } SCTP_PACKED;
    336 
    337 /* Cookie Acknowledgment (COOKIE ACK) */
    338 struct sctp_cookie_ack_chunk {
    339 struct sctp_chunkhdr ch;
    340 } SCTP_PACKED;
    341 
    342 /* Explicit Congestion Notification Echo (ECNE) */
    343 struct old_sctp_ecne_chunk {
    344 struct sctp_chunkhdr ch;
    345 uint32_t tsn;
    346 } SCTP_PACKED;
    347 
    348 struct sctp_ecne_chunk {
    349 struct sctp_chunkhdr ch;
    350 uint32_t tsn;
    351 uint32_t num_pkts_since_cwr;
    352 } SCTP_PACKED;
    353 
    354 /* Congestion Window Reduced (CWR) */
    355 struct sctp_cwr_chunk {
    356 struct sctp_chunkhdr ch;
    357 uint32_t tsn;
    358 } SCTP_PACKED;
    359 
    360 /* Shutdown Complete (SHUTDOWN COMPLETE) */
    361 struct sctp_shutdown_complete_chunk {
    362 struct sctp_chunkhdr ch;
    363 } SCTP_PACKED;
    364 
    365 struct sctp_adaptation_layer_indication {
    366 struct sctp_paramhdr ph;
    367 uint32_t indication;
    368 } SCTP_PACKED;
    369 
    370 /*
    371 * draft-ietf-tsvwg-addip-sctp
    372 */
    373 /* Address/Stream Configuration Change (ASCONF) */
    374 struct sctp_asconf_chunk {
    375 struct sctp_chunkhdr ch;
    376 uint32_t serial_number;
    377 /* lookup address parameter (mandatory) */
    378 /* asconf parameters follow */
    379 } SCTP_PACKED;
    380 
    381 /* Address/Stream Configuration Acknowledge (ASCONF ACK) */
    382 struct sctp_asconf_ack_chunk {
    383 struct sctp_chunkhdr ch;
    384 uint32_t serial_number;
    385 /* asconf parameters follow */
    386 } SCTP_PACKED;
    387 
    388 /* draft-ietf-tsvwg-prsctp */
    389 /* Forward Cumulative TSN (FORWARD TSN) */
    390 struct sctp_forward_tsn_chunk {
    391 struct sctp_chunkhdr ch;
    392 uint32_t new_cumulative_tsn;
    393 /* stream/sequence pairs (sctp_strseq) follow */
    394 } SCTP_PACKED;
    395 
    396 struct sctp_strseq {
    397 uint16_t sid;
    398 uint16_t ssn;
    399 } SCTP_PACKED;
    400 
    401 struct sctp_strseq_mid {
    402 uint16_t sid;
    403 uint16_t flags;
    404 uint32_t mid;
    405 };
    406 
    407 struct sctp_forward_tsn_msg {
    408 struct sctphdr sh;
    409 struct sctp_forward_tsn_chunk msg;
    410 } SCTP_PACKED;
    411 
    412 /* should be a multiple of 4 - 1 aka 3/7/11 etc. */
    413 
    414 #define SCTP_NUM_DB_TO_VERIFY 31
    415 
    416 struct sctp_chunk_desc {
    417 uint8_t chunk_type;
    418 uint8_t data_bytes[SCTP_NUM_DB_TO_VERIFY];
    419 uint32_t tsn_ifany;
    420 } SCTP_PACKED;
    421 
    422 struct sctp_pktdrop_chunk {
    423 struct sctp_chunkhdr ch;
    424 uint32_t bottle_bw;
    425 uint32_t current_onq;
    426 uint16_t trunc_len;
    427 uint16_t reserved;
    428 uint8_t data[];
    429 } SCTP_PACKED;
    430 
    431 /**********STREAM RESET STUFF ******************/
    432 
    433 struct sctp_stream_reset_request {
    434 struct sctp_paramhdr ph;
    435 uint32_t request_seq;
    436 } SCTP_PACKED;
    437 
    438 struct sctp_stream_reset_out_request {
    439 struct sctp_paramhdr ph;
    440 uint32_t request_seq;	/* monotonically increasing seq no */
    441 uint32_t response_seq;	/* if a response, the resp seq no */
    442 uint32_t send_reset_at_tsn;	/* last TSN I assigned outbound */
    443 uint16_t list_of_streams[];	/* if not all list of streams */
    444 } SCTP_PACKED;
    445 
    446 struct sctp_stream_reset_in_request {
    447 struct sctp_paramhdr ph;
    448 uint32_t request_seq;
    449 uint16_t list_of_streams[];	/* if not all list of streams */
    450 } SCTP_PACKED;
    451 
    452 struct sctp_stream_reset_tsn_request {
    453 struct sctp_paramhdr ph;
    454 uint32_t request_seq;
    455 } SCTP_PACKED;
    456 
    457 struct sctp_stream_reset_response {
    458 struct sctp_paramhdr ph;
    459 uint32_t response_seq;	/* if a response, the resp seq no */
    460 uint32_t result;
    461 } SCTP_PACKED;
    462 
    463 struct sctp_stream_reset_response_tsn {
    464 struct sctp_paramhdr ph;
    465 uint32_t response_seq;	/* if a response, the resp seq no */
    466 uint32_t result;
    467 uint32_t senders_next_tsn;
    468 uint32_t receivers_next_tsn;
    469 } SCTP_PACKED;
    470 
    471 struct sctp_stream_reset_add_strm {
    472 struct sctp_paramhdr ph;
    473 uint32_t request_seq;
    474 uint16_t number_of_streams;
    475 uint16_t reserved;
    476 } SCTP_PACKED;
    477 
    478 #define SCTP_STREAM_RESET_RESULT_NOTHING_TO_DO   0x00000000 /* XXX: unused */
    479 #define SCTP_STREAM_RESET_RESULT_PERFORMED       0x00000001
    480 #define SCTP_STREAM_RESET_RESULT_DENIED          0x00000002
    481 #define SCTP_STREAM_RESET_RESULT_ERR__WRONG_SSN  0x00000003 /* XXX: unused */
    482 #define SCTP_STREAM_RESET_RESULT_ERR_IN_PROGRESS 0x00000004
    483 #define SCTP_STREAM_RESET_RESULT_ERR_BAD_SEQNO   0x00000005
    484 #define SCTP_STREAM_RESET_RESULT_IN_PROGRESS     0x00000006 /* XXX: unused */
    485 
    486 /*
    487 * convience structures, note that if you are making a request for specific
    488 * streams then the request will need to be an overlay structure.
    489 */
    490 
    491 struct sctp_stream_reset_tsn_req {
    492 struct sctp_chunkhdr ch;
    493 struct sctp_stream_reset_tsn_request sr_req;
    494 } SCTP_PACKED;
    495 
    496 struct sctp_stream_reset_resp {
    497 struct sctp_chunkhdr ch;
    498 struct sctp_stream_reset_response sr_resp;
    499 } SCTP_PACKED;
    500 
    501 /* respone only valid with a TSN request */
    502 struct sctp_stream_reset_resp_tsn {
    503 struct sctp_chunkhdr ch;
    504 struct sctp_stream_reset_response_tsn sr_resp;
    505 } SCTP_PACKED;
    506 
    507 /****************************************************/
    508 
    509 /*
    510 * Authenticated chunks support draft-ietf-tsvwg-sctp-auth
    511 */
    512 
    513 /* Should we make the max be 32? */
    514 #define SCTP_RANDOM_MAX_SIZE 256
    515 struct sctp_auth_random {
    516 struct sctp_paramhdr ph;/* type = 0x8002 */
    517 uint8_t random_data[];
    518 } SCTP_PACKED;
    519 
    520 struct sctp_auth_chunk_list {
    521 struct sctp_paramhdr ph;/* type = 0x8003 */
    522 uint8_t chunk_types[];
    523 } SCTP_PACKED;
    524 
    525 struct sctp_auth_hmac_algo {
    526 struct sctp_paramhdr ph;/* type = 0x8004 */
    527 uint16_t hmac_ids[];
    528 } SCTP_PACKED;
    529 
    530 struct sctp_auth_chunk {
    531 struct sctp_chunkhdr ch;
    532 uint16_t shared_key_id;
    533 uint16_t hmac_id;
    534 uint8_t hmac[];
    535 } SCTP_PACKED;
    536 
    537 /* Zero checksum support draft-ietf-tsvwg-sctp-zero-checksum */
    538 
    539 struct sctp_zero_checksum_acceptable {
    540 struct sctp_paramhdr ph;
    541 uint32_t edmid;
    542 } SCTP_PACKED;
    543 
    544 /*
    545 * we pre-reserve enough room for a ECNE or CWR AND a SACK with no missing
    546 * pieces. If ENCE is missing we could have a couple of blocks. This way we
    547 * optimize so we MOST likely can bundle a SACK/ECN with the smallest size
    548 * data chunk I will split into. We could increase throughput slightly by
    549 * taking out these two but the  24-sack/8-CWR i.e. 32 bytes I pre-reserve I
    550 * feel is worth it for now.
    551 */
    552 #ifndef SCTP_MAX_OVERHEAD
    553 #ifdef INET6
    554 #define SCTP_MAX_OVERHEAD (sizeof(struct sctp_data_chunk) + \
    555                           sizeof(struct sctphdr) + \
    556                           sizeof(struct sctp_ecne_chunk) + \
    557                           sizeof(struct sctp_sack_chunk) + \
    558                           sizeof(struct ip6_hdr))
    559 
    560 #define SCTP_MED_OVERHEAD (sizeof(struct sctp_data_chunk) + \
    561                           sizeof(struct sctphdr) + \
    562                           sizeof(struct ip6_hdr))
    563 
    564 #define SCTP_MIN_OVERHEAD (sizeof(struct ip6_hdr) + \
    565                           sizeof(struct sctphdr))
    566 
    567 #else
    568 #define SCTP_MAX_OVERHEAD (sizeof(struct sctp_data_chunk) + \
    569                           sizeof(struct sctphdr) + \
    570                           sizeof(struct sctp_ecne_chunk) + \
    571                           sizeof(struct sctp_sack_chunk) + \
    572                           sizeof(struct ip))
    573 
    574 #define SCTP_MED_OVERHEAD (sizeof(struct sctp_data_chunk) + \
    575                           sizeof(struct sctphdr) + \
    576                           sizeof(struct ip))
    577 
    578 #define SCTP_MIN_OVERHEAD (sizeof(struct ip) + \
    579                           sizeof(struct sctphdr))
    580 
    581 #endif /* INET6 */
    582 #endif /* !SCTP_MAX_OVERHEAD */
    583 
    584 #define SCTP_MED_V4_OVERHEAD (sizeof(struct sctp_data_chunk) + \
    585                              sizeof(struct sctphdr) + \
    586                              sizeof(struct ip))
    587 
    588 #define SCTP_MIN_V4_OVERHEAD (sizeof(struct ip) + \
    589                              sizeof(struct sctphdr))
    590 
    591 #if defined(_WIN32) && !defined(__Userspace__)
    592 #include <packoff.h>
    593 #endif
    594 #if defined(_WIN32) && defined(__Userspace__)
    595 #pragma pack(pop)
    596 #endif
    597 #undef SCTP_PACKED
    598 #endif				/* !__sctp_header_h__ */