GNUnet  0.10.x
Data Structures | Enumerations | Functions | Variables
gnunet-service-ats-new.c File Reference

ats service More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_statistics_service.h"
#include "gnunet_ats_plugin_new.h"
#include "ats2.h"
Include dependency graph for gnunet-service-ats-new.c:

Go to the source code of this file.

Data Structures

struct  ClientPreference
 Preferences expressed by a client are kept in a DLL per client. More...
 
struct  GNUNET_ATS_Session
 Information about ongoing sessions of the transport client. More...
 
struct  Client
 Information we track per client. More...
 

Enumerations

enum  ClientType {
  CT_NONE = 0, CT_TRANSPORT, CT_APPLICATION, CT_NONE = 0,
  CT_CORE = 1, CT_MONITOR = 2, CT_COMMUNICATOR = 3, CT_APPLICATION = 4,
  CT_NONE = 0, CT_CORE = 1, CT_MONITOR = 2, CT_BLACKLIST = 3,
  CT_CORE_NO_HANDLERS = 4
}
 What type of client is this client? More...
 

Functions

static void suggest_cb (void *cls, const struct GNUNET_PeerIdentity *pid, const char *address)
 Function called by the solver to prompt the transport to try out a new address. More...
 
static void allocate_cb (void *cls, struct GNUNET_ATS_Session *session, const struct GNUNET_PeerIdentity *peer, struct GNUNET_BANDWIDTH_Value32NBO bw_in, struct GNUNET_BANDWIDTH_Value32NBO bw_out)
 Function called by the solver to tell the transpor to allocate bandwidth for the specified session. More...
 
static void prop_ntoh (const struct PropertiesNBO *properties, struct GNUNET_ATS_Properties *prop)
 Convert properties to prop. More...
 
static void handle_suggest (void *cls, const struct ExpressPreferenceMessage *msg)
 We have received a struct ExpressPreferenceMessage from an application client. More...
 
static void handle_suggest_cancel (void *cls, const struct ExpressPreferenceMessage *msg)
 We have received a struct ExpressPreferenceMessage from an application client. More...
 
static void handle_start (void *cls, const struct GNUNET_MessageHeader *hdr)
 Handle 'start' messages from transport clients. More...
 
static int check_session_add (void *cls, const struct SessionAddMessage *message)
 Check 'session_add' message is well-formed and comes from a transport client. More...
 
static void handle_session_add (void *cls, const struct SessionAddMessage *message)
 Handle 'session add' messages from transport clients. More...
 
static void handle_session_update (void *cls, const struct SessionUpdateMessage *msg)
 Handle 'session update' messages from transport clients. More...
 
static void handle_session_del (void *cls, const struct SessionDelMessage *message)
 Handle 'session delete' messages from transport clients. More...
 
static void * client_connect_cb (void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
 A client connected to us. More...
 
static int free_session (void *cls, uint32_t key, void *value)
 Function called on each session to release associated state on transport disconnect. More...
 
static void client_disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *client, void *app_ctx)
 A client disconnected from us. More...
 
static void final_cleanup (void *cls)
 Task run at the end during shutdown. More...
 
static void cleanup_task (void *cls)
 Task run during shutdown. More...
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_SERVICE_Handle *service)
 Process template requests. More...
 
 GNUNET_SERVICE_MAIN ("ats", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_fixed_size(suggest, GNUNET_MESSAGE_TYPE_ATS_SUGGEST, struct ExpressPreferenceMessage, NULL), GNUNET_MQ_hd_fixed_size(suggest_cancel, GNUNET_MESSAGE_TYPE_ATS_SUGGEST_CANCEL, struct ExpressPreferenceMessage, NULL), GNUNET_MQ_hd_fixed_size(start, GNUNET_MESSAGE_TYPE_ATS_START, struct GNUNET_MessageHeader, NULL), GNUNET_MQ_hd_var_size(session_add, GNUNET_MESSAGE_TYPE_ATS_SESSION_ADD, struct SessionAddMessage, NULL), GNUNET_MQ_hd_var_size(session_add, GNUNET_MESSAGE_TYPE_ATS_SESSION_ADD_INBOUND_ONLY, struct SessionAddMessage, NULL), GNUNET_MQ_hd_fixed_size(session_update, GNUNET_MESSAGE_TYPE_ATS_SESSION_UPDATE, struct SessionUpdateMessage, NULL), GNUNET_MQ_hd_fixed_size(session_del, GNUNET_MESSAGE_TYPE_ATS_SESSION_DEL, struct SessionDelMessage, NULL), GNUNET_MQ_handler_end())
 Define "main" method using service macro. More...
 

Variables

static struct GNUNET_STATISTICS_Handlestats
 Handle for statistics. More...
 
static struct GNUNET_ATS_SolverFunctionsplugin
 Our solver. More...
 
static char * plugin_name
 Solver plugin name as string. More...
 
static struct Clienttransport_client
 The transport client (there can only be one at a time). More...
 

Detailed Description

ats service

Author
Matthias Wachs
Christian Grothoff

Definition in file gnunet-service-ats-new.c.

Enumeration Type Documentation

◆ ClientType

enum ClientType

What type of client is this client?

Enumerator
CT_NONE 

We don't know yet.

CT_TRANSPORT 

Transport service.

CT_APPLICATION 

Application.

CT_NONE 

We do not know yet (client is fresh).

CT_CORE 

Is the CORE service, we need to forward traffic to it.

CT_MONITOR 

It is a monitor, forward monitor data.

CT_COMMUNICATOR 

It is a communicator, use for communication.

CT_APPLICATION 

"Application" telling us where to connect (i.e.

TOPOLOGY, DHT or CADET).

CT_NONE 

We do not know yet (client is fresh).

CT_CORE 

Is the CORE service, we need to forward traffic to it.

CT_MONITOR 

It is a monitor, forward monitor data.

CT_BLACKLIST 

It is a blacklist, query about allowed connections.

CT_CORE_NO_HANDLERS 

CORE client without any handlers.

Definition at line 36 of file gnunet-service-ats-new.c.

37 {
41  CT_NONE = 0,
42 
47 
52 };
We don't know yet.
Transport service.

Function Documentation

◆ suggest_cb()

static void suggest_cb ( void *  cls,
const struct GNUNET_PeerIdentity pid,
const char *  address 
)
static

Function called by the solver to prompt the transport to try out a new address.

Parameters
clsclosure, NULL
pidpeer this is about
addressaddress the transport should try

Definition at line 198 of file gnunet-service-ats-new.c.

References env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), Client::mq, AddressSuggestionMessage::peer, and pid.

Referenced by GNUNET_ATS_scheduling_init(), GNUNET_ATS_transport_init(), and run().

