1 /* $KAME: dccp_tcplike.h,v 1.10 2005/07/22 09:31:14 nishida Exp $ */ 2 /* $NetBSD: dccp_tcplike.h,v 1.2 2016/07/07 06:55:43 msaitoh Exp $ */ 3 4 /* 5 * Copyright (c) 2003 Magnus Erixzon 6 * 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 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. The name of the author may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 /* 32 * Headerfile for TCP-like congestion control for DCCP 33 */ 34 35 #ifndef _NETINET_DCCP_TCPLIKE_H_ 36 #define _NETINET_DCCP_TCPLIKE_H_ 37 38 /* 39 * TCPlike sender 40 */ 41 42 /* Parameter to decide when a packet is considered lost */ 43 #define TCPLIKE_NUMDUPACK 3 44 /* Upperbound timeout value */ 45 #define TIMEOUT_UBOUND (30 * hz) 46 #define TCPLIKE_MIN_RTT (hz >> 3) 47 #define TCPLIKE_INITIAL_CWND 3 48 #define TCPLIKE_INITIAL_CWNDVECTOR 512 49 50 /* TCPlike sender congestion control block (ccb) */ 51 struct tcplike_send_ccb 52 { 53 kmutex_t mutex; 54 struct dccpcb *pcb; /* Pointer to associated dccpcb */ 55 dccp_seq cwnd; /* congestion window */ 56 dccp_seq ssthresh; 57 dccp_seq oldcwnd_ts; /* old cwnd tail seqnr */ 58 59 u_int16_t rtt; /* estimated round trip-time */ 60 u_int16_t rto; /* Timeout value */ 61 u_int16_t rtt_d; 62 63 int16_t outstanding; /* Number of unacked packets sent */ 64 u_int16_t rcvr_ackratio; /* Receiver ack ratio */ 65 66 u_int16_t acked_in_win; /* No of acked packets in the window */ 67 u_int8_t acked_windows; /* No of acked windows with no lost Acks */ 68 69 u_int32_t ack_last; /* Last ok Ack packet */ 70 u_int32_t ack_miss; /* oldest missing Ack packet */ 71 72 struct callout free_timer; 73 struct callout rto_timer; 74 u_int rto_timer_callout; 75 76 u_char *cwndvector; /* 2 bits per packet */ 77 u_char *cv_hp; /* head ptr for cwndvector */ 78 u_int16_t cv_size; 79 dccp_seq cv_hs, cv_ts; /* lowest/highest seq no in cwndvector */ 80 81 u_int8_t sample_rtt; 82 u_int32_t timestamp; 83 84 dccp_seq rcvd_ack, lost_ack; 85 }; 86 87 #ifdef _KERNEL 88 89 /* Functions declared in struct dccp_cc_sw */ 90 91 /* 92 * Initialises the sender side 93 * args: pcb - pointer to dccpcb of associated connection 94 * returns: pointer to a tcplike_send_ccb struct on success, otherwise 0 95 */ 96 void *tcplike_send_init(struct dccpcb *); 97 98 /* 99 * Free the sender side 100 * args: ccb - ccb of sender 101 */ 102 void tcplike_send_free(void *); 103 104 /* 105 * Ask TCPlike wheter one can send a packet or not 106 * args: ccb - ccb block for current connection 107 * returns: 0 if ok, else <> 0. 108 */ 109 int tcplike_send_packet(void *, long); 110 void tcplike_send_packet_sent(void *, int, long); 111 112 /* 113 * Notify that an ack package was received 114 * args: ccb - ccb block for current connection 115 */ 116 void tcplike_send_packet_recv(void *, char *, int); 117 118 #endif 119 120 /* 121 * TFRC Receiver 122 */ 123 124 struct ack_list 125 { 126 u_int64_t localseq, ackthru; 127 struct ack_list *next; 128 }; 129 130 /* TCPlike receiver congestion control block (ccb) */ 131 struct tcplike_recv_ccb { 132 kmutex_t mutex; 133 struct dccpcb *pcb; /* Pointer to associated dccpcb */ 134 /* No ack ratio or vector here. it's a global feature */ 135 struct ack_list *av_list; 136 u_int16_t unacked; /* no of unacked packets */ 137 struct callout free_timer; 138 }; 139 140 #ifdef _KERNEL 141 142 /* Functions declared in struct dccp_cc_sw */ 143 144 /* 145 * Initialises the receiver side 146 * args: pcb - pointer to dccpcb of associated connection 147 * returns: pointer to a tcplike_recv_ccb struct on success, otherwise 0 148 */ 149 void *tcplike_recv_init(struct dccpcb *); 150 151 /* 152 * Free the receiver side 153 * args: ccb - ccb of recevier 154 */ 155 void tcplike_recv_free(void *); 156 157 /* 158 * Tell TCPlike that a packet has been received 159 * args: ccb - ccb block for current connection 160 */ 161 void tcplike_recv_packet_recv(void *, char *, int); 162 163 /* 164 int tcplike_option_recv(void); 165 */ 166 #endif 167 168 #endif 169