2 This file is part of GNUnet
3 (C) 2009, 2010 Christian Grothoff (and other contributing authors)
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.
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.
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.
22 * @file transport/gnunet_transport_plugin.h
23 * @brief API for the transport services. This header
24 * specifies the struct that is given to the plugin's entry
25 * method and the other struct that must be returned.
26 * Note that the destructors of transport plugins will
27 * be given the value returned by the constructor
28 * and is expected to return a NULL pointer.
29 * @author Christian Grothoff
31 #ifndef PLUGIN_TRANSPORT_H
32 #define PLUGIN_TRANSPORT_H
34 #include "gnunet_configuration_lib.h"
35 #include "gnunet_scheduler_lib.h"
36 #include "gnunet_statistics_service.h"
37 #include "gnunet_transport_service.h"
41 * The structs defined here are used by the transport plugin to tell ATS about
42 * the transport's properties like cost and quality and on the other side
43 * the structs are used by highlevel components to communicate the constraints
44 * they have for a transport to ATS
47 * +-----------+ Constraints | | Plugin properties +---------+
48 * | Highlevel |------------> |ATS| <------------------|Transport|
49 * | Component | ATS struct | | ATS struct | Plugin |
50 * +-----------+ | | +---------+
55 #define GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR 0
58 * Enum defining all known property types for ATS
59 * Enum values are used in the GNUNET_TRANSPORT_ATS_Information struct as (key,value)-pair
61 * Cost are always stored in uint32_t, so all units used to define costs
62 * have to be normalized to fit in uint32_t [0 .. 4.294.967.295]
64 * To keep the elements ordered
65 * 1..1024 : Values with a relation to cost
66 * 1025..2048 : Values with a relation to quality
67 * 2049..3072 : Values with a relation to availability
70 enum GNUNET_TRANSPORT_ATS_Property
73 /* Cost related values */
74 /* =================== */
77 * Volume based cost in financial units to transmit data
79 * Note: This value is not bound to a specific currency or unit and only
81 * "cent" just refers the smallest amount of money in the respective
86 * Interpretation: less is better
92 GNUNET_TRANSPORT_ATS_COST_FINANCIAL_PER_VOLUME = 1,
95 * Time based cost in financial units to transmit data
97 * Note: This value is not bound to a specific currency or unit and only
99 * "cent" just refers the smallest amount of money in the respective
104 * Interpretation: less is better
108 * Dialup: 10 [cent/h]
110 GNUNET_TRANSPORT_ATS_COST_FINANCIAL_PER_TIME = 2,
113 * Computational costs
115 * Effort of preparing data to be sent with this transport
116 * Includes encoding, encryption and conversion of data
117 * Partial values can be summed up: c_sum = c_enc + c_enc + c_conv
118 * Resulting values depend on local system properties, e.g. CPU
122 * Interpretation: less is better
126 * HTTPS with AES CBC-256: 7,382
127 * HTTPS with AES CBC-128: 5,279
128 * HTTPS with RC4-1024: 2,652
130 GNUNET_TRANSPORT_ATS_COST_COMPUTATIONAL = 3,
135 * Energy consumption using this transport when sending with a certain
136 * power at a certain bitrate. This is only an approximation based on:
137 * Energy consumption E = P / D
140 * Power P in Watt (J/s)
141 * Datarate D in MBit/s
143 * Conversion between power P and dBm used by WLAN in radiotap's dBm TX power:
145 * Lp(dbm) = 10 log10 (P/ 1mW)
147 * => P = 1 mW * 10^(Lp(dbm)/10)
151 * Interpretation: less is better
156 * WLAN: 89 (600 mW @ 802.11g /w 54 MBit/s)
157 * Bluetooth: 267 (100 mW @ BT2.0 EDR /w 3 MBit/s)
159 GNUNET_TRANSPORT_ATS_COST_ENERGY_CONSUMPTION = 4,
163 * How many bytes are transmitted to initiate a new connection using
168 * Interpretation: less is better
172 * UDP (No connection) :
174 * TCP (TCP 3-Way handshake):
175 * 220 bytes Ethernet, 172 bytes TCP/IP, 122 bytes TCP
176 * HTTP (TCP + Header) :
177 * 477 bytes Ethernet, 429 bytes TCP/IP, 374 bytes TCP, 278 bytes HTTP
178 * HTTPS HTTP+TLS Handshake:
179 * 2129 bytes Ethernet, 1975 bytes TCP/IP, 1755 bytes TCP, 1403 bytes HTTPS
182 GNUNET_TRANSPORT_ATS_COST_CONNECT = 5,
187 * How many bandwidth is available to consume?
188 * Used to calculate which impact sending data with this transport has
192 * Interpretation: more is better
195 * LAN: 12,800 (100 MBit/s)
196 * WLAN: 6,912 (54 MBit/s)
197 * Dial-up: 8 (64 Kbit/s)
200 GNUNET_TRANSPORT_ATS_COST_BANDWITH_AVAILABLE = 6,
205 * How many bytes are sent over the wire when 1 kilobyte (1024 bytes)
206 * of application data is transmitted?
207 * A factor used with connect cost, bandwidth cost and energy cost
208 * to describe the overhead produced by the transport protocol
212 * Interpretation: less is better
216 * TCP/IPv4 over Ethernet: 1024 + 38 + 20 + 20 = 1102 [bytes/kb]
217 * TCP/IPv6 over Ethernet: 1024 + 38 + 20 + 40 = 1122 [bytes/kb]
218 * UDP/IPv4 over Ethernet: 1024 + 38 + 20 + 8 = 1090 [bytes/kb]
219 * UDP/IPv6 over Ethernet: 1024 + 38 + 40 + 8 = 1110 [bytes/kb]
221 GNUNET_TRANSPORT_ATS_COST_NETWORK_OVERHEAD = 7,
224 /* Quality related values */
225 /* ====================== */
227 /* Physical layer quality properties */
230 * Signal strength on physical layer
234 GNUNET_TRANSPORT_ATS_QUALITY_PHY_SIGNAL_STRENGTH = 1025,
237 * Collision rate on physical layer
241 GNUNET_TRANSPORT_ATS_QUALITY_PHY_COLLISION_RATE = 1026,
244 * Error rate on physical layer
248 GNUNET_TRANSPORT_ATS_QUALITY_PHY_ERROR_RATE = 1027,
250 /* Network layer quality properties */
254 * Time between when the time packet is sent and the packet arrives
264 GNUNET_TRANSPORT_ATS_QUALITY_NET_DELAY = 1028,
268 * Time variations of the delay
269 * 1st derivative of a delay function
273 GNUNET_TRANSPORT_ATS_QUALITY_NET_JITTER = 1029,
276 * Error rate on network layer
285 * Note: This numbers are just assumptions as an example, not
286 * measured or somehow determined
288 GNUNET_TRANSPORT_ATS_QUALITY_NET_ERRORRATE = 1030,
291 * Drop rate on network layer
292 * Bytes actively dismissed by a network component during transmission
293 * Reasons for dropped data can be full queues, congestion, quota violations...
302 * Note: This numbers are just assumptions as an example, not
303 * measured or somehow determined
305 GNUNET_TRANSPORT_ATS_QUALITY_NET_DROPRATE = 1031,
308 * Loss rate on network layer
309 * Bytes lost during transmission
310 * Reasons can be collisions, ...
319 * Note: This numbers are just assumptions as an example, not measured
320 * or somehow determined
322 GNUNET_TRANSPORT_ATS_QUALITY_NET_LOSSRATE = 1032,
325 * Throughput on network layer
336 GNUNET_TRANSPORT_ATS_QUALITY_NET_THROUGHPUT = 1033,
338 /* Availability related values */
339 /* =========================== */
342 * Is a peer reachable?
344 GNUNET_TRANSPORT_ATS_AVAILABILITY_REACHABLE = 2048,
347 * Is there a connection established to a peer using this transport
349 GNUNET_TRANSPORT_ATS_AVAILABILITY_CONNECTED = 2049
353 * This structure will be used by plugins to communicate costs to ATS or by
354 * higher level components to tell ATS their constraints.
355 * Always a pair of (GNUNET_TRANSPORT_ATS_Property, uint32_t value).
356 * Value is always uint32_t, so all units used to define costs have to
357 * be normalized to fit uint32_t.
359 struct GNUNET_TRANSPORT_ATS_Information
375 * Opaque pointer that plugins can use to distinguish specific
376 * connections to a given peer. Typically used by stateful plugins to
377 * allow the service to refer to specific streams instead of a more
378 * general notion of "some connection" to the given peer. This is
379 * useful since sometimes (i.e. for inbound TCP connections) a
380 * connection may not have an address that can be used for meaningful
381 * distinction between sessions to the same peer.
386 * Every 'struct Session' must begin with this header.
392 * Cached signature for PONG generation for the session. Do not use
395 struct GNUNET_CRYPTO_RsaSignature pong_signature;
398 * Expiration time for signature. Do not use in the plugin!
400 struct GNUNET_TIME_Absolute pong_sig_expires;
405 * Function that will be called whenever the plugin internally
406 * cleans up a session pointer and hence the service needs to
407 * discard all of those sessions as well. Plugins that do not
408 * use sessions can simply omit calling this function and always
409 * use NULL wherever a session pointer is needed.
412 * @param peer which peer was the session for
413 * @param session which session is being destoyed
415 typedef void (*GNUNET_TRANSPORT_SessionEnd) (void *cls,
416 const struct GNUNET_PeerIdentity *peer,
417 struct Session *session);
421 * Function called by the transport for each received message.
422 * This function should also be called with "NULL" for the
423 * message to signal that the other peer disconnected.
426 * @param peer (claimed) identity of the other peer
427 * @param message the message, NULL if we only care about
428 * learning about the delay until we should receive again -- FIXME!
429 * @param distance in overlay hops; use 1 unless DV (or 0 if message == NULL)
430 * @param session identifier used for this session (NULL for plugins
431 * that do not offer bi-directional communication to the sender
432 * using the same "connection")
433 * @param sender_address binary address of the sender (if we established the
434 * connection or are otherwise sure of it; should be NULL
435 * for inbound TCP/UDP connections since it it not clear
436 * that we could establish ourselves a connection to that
437 * IP address and get the same system)
438 * @param sender_address_len number of bytes in sender_address
439 * @return how long the plugin should wait until receiving more data
440 * (plugins that do not support this, can ignore the return value)
442 typedef struct GNUNET_TIME_Relative (*GNUNET_TRANSPORT_PluginReceiveCallback) (void *cls,
444 GNUNET_PeerIdentity *
447 GNUNET_MessageHeader *
450 struct Session *session,
451 const char *sender_address,
452 uint16_t sender_address_len);
456 * Function that will be called for each address the transport
457 * is aware that it might be reachable under.
460 * @param name name of the transport that generated the address
461 * @param addr one of the addresses of the host, NULL for the last address
462 * the specific address format depends on the transport
463 * @param addrlen length of the address
464 * @param expires when should this address automatically expire?
466 typedef void (*GNUNET_TRANSPORT_AddressNotification) (void *cls,
475 * Function that will be called whenever the plugin receives data over
476 * the network and wants to determine how long it should wait until
477 * the next time it reads from the given peer. Note that some plugins
478 * (such as UDP) may not be able to wait (for a particular peer), so
479 * the waiting part is optional. Plugins that can wait should call
480 * this function, sleep the given amount of time, and call it again
481 * (with zero bytes read) UNTIL it returns zero and only then read.
484 * @param peer which peer did we read data from
485 * @param amount_recved number of bytes read (can be zero)
486 * @return how long to wait until reading more from this peer
487 * (to enforce inbound quotas)
489 typedef struct GNUNET_TIME_Relative (*GNUNET_TRANSPORT_TrafficReport) (void *cls,
491 GNUNET_PeerIdentity *peer,
492 size_t amount_recved);
495 * Function called whenever the plugin has to notify ATS about costs for using this transport
497 * The cost will be passed as struct GNUNET_TRANSPORT_ATS_Cost_Information[]
498 * This array is 0-terminated, so the last element will be a pair:
499 * ((cost->cost_type==GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR) && cost->cost_value==0))
503 * @param addr peer address
504 * @param addrlen address length
505 * @param cost pointer to the first element of struct GNUNET_TRANSPORT_ATS_Cost_Information[]
507 typedef void (*GNUNET_TRANSPORT_CostReport) (void *cls,
508 const struct GNUNET_PeerIdentity *peer,
511 struct GNUNET_TRANSPORT_ATS_Information * cost);
514 * The transport service will pass a pointer to a struct
515 * of this type as the first and only argument to the
516 * entry point of each transport plugin.
518 struct GNUNET_TRANSPORT_PluginEnvironment
521 * Configuration to use.
523 const struct GNUNET_CONFIGURATION_Handle *cfg;
526 * Identity of this peer.
528 const struct GNUNET_PeerIdentity *my_identity;
531 * Pointer (!) to our HELLO message. Note that the address
532 * referred to "*our_hello" might change over time.
534 struct GNUNET_HELLO_Message *const*our_hello;
537 * Closure for the various callbacks.
542 * Handle for reporting statistics.
544 struct GNUNET_STATISTICS_Handle *stats;
547 * Function that should be called by the transport plugin
548 * whenever a message is received.
550 GNUNET_TRANSPORT_PluginReceiveCallback receive;
553 * Function that must be called by each plugin to notify the
554 * transport service about the addresses under which the transport
555 * provided by the plugin can be reached.
557 GNUNET_TRANSPORT_AddressNotification notify_address;
560 * Inform service about traffic received, get information
561 * about when we might be willing to receive more.
563 GNUNET_TRANSPORT_TrafficReport traffic_report;
566 * Function that must be called by the plugin when a non-NULL
567 * session handle stops being valid (is destroyed).
569 GNUNET_TRANSPORT_SessionEnd session_end;
572 * Inform service about costs for using this transport plugin
574 GNUNET_TRANSPORT_CostReport cost_report;
577 * What is the maximum number of connections that this transport
578 * should allow? Transports that do not have sessions (such as
579 * UDP) can ignore this value.
581 uint32_t max_connections;
587 * Function called by the GNUNET_TRANSPORT_TransmitFunction
591 * @param target who was the recipient of the message?
592 * @param result GNUNET_OK on success
593 * GNUNET_SYSERR if the target disconnected;
594 * disconnect will ALSO be signalled using
595 * the ReceiveCallback.
598 (*GNUNET_TRANSPORT_TransmitContinuation) (void *cls,
599 const struct GNUNET_PeerIdentity *
604 * Function that can be used by the transport service to transmit
605 * a message using the plugin. Note that in the case of a
606 * peer disconnecting, the continuation MUST be called
607 * prior to the disconnect notification itself. This function
608 * will be called with this peer's HELLO message to initiate
609 * a fresh connection to another peer.
612 * @param target who should receive this message
613 * @param msgbuf the message to transmit
614 * @param msgbuf_size number of bytes in 'msgbuf'
615 * @param priority how important is the message (most plugins will
616 * ignore message priority and just FIFO)
617 * @param timeout how long to wait at most for the transmission (does not
618 * require plugins to discard the message after the timeout,
619 * just advisory for the desired delay; most plugins will ignore
621 * @param session which session must be used (or NULL for "any")
622 * @param addr the address to use (can be NULL if the plugin
623 * is "on its own" (i.e. re-use existing TCP connection))
624 * @param addrlen length of the address in bytes
625 * @param force_address GNUNET_YES if the plugin MUST use the given address,
626 * GNUNET_NO means the plugin may use any other address and
627 * GNUNET_SYSERR means that only reliable existing
628 * bi-directional connections should be used (regardless
630 * @param cont continuation to call once the message has
631 * been transmitted (or if the transport is ready
632 * for the next transmission call; or if the
633 * peer disconnected...); can be NULL
634 * @param cont_cls closure for cont
635 * @return number of bytes used (on the physical network, with overheads);
636 * -1 on hard errors (i.e. address invalid); 0 is a legal value
637 * and does NOT mean that the message was not transmitted (DV)
640 (*GNUNET_TRANSPORT_TransmitFunction) (void *cls,
641 const struct GNUNET_PeerIdentity *
646 struct GNUNET_TIME_Relative timeout,
647 struct Session *session,
651 GNUNET_TRANSPORT_TransmitContinuation
652 cont, void *cont_cls);
656 * Function that can be called to force a disconnect from the
657 * specified neighbour. This should also cancel all previously
658 * scheduled transmissions. Obviously the transmission may have been
659 * partially completed already, which is OK. The plugin is supposed
660 * to close the connection (if applicable) and no longer call the
661 * transmit continuation(s).
663 * Finally, plugin MUST NOT call the services's receive function to
664 * notify the service that the connection to the specified target was
665 * closed after a getting this call.
668 * @param target peer for which the last transmission is
672 (*GNUNET_TRANSPORT_DisconnectFunction) (void *cls,
673 const struct GNUNET_PeerIdentity *
678 * Function called by the pretty printer for the resolved address for
679 * each human-readable address obtained.
682 * @param hostname one of the names for the host, NULL
683 * on the last call to the callback
685 typedef void (*GNUNET_TRANSPORT_AddressStringCallback) (void *cls,
686 const char *address);
690 * Convert the transports address to a nice, human-readable
694 * @param name name of the transport that generated the address
695 * @param addr one of the addresses of the host, NULL for the last address
696 * the specific address format depends on the transport
697 * @param addrlen length of the address
698 * @param numeric should (IP) addresses be displayed in numeric form?
699 * @param timeout after how long should we give up?
700 * @param asc function to call on each string
701 * @param asc_cls closure for asc
704 (*GNUNET_TRANSPORT_AddressPrettyPrinter) (void *cls,
709 struct GNUNET_TIME_Relative
711 GNUNET_TRANSPORT_AddressStringCallback
716 * Another peer has suggested an address for this peer and transport
717 * plugin. Check that this could be a valid address. This function
718 * is not expected to 'validate' the address in the sense of trying to
719 * connect to it but simply to see if the binary format is technically
720 * legal for establishing a connection to this peer (and make sure that
721 * the address really corresponds to our network connection/settings
722 * and not some potential man-in-the-middle).
724 * @param addr pointer to the address
725 * @param addrlen length of addr
726 * @return GNUNET_OK if this is a plausible address for this peer
727 * and transport, GNUNET_SYSERR if not
730 (*GNUNET_TRANSPORT_CheckAddress) (void *cls,
731 const void *addr, size_t addrlen);
735 * Function called for a quick conversion of the binary address to
736 * a numeric address. Note that the caller must not free the
737 * address and that the next call to this function is allowed
738 * to override the address again.
741 * @param addr binary address
742 * @param addr_len length of the address
743 * @return string representing the same address
745 typedef const char* (*GNUNET_TRANSPORT_AddressToString) (void *cls,
751 * Each plugin is required to return a pointer to a struct of this
752 * type as the return value from its entry point.
754 struct GNUNET_TRANSPORT_PluginFunctions
758 * Closure for all of the callbacks.
763 * Function that the transport service will use to transmit data to
764 * another peer. May be NULL for plugins that only support
765 * receiving data. After this call, the plugin call the specified
766 * continuation with success or error before notifying us about the
767 * target having disconnected.
769 GNUNET_TRANSPORT_TransmitFunction send;
772 * Function that can be used to force the plugin to disconnect from
773 * the given peer and cancel all previous transmissions (and their
774 * continuations). Note that if the transport does not have
775 * sessions / persistent connections (for example, UDP), this
776 * function may very well do nothing.
778 GNUNET_TRANSPORT_DisconnectFunction disconnect;
781 * Function to pretty-print addresses. NOTE: this function is not
782 * yet used by transport-service, but will be used in the future
783 * once the transport-API has been completed.
785 GNUNET_TRANSPORT_AddressPrettyPrinter address_pretty_printer;
788 * Function that will be called to check if a binary address
789 * for this plugin is well-formed and corresponds to an
790 * address for THIS peer (as per our configuration). Naturally,
791 * if absolutely necessary, plugins can be a bit conservative in
792 * their answer, but in general plugins should make sure that the
793 * address does not redirect traffic to a 3rd party that might
794 * try to man-in-the-middle our traffic.
796 GNUNET_TRANSPORT_CheckAddress check_address;
799 * Function that will be called to convert a binary address
800 * to a string (numeric conversion only).
802 GNUNET_TRANSPORT_AddressToString address_to_string;