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