From 333ed5b94540b68b9967885c215b57818f22fb79 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 29 Nov 2018 20:50:38 +0100 Subject: draft ATS API for TNG --- src/ats/ats2.h | 298 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 src/ats/ats2.h (limited to 'src/ats/ats2.h') diff --git a/src/ats/ats2.h b/src/ats/ats2.h new file mode 100644 index 000000000..883ac7c38 --- /dev/null +++ b/src/ats/ats2.h @@ -0,0 +1,298 @@ +/* + This file is part of GNUnet. + Copyright (C) 2010-2015 GNUnet e.V. + + GNUnet is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + or (at your option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/** + * @file ats/ats.h + * @brief automatic transport selection messages + * @author Christian Grothoff + * @author Matthias Wachs + */ +#ifndef ATS_H +#define ATS_H + +#include "gnunet_util_lib.h" +#include "gnunet_ats_transport_service.h" + + +GNUNET_NETWORK_STRUCT_BEGIN + + +/** + * ATS performance characteristics for an address. + */ +struct PropertiesNBO +{ + + /** + * Delay. Time between when the time packet is sent and the packet + * arrives. FOREVER if we did not (successfully) measure yet. + */ + struct GNUNET_TIME_RelativeNBO delay; + + /** + * Confirmed successful payload on this connection from this peer to + * the other peer. In NBO. + * + * Unit: [bytes/second] + */ + uint32_t goodput_out; + + /** + * Confirmed useful payload on this connection to this peer from + * the other peer. In NBO. + * + * Unit: [bytes/second] + */ + uint32_t goodput_in; + + /** + * Actual traffic on this connection from this peer to the other peer. + * Includes transport overhead. In NBO. + * + * Unit: [bytes/second] + */ + uint32_t utilization_out; + + /** + * Actual traffic on this connection from the other peer to this peer. + * Includes transport overhead. In NBO. + * + * Unit: [bytes/second] + */ + uint32_t utilization_in; + + /** + * Distance on network layer (required for distance-vector routing) + * in hops. Zero for direct connections (i.e. plain TCP/UDP). In NBO. + */ + uint32_t distance; + + /** + * MTU of the network layer, UINT32_MAX for no MTU (stream). + * + * Unit: [bytes]. In NBO. + */ + uint32_t mtu; + + /** + * Which network scope does the respective address belong to? + * A `enum GNUNET_NetworkType nt` in NBO. + */ + uint32_t nt; + + /** + * What characteristics does this communicator have? + * A `enum GNUNET_TRANSPORT_CommunicatorCharacteristics` in NBO. + */ + uint32_t cc; + +}; + + +/** + * Application client to ATS service: we would like to have + * address suggestions for this peer. + */ +struct ExpressPreferenceMessage +{ + /** + * Type is #GNUNET_MESSAGE_TYPE_ATS_SUGGEST or + * #GNUNET_MESSAGE_TYPE_ATS_SUGGEST_CANCEL to stop + * suggestions. + */ + struct GNUNET_MessageHeader header; + + /** + * What type of performance preference does the client have? + */ + uint32_t pk GNUNET_PACKED; + + /** + * Peer to get address suggestions for. + */ + struct GNUNET_PeerIdentity peer; + + /** + * How much bandwidth in bytes/second does the application expect? + */ + struct GNUNET_BANDWIDTH_Value32NBO bw; + +}; + + +/** + * Transport client to ATS service: here is another session you can use. + */ +struct SessionAddMessage +{ + /** + * Type is #GNUNET_MESSAGE_TYPE_ATS_SESSION_ADD or + * #GNUNET_MESSAGE_TYPE_ATS_SESSION_ADD_INBOUND_ONLY + */ + struct GNUNET_MessageHeader header; + + /** + * Internal number this client will henceforth use to + * refer to this session. + */ + uint32_t session_id GNUNET_PACKED; + + /** + * Identity of the peer that this session is for. + */ + struct GNUNET_PeerIdentity peer; + + /** + * Performance properties of the session. + */ + struct PropertiesNBO properties; + + /* followed by: + * - char * address (including '\0'-termination). + */ + +}; + + +/** + * Message used to notify ATS that the performance + * characteristics for an session have changed. + */ +struct SessionUpdateMessage +{ + /** + * Message of type #GNUNET_MESSAGE_TYPE_ATS_SESSION_UPDATE. + */ + struct GNUNET_MessageHeader header; + + /** + * Internal number this client uses to refer to this session. + */ + uint32_t session_id GNUNET_PACKED; + + /** + * Which peer is this about? (Technically redundant, as the + * @e session_id should be sufficient, but enables ATS service + * to find the session faster). + */ + struct GNUNET_PeerIdentity peer; + + /** + * Performance properties of the session. + */ + struct PropertiesNBO properties; + +}; + + +/** + * Message sent by ATS client to ATS service when an session + * was destroyed and must thus henceforth no longer be considered + * for scheduling. + */ +struct SessionDelMessage +{ + /** + * Type is #GNUNET_MESSAGE_TYPE_ATS_SESSION_DEL. + */ + struct GNUNET_MessageHeader header; + + /** + * Internal number this client uses to refer to this session. + */ + uint32_t session_id GNUNET_PACKED; + + /** + * Which peer is this about? (Technically redundant, as the + * @e session_id should be sufficient, but enables ATS service + * to find the session faster). + */ + struct GNUNET_PeerIdentity peer; + +}; + + +/** + * ATS Service allocates resources to an session + * identified by the given @e session_id for the given @e peer with + * the given @e bandwidth_in and @e bandwidth_out limits from now on. + */ +struct SessionAllocationMessage +{ + /** + * A message of type #GNUNET_MESSAGE_TYPE_ATS_SESSION_ALLOCATION. + */ + struct GNUNET_MessageHeader header; + + /** + * Internal number this client uses to refer to the session this + * suggestion is about. + */ + uint32_t session_id GNUNET_PACKED; + + /** + * Which peer is this about? (Technically redundant, as the + * @e session_id should be sufficient, but may enable client + * to find the session faster and/or check consistency). + */ + struct GNUNET_PeerIdentity peer; + + /** + * How much bandwidth we are allowed for sending. + */ + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out; + + /** + * How much bandwidth we are allowed for receiving. + */ + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in; + +}; + + +/** + * ATS Service suggests to the transport service to try the address + * for the given @e peer. + */ +struct AddressSuggestionMessage +{ + /** + * A message of type #GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION. + */ + struct GNUNET_MessageHeader header; + + /** + * Zero. + */ + uint32_t reserved GNUNET_PACKED; + + /** + * Which peer is this about? (Technically redundant, as the + * @e session_id should be sufficient, but may enable client + * to find the session faster and/or check consistency). + */ + struct GNUNET_PeerIdentity peer; + + /* Followed by 0-terminated address */ +}; + + +GNUNET_NETWORK_STRUCT_END + + + +#endif -- cgit v1.2.3