1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _INET_TCP_SACK_H 27 #define _INET_TCP_SACK_H 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 /* Maximum num of receiver's SACK blocks */ 34 #define MAX_SACK_BLK 5 35 36 /* Receiver's SACK blk structure */ 37 typedef struct sack_blk 38 { 39 tcp_seq begin; 40 tcp_seq end; 41 } sack_blk_t; 42 43 /* Sender's notsack'ed blk structure */ 44 typedef struct notsack_blk 45 { 46 struct notsack_blk *next; 47 tcp_seq begin; 48 tcp_seq end; 49 uint32_t sack_cnt; /* Dup SACK count */ 50 } notsack_blk_t; 51 52 53 /* SACK information in the tcp_t structure. */ 54 typedef struct 55 { 56 int32_t tcp_pipe; /* # of bytes in network */ 57 tcp_seq tcp_fack; /* highest sack'ed seq num */ 58 tcp_seq tcp_sack_snxt; /* next seq num to be rexmited using SACK. */ 59 60 int32_t tcp_max_sack_blk; /* max # of SACK info blk in a segment */ 61 int32_t tcp_num_sack_blk; /* num of blks in sack list */ 62 sack_blk_t tcp_sack_list[MAX_SACK_BLK]; /* the sack list */ 63 64 /* num of blks in notsack list */ 65 int32_t tcp_num_notsack_blk; 66 /* # of bytes represented in blks in notsack list */ 67 uint32_t tcp_cnt_notsack_list; 68 /* the notsack list */ 69 notsack_blk_t *tcp_notsack_list; 70 } tcp_sack_info_t; 71 72 extern void tcp_sack_insert(sack_blk_t *, tcp_seq, tcp_seq, int32_t *); 73 extern void tcp_sack_remove(sack_blk_t *, tcp_seq, int32_t *); 74 extern void tcp_notsack_insert(notsack_blk_t **, tcp_seq, tcp_seq, 75 int32_t *, uint32_t *); 76 extern void tcp_notsack_remove(notsack_blk_t **, tcp_seq, int32_t *, 77 uint32_t *); 78 extern void tcp_notsack_update(notsack_blk_t **, tcp_seq, tcp_seq, 79 int32_t *, uint32_t *); 80 81 82 /* 83 * Macro to remove all the notsack'ed blks in sender. 84 * 85 * Param: 86 * notsack_blk_t *head: pointer to the head of the list of notsack'ed blks. 87 */ 88 #define TCP_NOTSACK_REMOVE_ALL(head, tcp) \ 89 { \ 90 notsack_blk_t *prev, *tmp; \ 91 tmp = (head); \ 92 do { \ 93 prev = tmp; \ 94 tmp = tmp->next; \ 95 kmem_free(prev, sizeof (notsack_blk_t)); \ 96 } while (tmp != NULL); \ 97 (head) = NULL; \ 98 (tcp)->tcp_cnt_notsack_list = 0; \ 99 (tcp)->tcp_num_notsack_blk = 0; \ 100 } 101 102 103 #ifdef __cplusplus 104 } 105 #endif 106 107 #endif /* _INET_TCP_SACK_H */ 108