201 {
202  struct GNUNET_MQ_Envelope *env;
203  size_t slen = strlen (address) + 1;
204  struct AddressSuggestionMessage *as;
205 
206  if (NULL == transport_client)
207  {
208  // FIXME: stats!
209  return;
210  }
212  "Suggesting address `%s' of peer `%s'\n",
213  address,
214  GNUNET_i2s (pid));
215  env = GNUNET_MQ_msg_extra (as,
216  slen,
218  as->peer = *pid;
219  memcpy (&as[1],
220  address,
221  slen);
223  env);
224 }
struct GNUNET_MQ_Handle * mq
Message queue to talk to the client.
#define GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION
Type of the 'struct AddressSuggestionMessage' sent by ATS to clients to suggest switching to a differ...
static struct Client * transport_client
The transport client (there can only be one at a time).
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
ATS Service suggests to the transport service to use the address identified by the given session_id f...
Definition: ats.h:244
#define GNUNET_log(kind,...)
struct GNUNET_PeerIdentity peer
Which peer is this about? (Technically redundant, as the session_id should be sufficient, but may enable client to find the session faster and/or check consistency).
Definition: ats.h:262
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:353
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
static char * address
GNS address for this phone.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
Here is the call graph for this function:
Here is the caller graph for this function:

◆ allocate_cb()

static void allocate_cb ( void *  cls,
struct GNUNET_ATS_Session session,
const struct GNUNET_PeerIdentity peer,
struct GNUNET_BANDWIDTH_Value32NBO  bw_in,
struct GNUNET_BANDWIDTH_Value32NBO  bw_out 
)
static

Function called by the solver to tell the transpor to allocate bandwidth for the specified session.

Parameters
clsclosure, NULL
sessionsession this is about
peerpeer this is about
bw_insuggested bandwidth for receiving
bw_outsuggested bandwidth for transmission

Definition at line 238 of file gnunet-service-ats-new.c.

References SessionAllocationMessage::bandwidth_in, SessionAllocationMessage::bandwidth_out, GNUNET_ATS_Session::client, env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_MESSAGE_TYPE_ATS_SESSION_ALLOCATION, GNUNET_MQ_msg, GNUNET_MQ_send(), Client::mq, peer, SessionAllocationMessage::peer, GNUNET_ATS_Session::session_id, SessionAllocationMessage::session_id, transport_client, and GNUNET_BANDWIDTH_Value32NBO::value__.

Referenced by run().

243 {
244  struct GNUNET_MQ_Envelope *env;
245  struct SessionAllocationMessage *sam;
246 
247  (void) cls;
248  if ((NULL == transport_client) ||
249  (session->client != transport_client))
250  {
251  /* transport must have just died and solver is addressing the
252  losses of sessions (possibly of previous transport), ignore! */
253  return;
254  }
256  "Allocating %u/%u bytes for %p of peer `%s'\n",
257  ntohl (bw_in.value__),
258  ntohl (bw_out.value__),
259  session,
260  GNUNET_i2s (peer));
261  env = GNUNET_MQ_msg (sam,
263  sam->session_id = session->session_id;
264  sam->peer = *peer;
265  sam->bandwidth_in = bw_in;
266  sam->bandwidth_out = bw_out;
268  env);
269 }
struct GNUNET_PeerIdentity peer
Which peer is this about? (Technically redundant, as the session_id should be sufficient, but may enable client to find the session faster and/or check consistency).
Definition: ats2.h:249
uint32_t session_id
Unique ID for the session when talking with the client.
struct GNUNET_MQ_Handle * mq
Message queue to talk to the client.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
static struct Client * transport_client
The transport client (there can only be one at a time).
#define GNUNET_MESSAGE_TYPE_ATS_SESSION_ALLOCATION
Type of the 'struct SessionAllocationMessage' send by ATS to the transport to tell it about resources...
uint32_t value__
The actual value (bytes per second).
ATS Service allocates resources to an session identified by the given session_id for the given peer w...
Definition: ats2.h:231
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out
How much bandwidth we are allowed for sending.
Definition: ats2.h:254
uint32_t session_id
Internal number this client uses to refer to the session this suggestion is about.
Definition: ats2.h:242
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
#define GNUNET_log(kind,...)
struct Client * client
The transport client that provided the session.
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:353
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in
How much bandwidth we are allowed for receiving.
Definition: ats2.h:259
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
Here is the call graph for this function:
Here is the caller graph for this function:

◆ prop_ntoh()

static void prop_ntoh ( const struct PropertiesNBO properties,
struct GNUNET_ATS_Properties prop 
)
static

Convert properties to prop.

Parameters
propertiesin NBO
prop[out]in HBO

Definition at line 279 of file gnunet-service-ats-new.c.

References GNUNET_ATS_Properties::cc, PropertiesNBO::cc, PropertiesNBO::delay, GNUNET_ATS_Properties::delay, PropertiesNBO::distance, GNUNET_ATS_Properties::distance, GNUNET_TIME_relative_ntoh(), PropertiesNBO::goodput_in, GNUNET_ATS_Properties::goodput_in, PropertiesNBO::goodput_out, GNUNET_ATS_Properties::goodput_out, PropertiesNBO::mtu, GNUNET_ATS_Properties::mtu, PropertiesNBO::nt, GNUNET_ATS_Properties::nt, PropertiesNBO::utilization_in, GNUNET_ATS_Properties::utilization_in, PropertiesNBO::utilization_out, and GNUNET_ATS_Properties::utilization_out.

Referenced by handle_session_add(), and handle_session_update().

