2 This file is part of GNUnet.
3 Copyright (C) 2009-2014 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your 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 Affero General Public License for more details.
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
22 * @file transport/transport.h
23 * @brief common internal definitions for transport service
24 * @author Christian Grothoff
29 #include "gnunet_crypto_lib.h"
30 #include "gnunet_time_lib.h"
31 #include "gnunet_constants.h"
33 #define DEBUG_TRANSPORT GNUNET_EXTRA_LOGGING
37 * For how long do we allow unused bandwidth
38 * from the past to carry over into the future? (in seconds)
40 #define MAX_BANDWIDTH_CARRY_S GNUNET_CONSTANTS_MAX_BANDWIDTH_CARRY_S
43 * How often do we (at most) do a full quota
44 * recalculation? (in ms)
46 #define MIN_QUOTA_REFRESH_TIME 2000
49 * What's the maximum number of sockets transport uses for validation and
52 #define DEFAULT_MAX_FDS 256
55 * Maximum frequency for re-evaluating latencies for all transport addresses.
57 #define LATENCY_EVALUATION_MAX_DELAY \
58 GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_HOURS, 1)
61 * Maximum frequency for re-evaluating latencies for connected addresses.
63 #define CONNECTED_LATENCY_EVALUATION_MAX_DELAY \
64 GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 1)
67 * Similiar to GNUNET_TRANSPORT_NotifyDisconnect but in and out quotas are
68 * included here. These values are not required outside transport_api
71 * @param peer the peer that connected
72 * @param bandwidth_in inbound bandwidth in NBO
73 * @param bandwidth_out outbound bandwidth in NBO
76 typedef void (*NotifyConnect) (
78 const struct GNUNET_PeerIdentity *peer,
79 struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
80 struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out);
83 GNUNET_NETWORK_STRUCT_BEGIN
87 * Message from the transport service to the library
88 * asking to check if both processes agree about this
93 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_START
95 struct GNUNET_MessageHeader header;
99 * 1: The @e self field should be checked
100 * 2: this client is interested in payload traffic
105 * Identity we think we have. If it does not match, the
106 * receiver should print out an error message and disconnect.
108 struct GNUNET_PeerIdentity self;
113 * Message from the transport service to the library
114 * informing about neighbors.
116 struct ConnectInfoMessage {
118 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT
120 struct GNUNET_MessageHeader header;
122 #if (defined(GNUNET_TRANSPORT_COMMUNICATION_VERSION) || \
123 defined(GNUNET_TRANSPORT_CORE_VERSION))
126 * Always zero, for alignment.
128 uint32_t reserved GNUNET_PACKED;
131 * Current outbound quota for this peer
133 struct GNUNET_BANDWIDTH_Value32NBO quota_out;
137 * Identity of the new neighbour.
139 struct GNUNET_PeerIdentity id;
144 * Message from the transport service to the library
145 * informing about disconnects.
147 struct DisconnectInfoMessage {
149 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT
151 struct GNUNET_MessageHeader header;
154 * Reserved, always zero.
156 uint32_t reserved GNUNET_PACKED;
159 * Who got disconnected?
161 struct GNUNET_PeerIdentity peer;
166 * Message used to set a particular bandwidth quota. Sent TO the
167 * service to set an incoming quota, sent FROM the service to update
170 * NOTE: no longer used in TNG!
172 struct QuotaSetMessage {
174 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_SET_QUOTA
176 struct GNUNET_MessageHeader header;
181 struct GNUNET_BANDWIDTH_Value32NBO quota;
184 * About which peer are we talking here?
186 struct GNUNET_PeerIdentity peer;
191 * Message used to notify the transport API about a message
192 * received from the network. The actual message follows.
194 struct InboundMessage {
196 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_RECV
198 struct GNUNET_MessageHeader header;
201 * Which peer sent the message?
203 struct GNUNET_PeerIdentity peer;
208 * Message used to notify the transport API that it can
209 * send another message to the transport service.
211 struct SendOkMessage {
213 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK
215 struct GNUNET_MessageHeader header;
217 #if (defined(GNUNET_TRANSPORT_COMMUNICATION_VERSION) || \
218 defined(GNUNET_TRANSPORT_CORE_VERSION))
220 uint32_t reserved GNUNET_PACKED;
223 * #GNUNET_OK if the transmission succeeded,
224 * #GNUNET_SYSERR if it failed (i.e. network disconnect);
225 * in either case, it is now OK for this client to
226 * send us another message for the given peer.
228 uint16_t success GNUNET_PACKED;
231 * Size of message sent
233 uint16_t bytes_msg GNUNET_PACKED;
236 * Size of message sent over wire.
237 * Includes plugin and protocol specific overheads.
239 uint32_t bytes_physical GNUNET_PACKED;
243 * Which peer can send more now?
245 struct GNUNET_PeerIdentity peer;
250 * Message used to notify the transport API that it can
251 * send another message to the transport service.
252 * (Used to implement flow control.)
254 struct RecvOkMessage {
256 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_RECV_OK
258 struct GNUNET_MessageHeader header;
261 * Number of messages by which to increase the window, greater or
264 uint32_t increase_window_delta GNUNET_PACKED;
267 * Which peer can CORE handle more from now?
269 struct GNUNET_PeerIdentity peer;
274 * Message used to notify the transport service about a message
275 * to be transmitted to another peer. The actual message follows.
277 struct OutboundMessage {
279 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_SEND
281 struct GNUNET_MessageHeader header;
284 * An `enum GNUNET_MQ_PriorityPreferences` in NBO.
286 uint32_t priority GNUNET_PACKED;
288 #if !(defined(GNUNET_TRANSPORT_COMMUNICATION_VERSION) || \
289 defined(GNUNET_TRANSPORT_CORE_VERSION))
294 struct GNUNET_TIME_RelativeNBO timeout;
298 * Which peer should receive the message?
300 struct GNUNET_PeerIdentity peer;
304 #if !(defined(GNUNET_TRANSPORT_COMMUNICATION_VERSION) || \
305 defined(GNUNET_TRANSPORT_CORE_VERSION))
309 * Message used to notify the transport API about an address to string
310 * conversion. Message is followed by the string with the humand-readable
311 * address. For each lookup, multiple results may be returned. The
312 * last message must have a @e res of #GNUNET_OK and an @e addr_len
315 struct AddressToStringResultMessage {
317 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY
319 struct GNUNET_MessageHeader header;
322 * #GNUNET_OK if the conversion succeeded,
323 * #GNUNET_SYSERR if it failed
325 uint32_t res GNUNET_PACKED;
328 * Length of the following string, zero if @e is #GNUNET_SYSERR
330 uint32_t addr_len GNUNET_PACKED;
335 * Message from the library to the transport service
336 * asking for converting a transport address to a
337 * human-readable UTF-8 string.
339 struct AddressLookupMessage {
341 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING
343 struct GNUNET_MessageHeader header;
346 * Should the conversion use numeric IP addresses (otherwise
347 * a reverse DNS lookup is OK -- if applicable).
349 int16_t numeric_only GNUNET_PACKED;
352 * Length of the (binary) address in bytes, in big-endian.
354 uint16_t addrlen GNUNET_PACKED;
357 * timeout to give up (for DNS resolution timeout mostly)
359 struct GNUNET_TIME_RelativeNBO timeout;
361 /* followed by @e addrlen bytes of the actual address, then
362 * followed by the 0-terminated name of the transport */
367 * Message from the transport service to the library containing information
368 * about a peer. Information contained are:
369 * - current address used to communicate with this peer
374 * [AddressIterateResponseMessage][address[addrlen]][transportname[pluginlen]]
376 struct ValidationIterateResponseMessage {
378 * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_VALIDATION_RESPONSE
380 struct GNUNET_MessageHeader header;
390 struct GNUNET_PeerIdentity peer;
393 * Local info about the address
395 uint32_t local_address_info GNUNET_PACKED;
400 uint32_t addrlen GNUNET_PACKED;
403 * Length of the plugin name
405 uint32_t pluginlen GNUNET_PACKED;
410 uint32_t state GNUNET_PACKED;
413 * At what time did we successfully validate the address last.
414 * Will be NEVER if the address failed validation.
416 struct GNUNET_TIME_AbsoluteNBO last_validation;
419 * Until when is the address believed to be valid.
420 * Will be ZERO if the address is not belived to be valid.
422 struct GNUNET_TIME_AbsoluteNBO valid_until;
425 * When will we next try to validate the address (typically
426 * done before @e valid_until happens).
428 struct GNUNET_TIME_AbsoluteNBO next_validation;
433 * Message from the library to the transport service
434 * asking for binary addresses known for a peer.
436 struct ValidationMonitorMessage {
438 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_VALIDATION_REQUEST
440 struct GNUNET_MessageHeader header;
443 * One shot call or continous replies?
445 uint32_t one_shot GNUNET_PACKED;
448 * The identity of the peer to look up.
450 struct GNUNET_PeerIdentity peer;
455 * Message from the library to the transport service
456 * asking for binary addresses known for a peer.
458 struct PeerMonitorMessage {
460 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_REQUEST
462 struct GNUNET_MessageHeader header;
465 * One shot call or continous replies?
467 uint32_t one_shot GNUNET_PACKED;
470 * The identity of the peer to look up.
472 struct GNUNET_PeerIdentity peer;
477 * Message from the library to the transport service
478 * asking for binary addresses known for a peer.
480 struct TrafficMetricMessage {
482 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_TRAFFIC_METRIC
484 struct GNUNET_MessageHeader header;
489 uint32_t reserved GNUNET_PACKED;
492 * The identity of the peer to look up.
494 struct GNUNET_PeerIdentity peer;
497 * Fake properties to generate.
499 struct GNUNET_ATS_PropertiesNBO properties;
502 * Fake delay to add on inbound traffic.
504 struct GNUNET_TIME_RelativeNBO delay_in;
507 * Fake delay to add on outbound traffic.
509 struct GNUNET_TIME_RelativeNBO delay_out;
514 * Message from the transport service to the library containing information
515 * about a peer. Information contained are:
516 * - current address used to communicate with this peer
521 * [AddressIterateResponseMessage][address[addrlen]][transportname[pluginlen]]
523 struct PeerIterateResponseMessage {
525 * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_RESPONSE
527 struct GNUNET_MessageHeader header;
537 struct GNUNET_PeerIdentity peer;
540 * Timeout for the state this peer is in
542 struct GNUNET_TIME_AbsoluteNBO state_timeout;
545 * Local info about the address
547 uint32_t local_address_info GNUNET_PACKED;
550 * State this peer is in as an `enum GNUNET_TRANSPORT_PeerState`
552 uint32_t state GNUNET_PACKED;
557 uint32_t addrlen GNUNET_PACKED;
560 * Length of the plugin name
562 uint32_t pluginlen GNUNET_PACKED;
567 * Change in blacklisting (either request or notification,
568 * depending on which direction it is going).
570 struct BlacklistMessage {
572 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_QUERY or
573 * #GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_REPLY.
575 struct GNUNET_MessageHeader header;
578 * 0 for the query, #GNUNET_OK (allowed) or #GNUNET_SYSERR (disallowed)
581 uint32_t is_allowed GNUNET_PACKED;
584 * Which peer is being blacklisted or queried?
586 struct GNUNET_PeerIdentity peer;
591 * Transport-level connection status update.
593 struct TransportPluginMonitorMessage {
595 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PLUGIN_EVENT.
597 struct GNUNET_MessageHeader header;
600 * An `enum GNUNET_TRANSPORT_SessionState` in NBO.
602 uint16_t session_state GNUNET_PACKED;
605 * #GNUNET_YES if this is an inbound connection,
606 * #GNUNET_NO if this is an outbound connection,
607 * #GNUNET_SYSERR if connections of this plugin
608 * are so fundamentally bidirectional
609 * that they have no 'initiator'
610 * Value given in NBO.
612 int16_t is_inbound GNUNET_PACKED;
615 * Number of messages waiting transmission.
617 uint32_t msgs_pending GNUNET_PACKED;
620 * Number of bytes waiting for transmission.
622 uint32_t bytes_pending GNUNET_PACKED;
625 * When will this transport plugin session time out?
627 struct GNUNET_TIME_AbsoluteNBO timeout;
630 * Until how long is this plugin currently blocked from reading?
632 struct GNUNET_TIME_AbsoluteNBO delay;
635 * Which peer is this connection for?
637 struct GNUNET_PeerIdentity peer;
640 * Unique identifier for the session.
645 * Length of the plugin name in bytes, including 0-termination.
647 uint16_t plugin_name_len GNUNET_PACKED;
650 * Length of the plugin address in bytes.
652 uint16_t plugin_address_len GNUNET_PACKED;
654 /* followed by 0-terminated plugin name and
655 @e plugin_address_len bytes of plugin address */
660 /* *********************** TNG messages ***************** */
663 * Communicator goes online. Note which addresses it can
666 struct GNUNET_TRANSPORT_CommunicatorAvailableMessage {
668 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_NEW_COMMUNICATOR.
670 struct GNUNET_MessageHeader header;
673 * NBO encoding of `enum GNUNET_TRANSPORT_CommunicatorCharacteristics`
677 /* Followed by the address prefix of the communicator */
682 * Add address to the list.
684 struct GNUNET_TRANSPORT_AddAddressMessage {
686 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADD_ADDRESS.
688 struct GNUNET_MessageHeader header;
691 * Address identifier (used during deletion).
693 uint32_t aid GNUNET_PACKED;
696 * When does the address expire?
698 struct GNUNET_TIME_RelativeNBO expiration;
701 * An `enum GNUNET_NetworkType` in NBO.
705 /* followed by UTF-8 encoded, 0-terminated human-readable address */
710 * Remove address from the list.
712 struct GNUNET_TRANSPORT_DelAddressMessage {
714 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_DEL_ADDRESS.
716 struct GNUNET_MessageHeader header;
719 * Address identifier.
721 uint32_t aid GNUNET_PACKED;
726 * Inform transport about an incoming message.
728 struct GNUNET_TRANSPORT_IncomingMessage {
730 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_INCOMING_MSG.
732 struct GNUNET_MessageHeader header;
735 * Do we use flow control or not?
737 uint32_t fc_on GNUNET_PACKED;
740 * 64-bit number to identify the matching ACK.
742 uint64_t fc_id GNUNET_PACKED;
745 * How long does the communicator believe the address on which
746 * the message was received to remain valid?
748 struct GNUNET_TIME_RelativeNBO expected_address_validity;
753 struct GNUNET_PeerIdentity sender;
755 /* followed by the message */
760 * Transport informs us about being done with an incoming message.
761 * (only sent if fc_on was set).
763 struct GNUNET_TRANSPORT_IncomingMessageAck {
765 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_INCOMING_MSG_ACK.
767 struct GNUNET_MessageHeader header;
772 uint32_t reserved GNUNET_PACKED;
775 * Which message is being ACKed?
777 uint64_t fc_id GNUNET_PACKED;
780 * Sender identifier of the original message.
782 struct GNUNET_PeerIdentity sender;
787 * Add queue to the transport
789 struct GNUNET_TRANSPORT_AddQueueMessage {
791 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_SETUP.
793 struct GNUNET_MessageHeader header;
796 * Queue identifier (used to identify the queue).
798 uint32_t qid GNUNET_PACKED;
801 * Receiver that can be addressed via the queue.
803 struct GNUNET_PeerIdentity receiver;
806 * An `enum GNUNET_NetworkType` in NBO.
811 * Maximum transmission unit, in NBO. UINT32_MAX for unlimited.
816 * An `enum GNUNET_TRANSPORT_ConnectionStatus` in NBO.
820 /* followed by UTF-8 encoded, 0-terminated human-readable address */
825 * Remove queue, it is no longer available.
827 struct GNUNET_TRANSPORT_DelQueueMessage {
829 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_TEARDOWN.
831 struct GNUNET_MessageHeader header;
834 * Address identifier.
836 uint32_t qid GNUNET_PACKED;
839 * Receiver that can be addressed via the queue.
841 struct GNUNET_PeerIdentity receiver;
846 * Transport tells communicator that it wants a new queue.
848 struct GNUNET_TRANSPORT_CreateQueue {
850 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE.
852 struct GNUNET_MessageHeader header;
855 * Unique ID for the request.
857 uint32_t request_id GNUNET_PACKED;
860 * Receiver that can be addressed via the queue.
862 struct GNUNET_PeerIdentity receiver;
864 /* followed by UTF-8 encoded, 0-terminated human-readable address */
869 * Communicator tells transport how queue creation went down.
871 struct GNUNET_TRANSPORT_CreateQueueResponse {
873 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_OK or
874 * #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_FAIL.
876 struct GNUNET_MessageHeader header;
879 * Unique ID for the request.
881 uint32_t request_id GNUNET_PACKED;
886 * Inform communicator about transport's desire to send a message.
888 struct GNUNET_TRANSPORT_SendMessageTo {
890 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG.
892 struct GNUNET_MessageHeader header;
895 * Which queue should we use?
897 uint32_t qid GNUNET_PACKED;
900 * Message ID, used for flow control.
902 uint64_t mid GNUNET_PACKED;
905 * Receiver identifier.
907 struct GNUNET_PeerIdentity receiver;
909 /* followed by the message */
914 * Inform transport that message was sent.
916 struct GNUNET_TRANSPORT_SendMessageToAck {
918 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG_ACK.
920 struct GNUNET_MessageHeader header;
923 * Success (#GNUNET_OK), failure (#GNUNET_SYSERR).
925 uint32_t status GNUNET_PACKED;
928 * Message ID of the original message.
930 uint64_t mid GNUNET_PACKED;
933 * Receiver identifier.
935 struct GNUNET_PeerIdentity receiver;
940 * Message from communicator to transport service asking for
941 * transmission of a backchannel message with the given peer @e pid
944 struct GNUNET_TRANSPORT_CommunicatorBackchannel {
946 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_BACKCHANNEL
948 struct GNUNET_MessageHeader header;
951 * Always zero, for alignment.
958 struct GNUNET_PeerIdentity pid;
960 /* Followed by a `struct GNUNET_MessageHeader` with the encapsulated
961 message to the communicator */
963 /* Followed by the 0-terminated string specifying the desired
964 communicator at the target (@e pid) peer */
969 * Message from transport to communicator passing along a backchannel
970 * message from the given peer @e pid.
972 struct GNUNET_TRANSPORT_CommunicatorBackchannelIncoming {
975 * #GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_BACKCHANNEL_INCOMING
977 struct GNUNET_MessageHeader header;
980 * Always zero, for alignment.
987 struct GNUNET_PeerIdentity pid;
989 /* Followed by a `struct GNUNET_MessageHeader` with the encapsulated
990 message to the communicator */
995 * Request to start monitoring.
997 struct GNUNET_TRANSPORT_MonitorStart {
999 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_START.
1001 struct GNUNET_MessageHeader header;
1004 * #GNUNET_YES for one-shot montoring, #GNUNET_NO for continuous monitoring.
1009 * Target identifier to monitor, all zeros for "all peers".
1011 struct GNUNET_PeerIdentity peer;
1018 struct GNUNET_TRANSPORT_MonitorData {
1020 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_DATA.
1022 struct GNUNET_MessageHeader header;
1025 * Network type (an `enum GNUNET_NetworkType` in NBO).
1027 uint32_t nt GNUNET_PACKED;
1030 * Target identifier.
1032 struct GNUNET_PeerIdentity peer;
1035 * @deprecated To be discussed if we keep these...
1037 struct GNUNET_TIME_AbsoluteNBO last_validation;
1038 struct GNUNET_TIME_AbsoluteNBO valid_until;
1039 struct GNUNET_TIME_AbsoluteNBO next_validation;
1042 * Current round-trip time estimate.
1044 struct GNUNET_TIME_RelativeNBO rtt;
1047 * Connection status (in NBO).
1049 uint32_t cs GNUNET_PACKED;
1052 * Messages pending (in NBO).
1054 uint32_t num_msg_pending GNUNET_PACKED;
1057 * Bytes pending (in NBO).
1059 uint32_t num_bytes_pending GNUNET_PACKED;
1061 /* Followed by 0-terminated address of the peer */
1066 * Request to verify address.
1068 struct GNUNET_TRANSPORT_AddressToVerify {
1070 * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_CONSIDER_VERIFY.
1072 struct GNUNET_MessageHeader header;
1080 * Peer the address is from.
1082 struct GNUNET_PeerIdentity peer;
1084 /* followed by variable-size raw address */
1089 * Application client to TRANSPORT service: we would like to have
1090 * address suggestions for this peer.
1092 struct ExpressPreferenceMessage {
1094 * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST or
1095 * #GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST_CANCEL to stop
1098 struct GNUNET_MessageHeader header;
1101 * What type of performance preference does the client have?
1102 * A `enum GNUNET_MQ_PreferenceKind` in NBO.
1104 uint32_t pk GNUNET_PACKED;
1107 * Peer to get address suggestions for.
1109 struct GNUNET_PeerIdentity peer;
1112 * How much bandwidth in bytes/second does the application expect?
1114 struct GNUNET_BANDWIDTH_Value32NBO bw;
1119 * We got an address of another peer, TRANSPORT service
1120 * should validate it. There is no response.
1122 struct RequestHelloValidationMessage {
1124 * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_REQUEST_HELLO_VALIDATION.
1126 struct GNUNET_MessageHeader header;
1129 * What type of network does the other peer claim this is?
1130 * A `enum GNUNET_NetworkType` in NBO.
1132 uint32_t nt GNUNET_PACKED;
1135 * Peer to the address is presumably for.
1137 struct GNUNET_PeerIdentity peer;
1139 /* followed by 0-terminated address to validate */
1144 GNUNET_NETWORK_STRUCT_END
1146 /* end of transport.h */