GNUnet  0.20.0
gnunet-service-ats_scheduling.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2011-2016 GNUnet e.V.
4 
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.
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  Affero General Public License for more details.
14 
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/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
27 #include "platform.h"
30 #include "ats.h"
31 
36 
37 
44 int
46 {
47  if (NULL != my_client)
48  {
50  "This ATS already has a scheduling client, refusing new scheduling client for now.\n");
51  return GNUNET_SYSERR;
52  }
53  my_client = client;
54  return GNUNET_OK;
55 }
56 
57 
64 void
66 {
67  if (my_client != client)
68  return;
70  my_client = NULL;
71 }
72 
73 
74 void
77  uint32_t session_id,
79  bandwidth_out,
81  bandwidth_in)
82 {
83  struct GNUNET_MQ_Envelope *env;
85 
86  if (NULL == my_client)
87  return;
89  "# address suggestions made",
90  1,
91  GNUNET_NO);
94  msg->peer = *peer;
95  msg->session_id = htonl (session_id);
96  msg->bandwidth_out = bandwidth_out;
97  msg->bandwidth_in = bandwidth_in;
99  "ATS sends quota for peer `%s': (in/out) %u/%u\n",
100  GNUNET_i2s (peer),
101  (unsigned int) ntohl (bandwidth_in.value__),
102  (unsigned int) ntohl (bandwidth_out.value__));
104  env);
105 }
106 
107 
108 void
110 {
111  const char *address;
112  const char *plugin_name;
113  uint16_t address_length;
114  uint16_t plugin_name_length;
115  struct GNUNET_ATS_Properties prop;
116 
118  "Received `%s' message\n",
119  "ADDRESS_ADD");
120  address_length = ntohs (m->address_length);
121  plugin_name_length = ntohs (m->plugin_name_length);
122  address = (const char *) &m[1];
123  if (plugin_name_length != 0)
124  plugin_name = &address[address_length];
125  else
126  plugin_name = "";
128  "# addresses created",
129  1,
130  GNUNET_NO);
132  &m->properties);
134  GAS_addresses_add (&m->peer,
135  plugin_name,
136  address,
137  address_length,
138  ntohl (m->address_local_info),
139  ntohl (m->session_id),
140  &prop);
141 }
142 
143 
149 void
151 {
152  struct GNUNET_ATS_Properties prop;
153 
155  "# address updates received",
156  1,
157  GNUNET_NO);
159  &m->properties);
160  GAS_addresses_update (&m->peer,
161  ntohl (m->session_id),
162  &prop);
163 }
164 
165 
171 void
173 {
174  struct GNUNET_MQ_Envelope *env;
176 
178  "Received `%s' message\n",
179  "ADDRESS_DESTROYED");
181  "# addresses destroyed",
182  1,
183  GNUNET_NO);
184  GAS_addresses_destroy (&m->peer,
185  ntohl (m->session_id));
186  env = GNUNET_MQ_msg (srm,
188  srm->session_id = m->session_id;
189  srm->peer = m->peer;
191  env);
192 }
193 
194 
195 /* end of gnunet-service-ats_scheduling.c */
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
automatic transport selection messages
static struct GNUNET_ARM_MonitorHandle * m
Monitor connection with ARM.
Definition: gnunet-arm.c:104
struct GNUNET_STATISTICS_Handle * GSA_stats
Handle for statistics.
static struct GNUNET_HashCode session_id
static char * address
GNS address for this phone.
void GAS_addresses_destroy(const struct GNUNET_PeerIdentity *peer, uint32_t session_id)
Remove an address for a peer.
void GAS_addresses_update(const struct GNUNET_PeerIdentity *peer, uint32_t session_id, const struct GNUNET_ATS_Properties *prop)
Update an address with new performance information for a peer.
void GAS_addresses_destroy_all()
Remove all addresses.
void GAS_addresses_add(const struct GNUNET_PeerIdentity *peer, const char *plugin_name, const void *plugin_addr, size_t plugin_addr_len, uint32_t local_address_info, uint32_t session_id, const struct GNUNET_ATS_Properties *prop)
Add a new address for a peer.
ats service address management
void GAS_handle_address_add(const struct AddressAddMessage *m)
Handle 'address add' messages from clients.
void GAS_scheduling_transmit_address_suggestion(const struct GNUNET_PeerIdentity *peer, uint32_t session_id, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
Transmit the given address suggestion and bandwidth update to all scheduling clients.
void GAS_handle_address_update(const struct AddressUpdateMessage *m)
Handle 'address update' messages from clients.
void GAS_handle_address_destroyed(const struct AddressDestroyedMessage *m)
Handle 'address destroyed' messages from clients.
static struct GNUNET_SERVICE_Client * my_client
Actual handle to the client.
void GAS_scheduling_remove_client(struct GNUNET_SERVICE_Client *client)
Unregister a client (which may have been a scheduling client, but this is not assured).
int GAS_scheduling_add_client(struct GNUNET_SERVICE_Client *client)
Register a new scheduling client.
ats service, interaction with 'scheduling' API
static char * plugin_name
Name of our plugin.
void GNUNET_ATS_properties_ntoh(struct GNUNET_ATS_Properties *hbo, const struct GNUNET_ATS_PropertiesNBO *nbo)
Convert ATS properties from network to host byte order.
#define GNUNET_log(kind,...)
@ GNUNET_OK
@ GNUNET_NO
@ GNUNET_SYSERR
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_DEBUG
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:304
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:78
@ GNUNET_NT_UNSPECIFIED
Category of last resort.
Definition: gnunet_nt_lib.h:43
#define GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION
Type of the 'struct AddressSuggestionMessage' sent by ATS to clients to suggest switching to a differ...
#define GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE
Type of the 'struct SessionReleaseMessage' sent by ATS to client to confirm that a session ID was des...
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2443
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
Scheduling client to ATS service: here is another address you can use.
Definition: ats.h:112
Message sent by ATS client to ATS service when an address was destroyed and must thus henceforth no l...
Definition: ats.h:193
ATS Service suggests to the transport service to use the address identified by the given session_id f...
Definition: ats.h:244
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in
How much bandwidth we are allowed for receiving.
Definition: ats.h:271
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out
How much bandwidth we are allowed for sending.
Definition: ats.h:266
Message used to notify ATS that the performance characteristics for an address have changed.
Definition: ats.h:162
ATS performance characteristics for an address.
enum GNUNET_NetworkType scope
Which network scope does the respective address belong to? This property does not change.
Message sent by ATS service to client to confirm that it is done using the given session ID.
Definition: ats.h:218
struct GNUNET_PeerIdentity peer
Which peer is this about? (Technically redundant, as the session_id should be sufficient,...
Definition: ats.h:234
uint32_t session_id
Number the client used to identify the session.
Definition: ats.h:227
32-bit bandwidth used for network exchange by GNUnet, in bytes per second.
uint32_t value__
The actual value (bytes per second).
The identity of the host (wraps the signing key of the peer).
Handle to a client that is connected to a service.
Definition: service.c:252
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.