281 {
282  prop->delay = GNUNET_TIME_relative_ntoh (properties->delay);
283  prop->goodput_out = ntohl (properties->goodput_out);
284  prop->goodput_in = ntohl (properties->goodput_in);
285  prop->utilization_out = ntohl (properties->utilization_out);
286  prop->utilization_in = ntohl (properties->utilization_in);
287  prop->distance = ntohl (properties->distance);
288  prop->mtu = ntohl (properties->mtu);
289  prop->nt = (enum GNUNET_NetworkType) ntohl (properties->nt);
290  prop->cc = (enum GNUNET_TRANSPORT_CommunicatorCharacteristics) ntohl (
291  properties->cc);
292 }
GNUNET_TRANSPORT_CommunicatorCharacteristics
What characteristics does this communicator have?
uint32_t cc
What characteristics does this communicator have? A enum GNUNET_TRANSPORT_CommunicatorCharacteristics...
Definition: ats2.h:102
uint32_t utilization_in
Actual traffic on this connection from the other peer to this peer.
Definition: ats2.h:77
uint32_t goodput_out
Confirmed successful payload on this connection from this peer to the other peer. ...
uint32_t utilization_in
Actual traffic on this connection from the other peer to this peer.
enum GNUNET_TRANSPORT_CommunicatorCharacteristics cc
What characteristics does this communicator have?
uint32_t goodput_out
Confirmed successful payload on this connection from this peer to the other peer. ...
Definition: ats2.h:53
GNUNET_NetworkType
Types of networks (with separate quotas) we support.
Definition: gnunet_nt_lib.h:35
uint32_t utilization_out
Actual traffic on this connection from this peer to the other peer.
Definition: ats2.h:69
uint32_t mtu
MTU of the network layer, UINT32_MAX for no MTU (stream).
Definition: ats2.h:90
uint32_t distance
Distance on network layer (required for distance-vector routing) in hops.
Definition: ats2.h:83
struct GNUNET_TIME_Relative delay
Delay.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_ntoh(struct GNUNET_TIME_RelativeNBO a)
Convert relative time from network byte order.
Definition: time.c:639
uint32_t goodput_in
Confirmed useful payload on this connection to this peer from the other peer.
uint32_t mtu
MTU of the network layer, UINT32_MAX for no MTU (stream).
uint32_t nt
Which network scope does the respective address belong to? A enum GNUNET_NetworkType nt in NBO...
Definition: ats2.h:96
enum GNUNET_NetworkType nt
Which network scope does the respective address belong to?
struct GNUNET_TIME_RelativeNBO delay
Delay.
Definition: ats2.h:45
uint32_t goodput_in
Confirmed useful payload on this connection to this peer from the other peer.
Definition: ats2.h:61
unsigned int distance
Distance on network layer (required for distance-vector routing) in hops.
uint32_t utilization_out
Actual traffic on this connection from this peer to the other peer.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_suggest()

static void handle_suggest ( void *  cls,
const struct ExpressPreferenceMessage msg 
)
static

We have received a struct ExpressPreferenceMessage from an application client.

Parameters
clshandle to the client
msgthe start message

Definition at line 302 of file gnunet-service-ats-new.c.

References Client::application, ExpressPreferenceMessage::bw, GNUNET_ATS_Preference::bw, ClientPreference::client, Client::client, GNUNET_ATS_SolverFunctions::cls, CT_APPLICATION, CT_NONE, Client::details, GNUNET_break, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_new, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), ExpressPreferenceMessage::peer, GNUNET_ATS_Preference::peer, ClientPreference::ph, ExpressPreferenceMessage::pk, GNUNET_ATS_Preference::pk, ClientPreference::pref, GNUNET_ATS_SolverFunctions::preference_add, Client::type, and GNUNET_BANDWIDTH_Value32NBO::value__.

304 {
305  struct Client *c = cls;
306  struct ClientPreference *cp;
307 
308  if (CT_NONE == c->type)
309  c->type = CT_APPLICATION;
310  if (CT_APPLICATION != c->type)
311  {
312  GNUNET_break (0);
314  return;
315  }
317  "Client suggested we talk to %s with preference %d at rate %u\n",
318  GNUNET_i2s (&msg->peer),
319  (int) ntohl (msg->pk),
320  (int) ntohl (msg->bw.value__));
321  cp = GNUNET_new (struct ClientPreference);
322  cp->client = c;
323  cp->pref.peer = msg->peer;
324  cp->pref.bw = msg->bw;
325  cp->pref.pk = (enum GNUNET_MQ_PreferenceKind) ntohl (msg->pk);
326  cp->ph = plugin->preference_add (plugin->cls,
327  &cp->pref);
329  c->details.application.cp_tail,
330  cp);
332 }
Information we track per client.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
We don't know yet.
struct GNUNET_SERVICE_Client * client
Service handle of the client.
enum GNUNET_MQ_PreferenceKind pk
What type of performance preference does the client have?
struct Client * client
Which client expressed the preference?
#define GNUNET_new(type)
Allocate a struct or union of the given type.
Preferences expressed by a client are kept in a DLL per client.
struct Client::@0::@1 application
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
uint32_t value__
The actual value (bytes per second).
uint32_t pk
What type of performance preference does the client have? A enum GNUNET_MQ_PreferenceKind in NBO...
Definition: ats2.h:123
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
GNUNET_MQ_PreferenceKind
Enum defining all known preference categories.
struct GNUNET_ATS_PreferenceHandle *(* preference_add)(void *cls, const struct GNUNET_ATS_Preference *pref)
The plugin should begin to respect a new preference.
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2324
struct GNUNET_BANDWIDTH_Value32NBO bw
How much bandwidth in bytes/second does the application expect?
void * cls
Closure to pass to all solver functions in this struct.
enum ClientType type
Type of the client, initially CT_NONE.
struct GNUNET_ATS_Preference pref
Details about the preference.
struct GNUNET_ATS_PreferenceHandle * ph
Plugin's representation of the preference.
#define GNUNET_log(kind,...)
union Client::@0 details
Details depending on type.
struct GNUNET_PeerIdentity peer
Peer to get address suggestions for.
struct GNUNET_BANDWIDTH_Value32NBO bw
How much bandwidth in bytes/second does the application expect?
Definition: ats2.h:133
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2243
struct GNUNET_PeerIdentity peer
Peer to get address suggestions for.
Definition: ats2.h:128
Here is the call graph for this function:

◆ handle_suggest_cancel()

static void handle_suggest_cancel ( void *  cls,
const struct ExpressPreferenceMessage msg 
)
static

We have received a struct ExpressPreferenceMessage from an application client.

Parameters
clshandle to the client
msgthe start message

Definition at line 342 of file gnunet-service-ats-new.c.

References Client::application, ExpressPreferenceMessage::bw, GNUNET_ATS_Preference::bw, Client::client, GNUNET_ATS_SolverFunctions::cls, CT_APPLICATION, CT_NONE, Client::details, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_memcmp, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), ClientPreference::next, ExpressPreferenceMessage::peer, GNUNET_ATS_Preference::peer, ClientPreference::ph, ExpressPreferenceMessage::pk, GNUNET_ATS_Preference::pk, ClientPreference::pref, GNUNET_ATS_SolverFunctions::preference_del, Client::type, and GNUNET_BANDWIDTH_Value32NBO::value__.

