track delay between transmission request and satisfaction:
[oweals/gnunet.git] / src / transport / transport_selection.h
1 /*
2      This file is part of GNUnet.
3      (C) 2009 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file transport/transport_selection.h
23  * @brief structure definition for automatic transport selection (ATS)
24  * @author Matthias Wachs
25  */
26
27 /**
28  *  The structs defined here are used by the transport plugin to tell ATS about the transport's properties like cost and quality
29  *  and on the other side the structs are used by highlevel components to communicate the constraints they have for a transport to ATS
30  *
31  *                             +---+
32  *  +-----------+ Constraints  |   |  Plugin properties +---------+
33  *  | Highlevel |------------> |ATS| <------------------|Transport|
34  *  | Component | ATS struct   |   |    ATS struct      | Plugin  |
35  *  +-----------+              |   |                    +---------+
36  *                             +---+
37  *
38  */
39
40 #define GNUNET_ATS_ARRAY_TERMINATOR 0
41
42 /**
43  * Enum defining all known property types for ATS
44  * Enum values are used in the GNUNET_ATS_Information struct as (key,value)-pair
45  * Cost are always stored in uint32_t, so all units used to define costs have to be normalized to fit in uint32_t [0 .. 4.294.967.295]
46  * To keep the elements ordered
47  *    1..1024 : Values with a relation to cost
48  * 1025..2048 : Values with a relation to quality
49  * 2049..3072 : Values with a relation to availability
50  *
51  */
52 enum GNUNET_ATS_Property
53 {
54
55         /* Cost related values */
56         /* =================== */
57
58         /**
59          * Volume based cost in financial units to transmit data
60          *
61          * Note: This value is not bound to a specific currency or unit and only used locally
62          * "cent" just refers the smallest amount of money in the respective currency
63          *
64          * Unit: [cent/MB]
65          *
66          * Interpretation: less is better
67          *
68          * Examples:
69          * LAN:  0 [cent/MB]
70          * 2G : 10 [cent/MB]
71          */
72         GNUNET_ATS_COST_FINANCIAL_PER_VOLUME = 1,
73
74         /**
75          * Time based cost in financial units to transmit data
76          *
77          * Note: This value is not bound to a specific currency or unit and only used locally
78          * "cent" just refers the smallest amount of money in the respective currency
79          *
80          * Unit: [cent/h]
81          *
82          * Interpretation: less is better
83          *
84          * Examples:
85          * LAN   :  0 [cent/h]
86          * Dialup: 10 [cent/h]
87          */
88         GNUNET_ATS_COST_FINANCIAL_PER_TIME = 2,
89
90         /**
91          * Computational costs
92          *
93          * Effort of preparing data to be sent with this transport
94          * Includes encoding, encryption and conversion of data
95          * Partial values can be summed up: c_sum = c_enc + c_enc + c_conv
96          * Resulting values depend on local system properties, e.g. CPU
97          *
98          * Unit: [ms/GB]
99          *
100          * Interpretation: less is better
101          *
102          * Examples:
103          *
104          * HTTPS with AES CBC-256:      7,382
105          * HTTPS with AES CBC-128:      5,279
106          * HTTPS with RC4-1024:         2,652
107          */
108         GNUNET_ATS_COST_COMPUTATIONAL = 3,
109
110         /**
111          * Energy consumption
112          *
113          * Energy consumption using this transport when sending with a certain power at a certain bitrate
114          * This is only an approximation based on:
115          * Energy consumption E = P / D
116          *
117          * with:
118          * Power P in Watt (J/s)
119          * Datarate D in MBit/s
120          *
121          * Conversion between power P and dBm used by WLAN in radiotap's dBm TX power:
122          *
123          * Lp(dbm) = 10 log10 (P/ 1mW)
124          *
125          * => P = 1 mW  * 10^(Lp(dbm)/10)
126          *
127          * Unit: [mJ/MB]
128          *
129          * Interpretation: less is better
130          *
131          * Examples:
132          *
133          * LAN:       0
134          * WLAN:      89 (600 mW @ 802.11g /w 54 MBit/s)
135          * Bluetooth: 267 (100 mW @ BT2.0 EDR /w 3 MBit/s)
136          */
137         GNUNET_ATS_COST_ENERGY_CONSUMPTION = 4,
138
139         /**
140          * Connect cost
141          * How many bytes are transmitted to initiate a new connection using this transport?
142          *
143          * Unit: [bytes]
144          *
145          * Interpretation: less is better
146          *
147          * Examples:
148          *
149          * UDP (No connection)      :    0 bytes
150          * TCP (TCP 3-Way handshake):  220 bytes Ethernet,  172 bytes TCP/IP,  122 bytes TCP
151          * HTTP (TCP + Header)      :  477 bytes Ethernet,  429 bytes TCP/IP,  374 bytes TCP,  278 bytes HTTP
152          * HTTPS  HTTP+TLS Handshake: 2129 bytes Ethernet, 1975 bytes TCP/IP, 1755 bytes TCP, 1403 bytes HTTPS
153          *
154          * */
155         GNUNET_ATS_COST_CONNECT = 5,
156
157         /**
158          * Bandwidth cost
159          *
160          * How many bandwidth is available to consume?
161          * Used to calculate which impact sending data with this transport has
162          *
163          * Unit: [kB/s]
164          *
165          * Interpretation: more is better
166          *
167          * Examples:
168          * LAN:     12,800  (100 MBit/s)
169          * WLAN:    6,912   (54 MBit/s)
170          * Dial-up: 8       (64 Kbit/s)
171          *
172          */
173         GNUNET_ATS_COST_BANDWITH_AVAILABLE = 6,
174
175         /**
176          *  Network overhead
177          *
178          * How many bytes are sent over the wire when 1 kilobyte (1024 bytes) of application data is transmitted?
179          * A factor used with connect cost, bandwidth cost and energy cost to describe the overhead produced by the transport protocol
180          *
181          * Unit: [bytes/kb]
182          *
183          * Interpretation: less is better
184          *
185          * Examples:
186          *
187          * TCP/IPv4 over Ethernet: 1024 + 38 + 20 + 20 = 1102 [bytes/kb]
188          * TCP/IPv6 over Ethernet: 1024 + 38 + 20 + 40 = 1122 [bytes/kb]
189          * UDP/IPv4 over Ethernet: 1024 + 38 + 20 + 8  = 1090 [bytes/kb]
190          * UDP/IPv6 over Ethernet: 1024 + 38 + 40 + 8  = 1110 [bytes/kb]
191          */
192         GNUNET_ATS_COST_NETWORK_OVERHEAD = 7,
193
194
195         /* Quality related values */
196         /* ====================== */
197
198     /* Physical layer quality properties */
199
200         /**
201          * Signal strength on physical layer
202          *
203          * Unit: [dBm]
204          */
205         GNUNET_ATS_QUALITY_PHY_SIGNAL_STRENGTH = 1025,
206
207         /**
208          * Collision rate on physical layer
209          *
210          * Unit: [B/s]
211          */
212         GNUNET_ATS_QUALITY_PHY_COLLISION_RATE = 1026,
213
214         /**
215          * Error rate on physical layer
216          *
217          * Unit: [B/s]
218          */
219         GNUNET_ATS_QUALITY_PHY_ERROR_RATE = 1027,
220
221     /* Network layer quality properties */
222
223         /**
224          * Delay
225          * Time between when the time packet is sent and the packet arrives
226          *
227          * Unit: [μs]
228          *
229          * Examples:
230          *
231          * LAN   :  180
232          * Dialup: 4000
233          * WLAN  : 7000
234          */
235         GNUNET_ATS_QUALITY_NET_DELAY = 1028,
236
237         /**
238          * Jitter
239          * Time variations of the delay
240          * 1st derivative of a delay function
241          *
242          * Unit: [μs]
243          */
244         GNUNET_ATS_QUALITY_NET_JITTER = 1029,
245
246         /**
247          * Error rate on network layer
248          *
249          * Unit: [B/s]
250          *
251          * Examples:
252          *
253          * LAN       :    0
254          * WLAN      :  400
255          * Bluetooth :  100
256          * Note: This numbers are just assumptions as an example, not measured or somehow determined
257          */
258         GNUNET_ATS_QUALITY_NET_ERRORRATE = 1030,
259
260         /**
261          * Drop rate on network layer
262      * Bytes actively dismissed by a network component during transmission
263      * Reasons for dropped data can be full queues, congestion, quota violations...
264          *
265          * Unit: [B/s]
266          *
267          * Examples:
268          *
269          * LAN       :    0
270          * WLAN      :  400
271          * Bluetooth :  100
272          * Note: This numbers are just assumptions as an example, not measured or somehow determined
273          */
274         GNUNET_ATS_QUALITY_NET_DROPRATE = 1031,
275
276         /**
277          * Loss rate on network layer
278          * Bytes lost during transmission
279          * Reasons can be collisions, ...
280          *
281          * Unit: [B/s]
282          *
283          * Examples:
284          *
285          * LAN       :    0
286          * WLAN      :   40
287          * Bluetooth :   10
288          * Note: This numbers are just assumptions as an example, not measured or somehow determined
289          */
290         GNUNET_ATS_QUALITY_NET_LOSSRATE = 1032,
291
292         /**
293          * Throughput on network layer
294          *
295          * Unit: [kB/s]
296          *
297          * Examples:
298          *
299          * LAN   : 3400
300          * WLAN  : 1200
301          * Dialup:        4
302          *
303          */
304         GNUNET_ATS_QUALITY_NET_THROUGHPUT = 1033,
305
306         /* Availability related values */
307         /* =========================== */
308
309         /**
310          * Is a peer reachable?
311          */
312         GNUNET_ATS_AVAILABILITY_REACHABLE = 2048,
313
314         /**
315          * Is there a connection established to a peer using this transport
316          */
317         GNUNET_ATS_AVAILABILITY_CONNECTED = 2049
318 };
319
320 /**
321  * This structure will be used by plugins to communicate costs to ATS or by higher level components to tell ATS their constraints
322  * Always a pair of (GNUNET_ATS_Property, uint32_t value)
323  * Value is always uint32_t, so all units used to define costs have to be normalized to fit uint32_t
324  */
325 struct GNUNET_ATS_Information
326 {
327         /**
328          * ATS property type
329          */
330         uint32_t type;
331
332         /**
333          * ATS property value
334          */
335         uint32_t value;
336 };
337
338 /* end of transport_selection.h */