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