344 {
345  struct Client *c = cls;
346  struct ClientPreference *cp;
347 
348  if (CT_NONE == c->type)
349  c->type = CT_APPLICATION;
350  if (CT_APPLICATION != c->type)
351  {
352  GNUNET_break (0);
354  return;
355  }
356  for (cp = c->details.application.cp_head;
357  NULL != cp;
358  cp = cp->next)
359  if ((cp->pref.pk == (enum GNUNET_MQ_PreferenceKind) ntohl (msg->pk)) &&
360  (cp->pref.bw.value__ == msg->bw.value__) &&
361  (0 == GNUNET_memcmp (&cp->pref.peer,
362  &msg->peer)))
363  break;
364  if (NULL == cp)
365  {
366  GNUNET_break (0);
368  return;
369  }
371  cp->ph,
372  &cp->pref);
374  c->details.application.cp_tail,
375  cp);
376  GNUNET_free (cp);
378 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
Information we track per client.
We don't know yet.
struct GNUNET_SERVICE_Client * client
Service handle of the client.
enum GNUNET_MQ_PreferenceKind pk
What type of performance preference does the client have?
Preferences expressed by a client are kept in a DLL per client.
struct Client::@0::@1 application
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
uint32_t value__
The actual value (bytes per second).
uint32_t pk
What type of performance preference does the client have? A enum GNUNET_MQ_PreferenceKind in NBO...
Definition: ats2.h:123
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
GNUNET_MQ_PreferenceKind
Enum defining all known preference categories.
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2324
struct GNUNET_BANDWIDTH_Value32NBO bw
How much bandwidth in bytes/second does the application expect?
void * cls
Closure to pass to all solver functions in this struct.
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
enum ClientType type
Type of the client, initially CT_NONE.
struct GNUNET_ATS_Preference pref
Details about the preference.
struct GNUNET_ATS_PreferenceHandle * ph
Plugin's representation of the preference.
void(* preference_del)(void *cls, struct GNUNET_ATS_PreferenceHandle *ph, const struct GNUNET_ATS_Preference *pref)
The plugin should end respecting a preference.
struct ClientPreference * next
DLL pointer.
union Client::@0 details
Details depending on type.
struct GNUNET_PeerIdentity peer
Peer to get address suggestions for.
struct GNUNET_BANDWIDTH_Value32NBO bw
How much bandwidth in bytes/second does the application expect?
Definition: ats2.h:133
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2243
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_PeerIdentity peer
Peer to get address suggestions for.
Definition: ats2.h:128
Here is the call graph for this function:

◆ handle_start()

static void handle_start ( void *  cls,
const struct GNUNET_MessageHeader hdr 
)
static

Handle 'start' messages from transport clients.

Parameters
clsclient that sent the request
messagethe request message

Definition at line 388 of file gnunet-service-ats-new.c.

References Client::client, CT_NONE, CT_TRANSPORT, Client::details, GNUNET_break, GNUNET_CONTAINER_multihashmap32_create(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), Client::transport, and Client::type.

390 {
391  struct Client *c = cls;
392 
393  if (CT_NONE != c->type)
394  {
395  GNUNET_break (0);
397  return;
398  }
399  c->type = CT_TRANSPORT;
400  c->details.transport.sessions
402  if (NULL != transport_client)
403  {
405  transport_client = NULL;
406  }
407  transport_client = c;
409 }
struct Client::@0::@2 transport
Information we track per client.
We don't know yet.
struct GNUNET_SERVICE_Client * client
Service handle of the client.
Transport service.
static struct Client * transport_client
The transport client (there can only be one at a time).
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2324
struct GNUNET_CONTAINER_MultiHashMap32 * GNUNET_CONTAINER_multihashmap32_create(unsigned int len)
Create a 32-bit key multi hash map.
enum ClientType type
Type of the client, initially CT_NONE.
union Client::@0 details
Details depending on type.
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2243
Here is the call graph for this function:

◆ check_session_add()

static int check_session_add ( void *  cls,
const struct SessionAddMessage message 
)
static

Check 'session_add' message is well-formed and comes from a transport client.

Parameters
clsclient that sent the request
messagethe request message
Returns
GNUNET_OK if message is well-formed

Definition at line 421 of file gnunet-service-ats-new.c.

References CT_TRANSPORT, GNUNET_break, GNUNET_MQ_check_zero_termination, GNUNET_OK, GNUNET_SYSERR, and Client::type.

