aboutsummaryrefslogtreecommitdiff
path: root/src/ats/ats_api.h
blob: a1060781763521436cf451f4426ab818e3f3e0fb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
     This file is part of GNUnet.
     (C) 2010,2011 Christian Grothoff (and other contributing authors)

     GNUnet is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published
     by the Free Software Foundation; either version 3, 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
     General Public License for more details.

     You should have received a copy of the GNU General Public License
     along with GNUnet; see the file COPYING.  If not, write to the
     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.
*/
/**
 * @file ats/ats_api.h
 * @brief automatic transport selection API common includes
 * @author Christian Grothoff
 * @author Matthias Wachs
 */
#ifndef ATS_API_H
#define ATS_API_H

#include "gnunet_util_lib.h"

/**
 * Allocation record for a peer's address.
 */
struct AllocationRecord
{

  /**
   * Performance information associated with this address (array).
   */
  struct GNUNET_ATS_Information *ats;

  /**
   * Name of the plugin
   */
  char *plugin_name;

  /**
   * Address this record represents, allocated at the end of this struct.
   */
  const void *plugin_addr;

  /**
   * Session associated with this record.
   */
  struct Session *session;

  /**
   * Number of bytes in plugin_addr.
   */
  size_t plugin_addr_len;

  /**
   * Number of entries in 'ats'.
   */
  uint32_t ats_count;

  /**
   * Inbound bandwidth assigned to this address right now, 0 for none.
   */
  struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in;

  /**
   * Outbound bandwidth assigned to this address right now, 0 for none.
   */
  struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out;

  /**
   * Tracking bandwidth for receiving from this peer.  Used for
   * applications that want to 'reserve' bandwidth for replies.
   */
  struct GNUNET_BANDWIDTH_Tracker available_recv_window;

  /**
   * Set to GNUNET_YES if this is the connected address of a connected peer.
   */
  int connected;

};


/**
 * Handle to the ATS subsystem.
 */
struct GNUNET_ATS_SchedulingHandle
{
  /**
   * Configuration.
   */
  const struct GNUNET_CONFIGURATION_Handle *cfg;

  /**
   * Function to call when the allocation changes.
   */
  GNUNET_ATS_AddressSuggestionCallback alloc_cb;

  /**
   * Closure for 'alloc_cb'.
   */
  void *alloc_cb_cls;

  /**
   * Information about all connected peers.  Maps peer identities
   * to one or more 'struct AllocationRecord' values.
   */
  struct GNUNET_CONTAINER_MultiHashMap *peers;

  /**
   * Map of PeerIdentities to 'struct GNUNET_ATS_SuggestionContext's.
   */
  struct GNUNET_CONTAINER_MultiHashMap *notify_map;

  /**
   * Task scheduled to update our bandwidth assignment.
   */
  GNUNET_SCHEDULER_TaskIdentifier ba_task;

  /**
   * Total inbound bandwidth per configuration.
   */
  unsigned long long total_bps_in;

  /**
   * Total outbound bandwidth per configuration.
   */
  unsigned long long total_bps_out;
};

#endif