423 {
424  struct Client *c = cls;
425 
427  if (CT_TRANSPORT != c->type)
428  {
429  GNUNET_break (0);
430  return GNUNET_SYSERR;
431  }
432  return GNUNET_OK;
433 }
Information we track per client.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
Transport service.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define GNUNET_MQ_check_zero_termination(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
enum ClientType type
Type of the client, initially CT_NONE.

◆ handle_session_add()

static void handle_session_add ( void *  cls,
const struct SessionAddMessage message 
)
static

Handle 'session add' messages from transport clients.

Parameters
clsclient that sent the request
messagethe request message

Definition at line 443 of file gnunet-service-ats-new.c.

References address, GNUNET_ATS_Session::client, Client::client, GNUNET_ATS_SolverFunctions::cls, GNUNET_ATS_Session::data, Client::details, GNUNET_assert, GNUNET_break, GNUNET_CONTAINER_multihashmap32_get(), GNUNET_CONTAINER_multihashmap32_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_MESSAGE_TYPE_ATS_SESSION_ADD_INBOUND_ONLY, GNUNET_new, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_YES, SessionAddMessage::header, inbound_only, GNUNET_ATS_SessionData::inbound_only, SessionAddMessage::peer, GNUNET_ATS_SessionData::peer, GNUNET_ATS_SessionData::prop, prop_ntoh(), SessionAddMessage::properties, GNUNET_ATS_SessionData::session, GNUNET_ATS_SolverFunctions::session_add, GNUNET_ATS_Session::session_id, SessionAddMessage::session_id, GNUNET_ATS_Session::sh, Client::transport, and GNUNET_MessageHeader::type.

445 {
446  struct Client *c = cls;
447  const char *address = (const char *) &message[1];
448  struct GNUNET_ATS_Session *session;
450  ntohs (message->header.type));
451 
453  message->session_id);
454  if (NULL != session)
455  {
456  GNUNET_break (0);
458  return;
459  }
460  session = GNUNET_new (struct GNUNET_ATS_Session);
461  session->data.session = session;
462  session->client = c;
463  session->session_id = message->session_id;
464  session->data.peer = message->peer;
465  prop_ntoh (&message->properties,
466  &session->data.prop);
467  session->data.inbound_only = inbound_only;
470  c->details.transport.sessions,
471  message->session_id,
472  session,
474  session->sh = plugin->session_add (plugin->cls,
475  &session->data,
476  address);
477  GNUNET_assert (NULL != session->sh);
479  "Transport has new session %p to %s\n",
480  session,
481  GNUNET_i2s (&message->peer));
483 }
struct Client::@0::@2 transport
Information we track per client.
struct GNUNET_ATS_Session * session
Handle to the session that has the given properties.
struct GNUNET_SERVICE_Client * client
Service handle of the client.
uint32_t session_id
Internal number this client will henceforth use to refer to this session.
Definition: ats2.h:152
uint32_t session_id
Unique ID for the session when talking with the client.
struct GNUNET_ATS_SessionHandle * sh
Session state in the plugin.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_PeerIdentity peer
Peer the session is with.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
int GNUNET_CONTAINER_multihashmap32_put(struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define GNUNET_MESSAGE_TYPE_ATS_SESSION_ADD_INBOUND_ONLY
Type of the 'struct SessionAddMessage' send by transport clients to ATS to inform ATS about a session...
static int inbound_only
Option -i.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
struct GNUNET_MessageHeader header
Type is GNUNET_MESSAGE_TYPE_ATS_SESSION_ADD or GNUNET_MESSAGE_TYPE_ATS_SESSION_ADD_INBOUND_ONLY.
Definition: ats2.h:146
Information about ongoing sessions of the transport client.
void * GNUNET_CONTAINER_multihashmap32_get(const struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Given a key find a value in the map matching the key.
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2324
struct GNUNET_ATS_SessionHandle *(* session_add)(void *cls, const struct GNUNET_ATS_SessionData *data, const char *address)
Transport established a new session with performance characteristics given in data.
There must only be one value per key; storing a value should fail if a value under the same key alrea...
int inbound_only
Is the session inbound only?
void * cls
Closure to pass to all solver functions in this struct.
struct GNUNET_PeerIdentity peer
Identity of the peer that this session is for.
Definition: ats2.h:157
struct GNUNET_ATS_SessionData data
Session data exposed to the plugin.
#define GNUNET_log(kind,...)
static void prop_ntoh(const struct PropertiesNBO *properties, struct GNUNET_ATS_Properties *prop)
Convert properties to prop.
struct Client * client
The transport client that provided the session.
#define GNUNET_YES
Definition: gnunet_common.h:77
union Client::@0 details
Details depending on type.
static char * address
GNS address for this phone.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2243
struct PropertiesNBO properties
Performance properties of the session.
Definition: ats2.h:162
struct GNUNET_ATS_Properties prop
ATS performance characteristics for a session.
Here is the call graph for this function:

◆ handle_session_update()

static void handle_session_update ( void *  cls,
const struct SessionUpdateMessage msg 
)
static

Handle 'session update' messages from transport clients.

Parameters
clsclient that sent the request
msgthe request message

Definition at line 493 of file gnunet-service-ats-new.c.

References Client::client, GNUNET_ATS_SolverFunctions::cls, CT_TRANSPORT, GNUNET_ATS_Session::data, Client::details, GNUNET_break, GNUNET_CONTAINER_multihashmap32_get(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_ATS_SessionData::prop, prop_ntoh(), SessionUpdateMessage::properties, SessionUpdateMessage::session_id, GNUNET_ATS_SolverFunctions::session_update, GNUNET_ATS_Session::sh, Client::transport, and Client::type.

495 {
496  struct Client *c = cls;
497  struct GNUNET_ATS_Session *session;
498 
499  if (CT_TRANSPORT != c->type)
500  {
501  GNUNET_break (0);
503  return;
504  }
506  msg->session_id);
507  if (NULL == session)
508  {
509  GNUNET_break (0);
511  return;
512  }
513  prop_ntoh (&msg->properties,
514  &session->data.prop);
516  session->sh,
517  &session->data);
519 }
struct Client::@0::@2 transport
Information we track per client.
struct GNUNET_SERVICE_Client * client
Service handle of the client.
void(* session_update)(void *cls, struct GNUNET_ATS_SessionHandle *sh, const struct GNUNET_ATS_SessionData *data)
data changed for a given sh, solver should consider the updated performance characteristics.
struct GNUNET_ATS_SessionHandle * sh
Session state in the plugin.
Transport service.
uint32_t session_id
Internal number this client uses to refer to this session.
Definition: ats2.h:184
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
Information about ongoing sessions of the transport client.
void * GNUNET_CONTAINER_multihashmap32_get(const struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Given a key find a value in the map matching the key.
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2324
struct PropertiesNBO properties
Performance properties of the session.
Definition: ats2.h:196
void * cls
Closure to pass to all solver functions in this struct.
enum ClientType type
Type of the client, initially CT_NONE.
struct GNUNET_ATS_SessionData data
Session data exposed to the plugin.
static void prop_ntoh(const struct PropertiesNBO *properties, struct GNUNET_ATS_Properties *prop)
Convert properties to prop.
union Client::@0 details
Details depending on type.
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2243
struct GNUNET_ATS_Properties prop
ATS performance characteristics for a session.
Here is the call graph for this function:

◆ handle_session_del()

static void handle_session_del ( void *  cls,
const struct SessionDelMessage message 
)
static

Handle 'session delete' messages from transport clients.

Parameters
clsclient that sent the request
messagethe request message

Definition at line 529 of file gnunet-service-ats-new.c.

References Client::client, GNUNET_ATS_SolverFunctions::cls, CT_TRANSPORT, GNUNET_ATS_Session::data, Client::details, GNUNET_assert, GNUNET_break, GNUNET_CONTAINER_multihashmap32_get(), GNUNET_CONTAINER_multihashmap32_remove(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_i2s(), GNUNET_log, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_YES, GNUNET_ATS_SessionData::peer, GNUNET_ATS_SolverFunctions::session_del, GNUNET_ATS_Session::session_id, SessionDelMessage::session_id, GNUNET_ATS_Session::sh, Client::transport, and Client::type.

531 {
532  struct Client *c = cls;
533  struct GNUNET_ATS_Session *session;
534 
535  if (CT_TRANSPORT != c->type)
536  {
537  GNUNET_break (0);
539  return;
540  }
542  message->session_id);
543  if (NULL == session)
544  {
545  GNUNET_break (0);
547  return;
548  }
549  GNUNET_assert (NULL != session->sh);
551  session->sh,
552  &session->data);
553  session->sh = NULL;
556  c->details.transport.sessions,
557  session->session_id,
558  session));
560  "Transport lost session %p to %s\n",
561  session,
562  GNUNET_i2s (&session->data.peer));
563  GNUNET_free (session);
565 }
struct Client::@0::@2 transport
Information we track per client.
struct GNUNET_SERVICE_Client * client
Service handle of the client.
uint32_t session_id
Unique ID for the session when talking with the client.
struct GNUNET_ATS_SessionHandle * sh
Session state in the plugin.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_PeerIdentity peer
Peer the session is with.
Transport service.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
void(* session_del)(void *cls, struct GNUNET_ATS_SessionHandle *sh, const struct GNUNET_ATS_SessionData *data)
A session went away.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
int GNUNET_CONTAINER_multihashmap32_remove(struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key, const void *value)
Remove the given key-value pair from the map.
Information about ongoing sessions of the transport client.
void * GNUNET_CONTAINER_multihashmap32_get(const struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Given a key find a value in the map matching the key.
uint32_t session_id
Internal number this client uses to refer to this session.
Definition: ats2.h:215
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2324
void * cls
Closure to pass to all solver functions in this struct.
enum ClientType type
Type of the client, initially CT_NONE.
struct GNUNET_ATS_SessionData data
Session data exposed to the plugin.
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
union Client::@0 details
Details depending on type.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2243
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:

◆ client_connect_cb()

static void* client_connect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
struct GNUNET_MQ_Handle mq 
)
static

A client connected to us.

Setup the local client record.

Parameters
clsunused
clienthandle of the client
mqmessage queue to talk to client
Returns
client

Definition at line 578 of file gnunet-service-ats-new.c.

References ClientPreference::client, Client::client, GNUNET_new, mq, and Client::mq.

Referenced by run().

581 {
582  struct Client *c = GNUNET_new (struct Client);
583 
584  c->client = client;
585  c->mq = mq;
586  return c;
587 }
Information we track per client.
struct GNUNET_SERVICE_Client * client
Service handle of the client.
struct GNUNET_MQ_Handle * mq
Message queue to talk to the client.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
Here is the caller graph for this function:

◆ free_session()

static int free_session ( void *  cls,
uint32_t  key,
void *  value 
)
static

Function called on each session to release associated state on transport disconnect.

Parameters
clsthe struct Client
keyunused (session_id)
valuea struct GNUNET_ATS_Session

Definition at line 599 of file gnunet-service-ats-new.c.

References GNUNET_ATS_Session::client, GNUNET_ATS_SolverFunctions::cls, GNUNET_ATS_Session::data, GNUNET_assert, GNUNET_free, GNUNET_OK, GNUNET_ATS_SolverFunctions::session_del, GNUNET_ATS_Session::sh, and value.

Referenced by client_disconnect_cb().

602 {
603  struct Client *c = cls;
604  struct GNUNET_ATS_Session *session = value;
605 
606  (void) key;
607  GNUNET_assert (c == session->client);
608  GNUNET_assert (NULL != session->sh);
610  session->sh,
611  &session->data);
612  session->sh = NULL;
613  GNUNET_free (session);
614  return GNUNET_OK;
615 }
Information we track per client.
struct GNUNET_ATS_SessionHandle * sh
Session state in the plugin.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
void(* session_del)(void *cls, struct GNUNET_ATS_SessionHandle *sh, const struct GNUNET_ATS_SessionData *data)
A session went away.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
static char * value
Value of the record to add/remove.
Information about ongoing sessions of the transport client.
struct GNUNET_HashCode key
The key used in the DHT.
void * cls
Closure to pass to all solver functions in this struct.
struct GNUNET_ATS_SessionData data
Session data exposed to the plugin.
struct Client * client
The transport client that provided the session.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the caller graph for this function:

◆ client_disconnect_cb()

static void client_disconnect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
void *  app_ctx 
)
static

A client disconnected from us.

Tear down the local client record.

Parameters
clsunused
clienthandle of the client
app_ctxour struct Client

Definition at line 627 of file gnunet-service-ats-new.c.

References Client::application, Client::client, GNUNET_ATS_SolverFunctions::cls, CT_APPLICATION, CT_NONE, CT_TRANSPORT, Client::details, free_session(), GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_CONTAINER_multihashmap32_destroy(), GNUNET_CONTAINER_multihashmap32_iterate(), GNUNET_free, GNUNET_ATS_SolverFunctions::preference_del, Client::transport, and Client::type.

Referenced by run().

630 {
631  struct Client *c = app_ctx;
632 
633  (void) cls;
634  GNUNET_assert (c->client == client);
635  switch (c->type)
636  {
637  case CT_NONE:
638  break;
639 
640  case CT_APPLICATION:
641  for (struct ClientPreference *cp = c->details.application.cp_head;
642  NULL != cp;
643  cp = c->details.application.cp_head)
644  {
646  cp->ph,
647  &cp->pref);
649  c->details.application.cp_tail,
650  cp);
651  GNUNET_free (cp);
652  }
653  break;
654 
655  case CT_TRANSPORT:
656  if (transport_client == c)
657  transport_client = NULL;
659  &free_session,
660  c);
662  break;
663  }
664  GNUNET_free (c);
665 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct Client::@0::@2 transport
Information we track per client.
We don't know yet.
struct GNUNET_SERVICE_Client * client
Service handle of the client.
int GNUNET_CONTAINER_multihashmap32_iterate(struct GNUNET_CONTAINER_MultiHashMap32 *map, GNUNET_CONTAINER_MulitHashMapIterator32Callback it, void *it_cls)
Iterate over all entries in the map.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static int free_session(void *cls, uint32_t key, void *value)
Function called on each session to release associated state on transport disconnect.
Preferences expressed by a client are kept in a DLL per client.
Transport service.
static struct Client * transport_client
The transport client (there can only be one at a time).
struct Client::@0::@1 application
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
void GNUNET_CONTAINER_multihashmap32_destroy(struct GNUNET_CONTAINER_MultiHashMap32 *map)
Destroy a 32-bit key hash map.
void * cls
Closure to pass to all solver functions in this struct.
enum ClientType type
Type of the client, initially CT_NONE.
void(* preference_del)(void *cls, struct GNUNET_ATS_PreferenceHandle *ph, const struct GNUNET_ATS_Preference *pref)
The plugin should end respecting a preference.
union Client::@0 details
Details depending on type.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ final_cleanup()

static void final_cleanup ( void *  cls)
static

Task run at the end during shutdown.

Parameters
clsunused

Definition at line 674 of file gnunet-service-ats-new.c.

References GNUNET_free, GNUNET_NO, GNUNET_PLUGIN_unload(), GNUNET_STATISTICS_destroy(), and plugin_name.

Referenced by cleanup_task().

675 {
676  (void) cls;
677  if (NULL != stats)
678  {
680  GNUNET_NO);
681  stats = NULL;
682  }
683  if (NULL != plugin)
684  {
686  plugin);
687  plugin = NULL;
688  }
689  if (NULL != plugin_name)
690  {
692  plugin_name = NULL;
693  }
694 }
static struct GNUNET_STATISTICS_Handle * stats
Handle for statistics.
#define GNUNET_NO
Definition: gnunet_common.h:78
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).
void * GNUNET_PLUGIN_unload(const char *library_name, void *arg)
Unload plugin (runs the "done" callback and returns whatever "done" returned).
Definition: plugin.c:256
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
static char * plugin_name
Solver plugin name as string.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cleanup_task()

static void cleanup_task ( void *  cls)
static

Task run during shutdown.

Parameters
clsunused

Definition at line 703 of file gnunet-service-ats-new.c.

References final_cleanup(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, and GNUNET_SCHEDULER_add_now().

Referenced by run().

704 {
705  (void) cls;
707  "ATS shutdown initiated\n");
709  NULL);
710 }
static void final_cleanup(void *cls)
Task run at the end during shutdown.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
#define GNUNET_log(kind,...)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

static void run ( void *  cls,
const struct GNUNET_CONFIGURATION_Handle cfg,
struct GNUNET_SERVICE_Handle service 
)
static

Process template requests.

Parameters
clsclosure
cfgconfiguration to use
servicethe initialized service

Definition at line 721 of file gnunet-service-ats-new.c.

References _, GNUNET_ATS_PluginEnvironment::allocate_cb, allocate_cb(), cfg, GNUNET_ATS_PluginEnvironment::cfg, cleanup_task(), client_connect_cb(), client_disconnect_cb(), GNUNET_ATS_PluginEnvironment::cls, GNUNET_asprintf(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_MESSAGE_TYPE_ATS_SESSION_ADD, GNUNET_MESSAGE_TYPE_ATS_SESSION_ADD_INBOUND_ONLY, GNUNET_MESSAGE_TYPE_ATS_SESSION_DEL, GNUNET_MESSAGE_TYPE_ATS_SESSION_UPDATE, GNUNET_MESSAGE_TYPE_ATS_START, GNUNET_MESSAGE_TYPE_ATS_SUGGEST, GNUNET_MESSAGE_TYPE_ATS_SUGGEST_CANCEL, GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_hd_var_size, GNUNET_PLUGIN_load(), GNUNET_SCHEDULER_add_shutdown(), GNUNET_SCHEDULER_shutdown(), GNUNET_SERVICE_MAIN(), GNUNET_SERVICE_OPTION_NONE, GNUNET_STATISTICS_create(), GNUNET_strdup, GNUNET_SYSERR, plugin_name, start, stats, GNUNET_ATS_PluginEnvironment::stats, suggest_cb(), and GNUNET_ATS_PluginEnvironment::suggest_cb.

724 {
725  static struct GNUNET_ATS_PluginEnvironment env;
726  char *solver;
727 
729  cfg);
730  if (GNUNET_SYSERR ==
732  "ats",
733  "SOLVER",
734  &solver))
735  {
737  "No ATS solver configured, using 'simple' approach\n");
738  solver = GNUNET_strdup ("simple");
739  }
741  NULL);
742  env.cls = NULL;
743  env.cfg = cfg;
744  env.stats = stats;
745  env.suggest_cb = &suggest_cb;
746  env.allocate_cb = &allocate_cb;
748  "libgnunet_plugin_ats2_%s",
749  solver);
750  GNUNET_free (solver);
751  if (NULL == (plugin = GNUNET_PLUGIN_load (plugin_name,
752  &env)))
753  {
755  _ ("Failed to initialize solver `%s'!\n"),
756  plugin_name);
758  return;
759  }
760 }
static struct GNUNET_STATISTICS_Handle * stats
Handle for statistics.
static void allocate_cb(void *cls, struct GNUNET_ATS_Session *session, const struct GNUNET_PeerIdentity *peer, struct GNUNET_BANDWIDTH_Value32NBO bw_in, struct GNUNET_BANDWIDTH_Value32NBO bw_out)
Function called by the solver to tell the transpor to allocate bandwidth for the specified session...
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received, or when GNUNET_SCHEDULER_shutdown() is being invoked.
Definition: scheduler.c:1300
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:526
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
static void cleanup_task(void *cls)
Task run during shutdown.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
static char * plugin_name
Solver plugin name as string.
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:109
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static void suggest_cb(void *cls, const struct GNUNET_PeerIdentity *pid, const char *address)
Function called by the solver to prompt the transport to try out a new address.
#define GNUNET_log(kind,...)
void * GNUNET_PLUGIN_load(const char *library_name, void *arg)
Setup plugin (runs the "init" callback and returns whatever "init" returned).
Definition: plugin.c:207
The ATS plugin will pass a pointer to a struct of this type as to the initialization function of the ...
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:

◆ GNUNET_SERVICE_MAIN()

Define "main" method using service macro.

Referenced by run().

Here is the caller graph for this function:

Variable Documentation

◆ stats

struct GNUNET_STATISTICS_Handle* stats
static

◆ plugin

struct GNUNET_ATS_SolverFunctions* plugin
static

Our solver.

Definition at line 176 of file gnunet-service-ats-new.c.

Referenced by __attribute__(), ack_message_sent(), ack_proc(), add_plugin(), address_notification(), append_port(), broadcast_mst_cb(), client_connect(), client_delete_session(), client_receive_mst_cb(), client_run(), client_send_cb(), connect_notify(), create_macendpoint(), create_session(), delete_entries(), destroy_session_cb(), disconnect_and_free_it(), disconnect_notify(), do_transmit(), enqueue_fragment(), expi_proc(), expire_blocks(), expire_entries(), find_plugin(), fragmented_message_done(), free_macendpoint(), free_value(), get_session_delete_it(), GNUNET_BLOCK_context_destroy(), GNUNET_BLOCK_evaluate(), GNUNET_BLOCK_get_key(), GNUNET_BLOCK_group_create(), GNUNET_GNSRECORD_number_to_typename(), GNUNET_GNSRECORD_string_to_value(), GNUNET_GNSRECORD_typename_to_number(), GNUNET_GNSRECORD_value_to_string(), GNUNET_RECLAIM_ATTRIBUTE_number_to_typename(), GNUNET_RECLAIM_ATTRIBUTE_string_to_value(), GNUNET_RECLAIM_ATTRIBUTE_typename_to_number(), GNUNET_RECLAIM_ATTRIBUTE_value_to_string(), handle_helper_message(), handle_tcp_data(), handle_tcp_nat_probe(), handle_tcp_welcome(), heap_get_keys(), heap_plugin_del(), heap_plugin_estimate_size(), heap_plugin_get(), heap_plugin_get_closest(), heap_plugin_get_expiration(), heap_plugin_get_key(), heap_plugin_get_random(), heap_plugin_get_replication(), heap_plugin_get_zero_anonymity(), heap_plugin_put(), heap_plugin_remove_key(), http_client_plugin_get_network_for_address(), http_client_plugin_get_session(), http_client_plugin_peer_disconnect(), http_client_plugin_send(), http_client_plugin_session_disconnect(), http_client_plugin_setup_monitor(), iface_proc(), iterate_entries(), libgnunet_plugin_datacache_heap_done(), libgnunet_plugin_datacache_heap_init(), libgnunet_plugin_datacache_postgres_done(), libgnunet_plugin_datacache_postgres_init(), libgnunet_plugin_datacache_sqlite_done(), libgnunet_plugin_datacache_sqlite_init(), libgnunet_plugin_datacache_template_done(), libgnunet_plugin_datacache_template_init(), libgnunet_plugin_datastore_heap_done(), libgnunet_plugin_datastore_heap_init(), libgnunet_plugin_datastore_mysql_done(), libgnunet_plugin_datastore_mysql_init(), libgnunet_plugin_datastore_postgres_done(), libgnunet_plugin_datastore_postgres_init(), libgnunet_plugin_datastore_sqlite_done(), libgnunet_plugin_datastore_sqlite_init(), libgnunet_plugin_datastore_template_done(), libgnunet_plugin_datastore_template_init(), libgnunet_plugin_namecache_flat_done(), libgnunet_plugin_namecache_flat_init(), libgnunet_plugin_namecache_postgres_done(), libgnunet_plugin_namecache_postgres_init(), libgnunet_plugin_namecache_sqlite_done(), libgnunet_plugin_namecache_sqlite_init(), libgnunet_plugin_namestore_flat_done(), libgnunet_plugin_namestore_flat_init(), libgnunet_plugin_namestore_postgres_done(), libgnunet_plugin_namestore_postgres_init(), libgnunet_plugin_namestore_sqlite_done(), libgnunet_plugin_namestore_sqlite_init(), libgnunet_plugin_peerstore_flat_done(), libgnunet_plugin_peerstore_flat_init(), libgnunet_plugin_peerstore_sqlite_done(), libgnunet_plugin_peerstore_sqlite_init(), libgnunet_plugin_rest_config_done(), libgnunet_plugin_rest_config_init(), libgnunet_plugin_rest_copying_done(), libgnunet_plugin_rest_copying_init(), libgnunet_plugin_rest_credential_done(), libgnunet_plugin_rest_credential_init(), libgnunet_plugin_rest_gns_done(), libgnunet_plugin_rest_gns_init(), libgnunet_plugin_rest_identity_done(), libgnunet_plugin_rest_identity_init(), libgnunet_plugin_rest_namestore_done(), libgnunet_plugin_rest_namestore_init(), libgnunet_plugin_rest_openid_connect_done(), libgnunet_plugin_rest_openid_connect_init(), libgnunet_plugin_rest_peerinfo_done(), libgnunet_plugin_rest_peerinfo_init(), libgnunet_plugin_rest_reclaim_done(), libgnunet_plugin_rest_reclaim_init(), LIBGNUNET_PLUGIN_TRANSPORT_DONE(), libgnunet_plugin_transport_http_client_done(), libgnunet_plugin_transport_http_client_init(), libgnunet_plugin_transport_http_server_init(), LIBGNUNET_PLUGIN_TRANSPORT_INIT(), libgnunet_plugin_transport_tcp_done(), libgnunet_plugin_transport_tcp_init(), libgnunet_plugin_transport_udp_done(), libgnunet_plugin_transport_unix_done(), libgnunet_plugin_transport_unix_init(), mysql_plugin_drop(), mysql_plugin_estimate_size(), mysql_plugin_get_expiration(), mysql_plugin_get_key(), mysql_plugin_get_keys(), mysql_plugin_get_replication(), mysql_plugin_get_zero_anonymity(), mysql_plugin_put(), mysql_plugin_remove_key(), namecache_cache_block(), namecache_lookup_block(), namecache_postgres_cache_block(), namecache_postgres_lookup_block(), namecache_sqlite_cache_block(), namecache_sqlite_lookup_block(), namestore_flat_iterate_records(), namestore_flat_lookup_records(), namestore_flat_store_records(), namestore_flat_zone_to_name(), namestore_postgres_iterate_records(), namestore_postgres_lookup_records(), namestore_postgres_store_records(), namestore_postgres_zone_to_name(), namestore_sqlite_iterate_records(), namestore_sqlite_lookup_records(), namestore_sqlite_store_records(), namestore_sqlite_zone_to_name(), notify_send_probe(), peerstore_flat_delete_records(), peerstore_flat_expire_records(), peerstore_flat_iterate_records(), peerstore_flat_store_record(), peerstore_sqlite_delete_records(), peerstore_sqlite_expire_records(), peerstore_sqlite_iterate_records(), peerstore_sqlite_store_record(), postgres_plugin_del(), postgres_plugin_drop(), postgres_plugin_estimate_size(), postgres_plugin_get(), postgres_plugin_get_closest(), postgres_plugin_get_expiration(), postgres_plugin_get_key(), postgres_plugin_get_keys(), postgres_plugin_get_random(), postgres_plugin_get_replication(), postgres_plugin_get_zero_anonymity(), postgres_plugin_put(), postgres_plugin_remove_key(), process_data(), process_inbound_tokenized_messages(), process_result(), qc_fragment_sent(), qc_message_sent(), read_process_fragment(), repl_proc(), send_hello_beacon(), send_session_info_iter(), send_with_fragmentation(), server_lookup_connection(), server_wake_up(), session_disconnect_it(), session_timeout(), sqlite_plugin_del(), sqlite_plugin_drop(), sqlite_plugin_estimate_size(), sqlite_plugin_get(), sqlite_plugin_get_closest(), sqlite_plugin_get_expiration(), sqlite_plugin_get_key(), sqlite_plugin_get_keys(), sqlite_plugin_get_random(), sqlite_plugin_get_replication(), sqlite_plugin_get_zero_anonymity(), sqlite_plugin_put(), sqlite_plugin_remove_key(), tcp_nat_port_map_callback(), tcp_plugin_address_pretty_printer(), tcp_plugin_check_address(), tcp_plugin_disconnect(), tcp_plugin_disconnect_session(), tcp_plugin_get_network_for_address(), tcp_plugin_get_session(), tcp_plugin_send(), tcp_plugin_setup_monitor(), tcp_plugin_string_to_address(), try_connection_reversal(), udp_broadcast_receive(), udp_disconnect(), udp_disconnect_session(), udp_ipv4_broadcast_send(), udp_ipv6_broadcast_send(), udp_nat_port_map_callback(), udp_plugin_address_pretty_printer(), udp_plugin_check_address(), udp_plugin_create_session(), udp_plugin_get_network_for_address(), udp_plugin_get_session(), udp_plugin_lookup_session(), udp_plugin_select_v4(), udp_plugin_select_v6(), udp_plugin_send(), udp_plugin_setup_monitor(), udp_plugin_update_session_timeout(), udp_string_to_address(), unix_plugin_check_address(), unix_plugin_get_session(), unix_plugin_peer_disconnect(), unix_plugin_select_read(), unix_plugin_select_write(), unix_plugin_send(), unix_plugin_session_disconnect(), unix_plugin_setup_monitor(), unix_plugin_string_to_address(), unix_plugin_update_session_timeout(), unix_real_send(), unix_transport_server_start(), wlan_data_message_handler(), wlan_plugin_address_suggested(), wlan_plugin_disconnect_peer(), wlan_plugin_disconnect_session(), wlan_plugin_get_session(), wlan_plugin_send(), wlan_plugin_setup_monitor(), and wlan_plugin_string_to_address().

◆ plugin_name

char* plugin_name
static

◆ transport_client

struct Client* transport_client
static

The transport client (there can only be one at a time).

Definition at line 186 of file gnunet-service-ats-new.c.

Referenced by allocate_cb().