GNUnet  0.10.x
Data Structures | Functions | Variables
gnunet-service-transport_plugins.c File Reference

plugin management More...

#include "platform.h"
#include "gnunet-service-transport.h"
#include "gnunet-service-transport_hello.h"
#include "gnunet-service-transport_ats.h"
#include "gnunet-service-transport_plugins.h"
Include dependency graph for gnunet-service-transport_plugins.c:

Go to the source code of this file.

Data Structures

struct  TransportPlugin
 Entry in doubly-linked list of all of our plugins. More...
 

Functions

static void plugin_env_update_distance (void *cls, const struct GNUNET_HELLO_Address *address, uint32_t distance)
 Function that will be called to update metrics for an address. More...
 
static enum GNUNET_NetworkType plugin_env_address_to_type (void *cls, const struct sockaddr *addr, size_t addrlen)
 Function that will be called to figure if an address is an loopback, LAN, WAN etc. More...
 
void GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb, GNUNET_TRANSPORT_AddressNotification address_cb, GNUNET_TRANSPORT_SessionStart session_start_cb, GNUNET_TRANSPORT_SessionEnd session_end_cb)
 Load and initialize all plugins. More...
 
void GST_plugins_unload ()
 Unload all plugins. More...
 
struct GNUNET_TRANSPORT_PluginFunctionsGST_plugins_find (const char *name)
 Obtain the plugin API based on a plugin name. More...
 
struct GNUNET_TRANSPORT_PluginFunctionsGST_plugins_printer_find (const char *name)
 Obtain the plugin API based on a the stripped plugin name after the underscore. More...
 
const char * GST_plugins_a2s (const struct GNUNET_HELLO_Address *address)
 Convert a given address to a human-readable format. More...
 
void GST_plugins_monitor_subscribe (GNUNET_TRANSPORT_SessionInfoCallback cb, void *cb_cls)
 Register callback with all plugins to monitor their status. More...
 

Variables

static struct TransportPluginplugins_head
 Head of DLL of all loaded plugins. More...
 
static struct TransportPluginplugins_tail
 Head of DLL of all loaded plugins. More...
 

Detailed Description

plugin management

Author
Christian Grothoff

Definition in file gnunet-service-transport_plugins.c.

Function Documentation

◆ plugin_env_update_distance()

static void plugin_env_update_distance ( void *  cls,
const struct GNUNET_HELLO_Address address,
uint32_t  distance 
)
static

Function that will be called to update metrics for an address.

Parameters
clsclosure
addressaddress to update metrics for
sessionthe session
distancenew distance

Definition at line 91 of file gnunet-service-transport_plugins.c.

References GST_ats_update_distance().

Referenced by GST_plugins_load().

94 {
95  GST_ats_update_distance (address,
96  distance);
97 }
void GST_ats_update_distance(const struct GNUNET_HELLO_Address *address, uint32_t distance)
Notify ATS about DV distance change to an address.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ plugin_env_address_to_type()

static enum GNUNET_NetworkType plugin_env_address_to_type ( void *  cls,
const struct sockaddr *  addr,
size_t  addrlen 
)
static

Function that will be called to figure if an address is an loopback, LAN, WAN etc.

address

Parameters
clsclosure
addrbinary address
addrlenlength of the addr
Returns
type of the network addr belongs to

Definition at line 110 of file gnunet-service-transport_plugins.c.

References GNUNET_break, GNUNET_NT_scanner_get_type(), GNUNET_NT_UNSPECIFIED, and GST_is.

Referenced by GST_plugins_load().

113 {
114  if (NULL == GST_is)
115  {
116  GNUNET_break(0);
117  return GNUNET_NT_UNSPECIFIED;
118  }
120  addr,
121  addrlen);
122 }
enum GNUNET_NetworkType GNUNET_NT_scanner_get_type(struct GNUNET_NT_InterfaceScanner *is, const struct sockaddr *addr, socklen_t addrlen)
Returns where the address is located: loopback, LAN or WAN.
Definition: nt.c:303
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_NT_InterfaceScanner * GST_is
Interface scanner determines our LAN address range(s).
Category of last resort.
Definition: gnunet_nt_lib.h:40
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_plugins_load()

void GST_plugins_load ( GNUNET_TRANSPORT_PluginReceiveCallback  recv_cb,
GNUNET_TRANSPORT_AddressNotification  address_cb,
GNUNET_TRANSPORT_SessionStart  session_start_cb,
GNUNET_TRANSPORT_SessionEnd  session_end_cb 
)

Load and initialize all plugins.

The respective functions will be invoked by the plugins when the respective events happen. The closure will be set to a 'const char*' containing the name of the plugin that caused the call.

Parameters
recv_cbfunction to call when data is received
address_cbfunction to call when our public addresses changed
session_start_cbfunction to call when a session was created
session_end_cbfunction to call when a session was terminated
address_type_cbfunction to call when a address type is requested

Definition at line 138 of file gnunet-service-transport_plugins.c.

References _, address_cb(), GNUNET_TRANSPORT_PluginFunctions::address_pretty_printer, GNUNET_TRANSPORT_PluginFunctions::address_to_string, TransportPlugin::api, GNUNET_TRANSPORT_PluginEnvironment::cfg, GNUNET_TRANSPORT_PluginFunctions::check_address, GNUNET_TRANSPORT_PluginEnvironment::cls, GNUNET_TRANSPORT_PluginFunctions::disconnect_peer, GNUNET_TRANSPORT_PluginFunctions::disconnect_session, TransportPlugin::env, GNUNET_TRANSPORT_PluginEnvironment::get_address_type, GNUNET_TRANSPORT_PluginFunctions::get_network, GNUNET_TRANSPORT_PluginEnvironment::get_our_hello, GNUNET_TRANSPORT_PluginFunctions::get_session, GNUNET_asprintf(), GNUNET_break, GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONTAINER_DLL_insert, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_log, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_PLUGIN_load(), GNUNET_PLUGIN_unload(), GNUNET_strdup, GNUNET_YES, GST_cfg, GST_hello_get(), GST_my_identity, GST_stats, TransportPlugin::lib_name, GNUNET_TRANSPORT_PluginEnvironment::max_connections, GNUNET_TRANSPORT_PluginEnvironment::my_identity, TransportPlugin::next, GNUNET_TRANSPORT_PluginEnvironment::notify_address, plugin_env_address_to_type(), plugin_env_update_distance(), plugins_head, GNUNET_TRANSPORT_PluginFunctions::query_keepalive_factor, GNUNET_TRANSPORT_PluginEnvironment::receive, GNUNET_TRANSPORT_PluginFunctions::send, GNUNET_TRANSPORT_PluginEnvironment::session_end, GNUNET_TRANSPORT_PluginEnvironment::session_start, TransportPlugin::short_name, GNUNET_TRANSPORT_PluginEnvironment::stats, GNUNET_TRANSPORT_PluginFunctions::string_to_address, GNUNET_TRANSPORT_PluginEnvironment::update_address_distance, and GNUNET_TRANSPORT_PluginFunctions::update_session_timeout.

Referenced by run().

142 {
143  struct TransportPlugin *plug;
144  struct TransportPlugin *next;
145  unsigned long long tneigh;
146  char *libname;
147  char *plugs;
148  char *pos;
149  int fail;
150 
151  if (GNUNET_OK !=
153  "TRANSPORT",
154  "NEIGHBOUR_LIMIT",
155  &tneigh))
156  {
158  _("Transport service is lacking NEIGHBOUR_LIMIT option.\n"));
159  return;
160  }
161  if (GNUNET_OK !=
163  "TRANSPORT",
164  "PLUGINS",
165  &plugs))
166  return;
168  _("Starting transport plugins `%s'\n"),
169  plugs);
170  for (pos = strtok (plugs, " "); pos != NULL; pos = strtok (NULL, " "))
171  {
173  _("Loading `%s' transport plugin\n"),
174  pos);
175  GNUNET_asprintf (&libname,
176  "libgnunet_plugin_transport_%s",
177  pos);
178  plug = GNUNET_new (struct TransportPlugin);
179  plug->short_name = GNUNET_strdup (pos);
180  plug->lib_name = libname;
181  plug->env.cfg = GST_cfg;
184  plug->env.cls = plug->short_name;
185  plug->env.receive = recv_cb;
186  plug->env.notify_address = address_cb;
187  plug->env.session_start = session_start_cb;
188  plug->env.session_end = session_end_cb;
191  plug->env.max_connections = tneigh;
192  plug->env.stats = GST_stats;
194  plugins_tail,
195  plug);
196  }
197  GNUNET_free (plugs);
198  next = plugins_head;
199  while (NULL != next)
200  {
201  plug = next;
202  next = plug->next;
203  plug->api = GNUNET_PLUGIN_load (plug->lib_name,
204  &plug->env);
205  if (NULL == plug->api)
206  {
208  _("Failed to load transport plugin for `%s'\n"),
209  plug->lib_name);
211  plugins_tail,
212  plug);
213  GNUNET_free (plug->short_name);
214  GNUNET_free (plug->lib_name);
215  GNUNET_free (plug);
216  continue;
217  }
218  fail = GNUNET_NO;
219  if (NULL == plug->api->address_pretty_printer)
220  {
221  fail = GNUNET_YES;
223  _("Missing function `%s' in transport plugin for `%s'\n"),
224  "address_pretty_printer",
225  plug->lib_name);
226  }
227  if (NULL == plug->api->address_to_string)
228  {
229  fail = GNUNET_YES;
231  _("Missing function `%s' in transport plugin for `%s'\n"),
232  "address_to_string",
233  plug->lib_name);
234  }
235  if (NULL == plug->api->string_to_address)
236  {
237  fail = GNUNET_YES;
239  _("Missing function `%s' in transport plugin for `%s'\n"),
240  "string_to_address",
241  plug->lib_name);
242  }
243  if (NULL == plug->api->check_address)
244  {
245  fail = GNUNET_YES;
247  _("Missing function `%s' in transport plugin for `%s'\n"),
248  "check_address",
249  plug->lib_name);
250  }
251  if (NULL == plug->api->get_session)
252  {
253  fail = GNUNET_YES;
255  _("Missing function `%s' in transport plugin for `%s'\n"),
256  "get_session",
257  plug->lib_name);
258  }
259  if (NULL == plug->api->get_network)
260  {
261  fail = GNUNET_YES;
263  _("Missing function `%s' in transport plugin for `%s'\n"),
264  "get_network",
265  plug->lib_name);
266  }
267  if (NULL == plug->api->send)
268  {
269  fail = GNUNET_YES;
271  _("Missing function `%s' in transport plugin for `%s'\n"),
272  "send",
273  plug->lib_name);
274  }
275  if (NULL == plug->api->disconnect_peer)
276  {
277  fail = GNUNET_YES;
279  _("Missing function `%s' in transport plugin for `%s'\n"),
280  "disconnect_peer",
281  plug->lib_name);
282  }
283  if (NULL == plug->api->disconnect_session)
284  {
285  fail = GNUNET_YES;
287  _("Missing function `%s' in transport plugin for `%s'\n"),
288  "disconnect_session",
289  plug->lib_name);
290  }
291  if (NULL == plug->api->query_keepalive_factor)
292  {
293  fail = GNUNET_YES;
295  _("Missing function `%s' in transport plugin for `%s'\n"),
296  "query_keepalive_factor",
297  plug->lib_name);
298  }
299  if (NULL == plug->api->update_session_timeout)
300  {
301  fail = GNUNET_YES;
303  _("Missing function `%s' in transport plugin for `%s'\n"),
304  "update_session_timeout",
305  plug->lib_name);
306  }
307  if (GNUNET_YES == fail)
308  {
310  _("Did not load plugin `%s' due to missing functions\n"),
311  plug->lib_name);
312  GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
314  plugins_tail,
315  plug);
316  GNUNET_free (plug->short_name);
317  GNUNET_free (plug->lib_name);
318  GNUNET_free (plug);
319  }
320  }
321 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
static struct GNUNET_PeerIdentity GST_my_identity
Our public key.
char * short_name
Short name for the plugin (i.e.
GNUNET_TRANSPORT_CreateSession get_session
Function that will be called tell the plugin to create a session object.
GNUNET_TRANSPORT_AddressToString address_to_string
Function that will be called to convert a binary address to a string (numeric conversion only)...
int GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
GNUNET_TRANSPORT_SessionStart session_start
Function called by the plugin when a new (incoming) session was created not explicitly created using ...
struct TransportPlugin * next
This is a doubly-linked list.
GNUNET_TRANSPORT_TransmitFunction send
Function that the transport service will use to transmit data to another peer.
GNUNET_TRANSPORT_DisconnectPeerFunction disconnect_peer
Function that can be used to force the plugin to disconnect from the given peer and cancel all previo...
GNUNET_TRANSPORT_AddressToType get_address_type
Function that will be called to figure if an address is an loopback, LAN, WAN etc.
GNUNET_TRANSPORT_DisconnectSessionFunction disconnect_session
Function that can be used to force the plugin to disconnect from the given peer and cancel all previo...
const struct GNUNET_PeerIdentity * my_identity
Identity of this peer.
#define GNUNET_NO
Definition: gnunet_common.h:81
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static enum GNUNET_NetworkType plugin_env_address_to_type(void *cls, const struct sockaddr *addr, size_t addrlen)
Function that will be called to figure if an address is an loopback, LAN, WAN etc.
uint32_t max_connections
What is the maximum number of connections that this transport should allow? Transports that do not ha...
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static void plugin_env_update_distance(void *cls, const struct GNUNET_HELLO_Address *address, uint32_t distance)
Function that will be called to update metrics for an address.
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
void * GNUNET_PLUGIN_unload(const char *library_name, void *arg)
Unload plugin (runs the "done" callback and returns whatever "done" returned).
Definition: plugin.c:258
static void address_cb(void *cls, void **app_ctx, int add_remove, enum GNUNET_NAT_AddressClass ac, const struct sockaddr *addr, socklen_t addrlen)
Signature of the callback passed to GNUNET_NAT_register() for a function to call whenever our set of ...
Definition: gnunet-nat.c:122
GNUNET_TRANSPORT_SessionEnd session_end
Function that must be called by the plugin when a non-NULL session handle stops being valid (is destr...
GNUNET_TRANSPORT_PluginReceiveCallback receive
Function that should be called by the transport plugin whenever a message is received.
GNUNET_TRANSPORT_UpdateSessionTimeout update_session_timeout
Function that will be called whenever the transport service wants to notify the plugin that a session...
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
void * cls
Closure for the various callbacks.
static struct TransportPlugin * plugins_head
Head of DLL of all loaded plugins.
GNUNET_TRANSPORT_GetHelloCallback get_our_hello
Function that returns our HELLO.
GNUNET_TRANSPORT_StringToAddress string_to_address
Function that will be called to convert a string address to binary (numeric conversion only)...
struct GNUNET_TRANSPORT_PluginEnvironment env
Environment this transport service is using for this plugin.
GNUNET_TRANSPORT_GetNetworkType get_network
Function to obtain the network type for a session.
static struct TransportPlugin * plugins_tail
Head of DLL of all loaded plugins.
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.
char * lib_name
Name of the library (i.e.
GNUNET_TRANSPORT_UpdateAddressDistance update_address_distance
Function that will be called by DV to update distance for an address.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
const struct GNUNET_MessageHeader * GST_hello_get()
Obtain this peers HELLO message.
GNUNET_TRANSPORT_QueryKeepaliveFactorFunction query_keepalive_factor
Function that is used to query keepalive factor.
Entry in doubly-linked list of all of our plugins.
struct GNUNET_TRANSPORT_PluginFunctions * api
API of the transport as returned by the plugin's initialization function.
struct GNUNET_STATISTICS_Handle * stats
Handle for reporting statistics.
#define GNUNET_log(kind,...)
GNUNET_TRANSPORT_AddressNotification notify_address
Function that must be called by each plugin to notify the transport service about the addresses under...
GNUNET_TRANSPORT_AddressPrettyPrinter address_pretty_printer
Function to pretty-print addresses.
#define GNUNET_YES
Definition: gnunet_common.h:80
static const struct GNUNET_CONFIGURATION_Handle * GST_cfg
Configuration handle.
void * GNUNET_PLUGIN_load(const char *library_name, void *arg)
Setup plugin (runs the "init" callback and returns whatever "init" returned).
Definition: plugin.c:210
GNUNET_TRANSPORT_CheckAddress check_address
Function that will be called to check if a binary address for this plugin is well-formed and correspo...
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_plugins_unload()

void GST_plugins_unload ( void  )

Unload all plugins.

Definition at line 328 of file gnunet-service-transport_plugins.c.

References TransportPlugin::api, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_PLUGIN_unload(), TransportPlugin::lib_name, and TransportPlugin::short_name.

Referenced by shutdown_task().

329 {
330  struct TransportPlugin *plug;
331 
332  while (NULL != (plug = plugins_head))
333  {
334  GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
335  GNUNET_free (plug->lib_name);
336  GNUNET_free (plug->short_name);
338  GNUNET_free (plug);
339  }
340 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
char * short_name
Short name for the plugin (i.e.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
void * GNUNET_PLUGIN_unload(const char *library_name, void *arg)
Unload plugin (runs the "done" callback and returns whatever "done" returned).
Definition: plugin.c:258
static struct TransportPlugin * plugins_head
Head of DLL of all loaded plugins.
static struct TransportPlugin * plugins_tail
Head of DLL of all loaded plugins.
char * lib_name
Name of the library (i.e.
Entry in doubly-linked list of all of our plugins.
struct GNUNET_TRANSPORT_PluginFunctions * api
API of the transport as returned by the plugin's initialization function.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_plugins_find()

struct GNUNET_TRANSPORT_PluginFunctions* GST_plugins_find ( const char *  name)

Obtain the plugin API based on a plugin name.

Parameters
namename of the plugin
Returns
the plugin's API, NULL if the plugin is not loaded

Definition at line 350 of file gnunet-service-transport_plugins.c.

References TransportPlugin::api, TransportPlugin::next, and TransportPlugin::short_name.

Referenced by add_valid_address(), GST_neighbours_keepalive_response(), GST_neighbours_switch_to_address(), GST_validation_handle_address(), GST_validation_handle_ping(), GST_validation_handle_pong(), GST_validation_set_address_use(), inbound_bw_tracker_update(), kill_session(), multicast_pong(), send_syn(), send_syn_ack_message(), send_with_session(), set_alternative_address(), switch_address_bl_check_cont(), and transmit_ping_if_allowed().

351 {
352  struct TransportPlugin *pos;
353 
354  for (pos = plugins_head; NULL != pos; pos = pos->next)
355  if (0 == strcmp (name, pos->short_name))
356  break;
357  if (NULL == pos)
358  return NULL;
359  return pos->api;
360 }
char * short_name
Short name for the plugin (i.e.
struct TransportPlugin * next
This is a doubly-linked list.
static struct TransportPlugin * plugins_head
Head of DLL of all loaded plugins.
const char * name
Entry in doubly-linked list of all of our plugins.
struct GNUNET_TRANSPORT_PluginFunctions * api
API of the transport as returned by the plugin's initialization function.
Here is the caller graph for this function:

◆ GST_plugins_printer_find()

struct GNUNET_TRANSPORT_PluginFunctions* GST_plugins_printer_find ( const char *  name)

Obtain the plugin API based on a the stripped plugin name after the underscore.

Example: GST_plugins_printer_find (http_client) will return all plugins starting with the prefix "http": http_client or server if loaded

Parameters
namename of the plugin
Returns
the plugin's API, NULL if the plugin is not loaded

Definition at line 374 of file gnunet-service-transport_plugins.c.

References TransportPlugin::api, GNUNET_free, GNUNET_strdup, TransportPlugin::next, and TransportPlugin::short_name.

Referenced by GST_plugins_a2s(), and handle_client_address_to_string().

375 {
376  struct TransportPlugin *pos;
377  char *stripped = GNUNET_strdup (name);
378  char *sep = strchr (stripped, '_');
379 
380  if (NULL != sep)
381  sep[0] = '\0';
382  for (pos = plugins_head; NULL != pos; pos = pos->next)
383  if (pos->short_name == strstr (pos->short_name, stripped))
384  break;
385  GNUNET_free (stripped);
386  if (NULL == pos)
387  return NULL;
388  return pos->api;
389 }
char * short_name
Short name for the plugin (i.e.
struct TransportPlugin * next
This is a doubly-linked list.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
static struct TransportPlugin * plugins_head
Head of DLL of all loaded plugins.
const char * name
Entry in doubly-linked list of all of our plugins.
struct GNUNET_TRANSPORT_PluginFunctions * api
API of the transport as returned by the plugin's initialization function.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the caller graph for this function:

◆ GST_plugins_a2s()

const char* GST_plugins_a2s ( const struct GNUNET_HELLO_Address address)

Convert a given address to a human-readable format.

Note that the return value will be overwritten on the next call to this function.

Parameters
addressthe address to convert
Returns
statically allocated (!) human-readable address

Definition at line 400 of file gnunet-service-transport_plugins.c.

References GNUNET_HELLO_Address::address, GNUNET_HELLO_Address::address_length, GNUNET_TRANSPORT_PluginFunctions::address_to_string, TransportPlugin::api, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_snprintf(), GST_plugins_printer_find(), GNUNET_HELLO_Address::transport_name, and TRANSPORT_SESSION_INBOUND_STRING.

Referenced by add_valid_address(), connect_bl_check_cont(), GST_ats_add_address(), GST_ats_add_inbound_address(), GST_ats_block_address(), GST_ats_expire_address(), GST_ats_update_utilization(), GST_hello_modify_addresses(), GST_neighbours_session_terminated(), GST_neighbours_switch_to_address(), GST_receive_callback(), GST_validation_handle_address(), GST_validation_handle_ping(), GST_validation_handle_pong(), neighbours_changed_notification(), plugin_env_session_end(), plugin_env_session_start(), plugin_env_session_start_bl_check_cont(), revalidate_address(), send_peer_information(), send_session_syn_ack_cont(), send_syn(), send_syn_ack_message(), set_alternative_address(), set_primary_address(), switch_address_bl_check_cont(), transmit_ping_if_allowed(), and unblock_address().

401 {
403  static char unable_to_show[1024];
404  static const char *s;
405 
406  if (NULL == address)
407  return "<NULL>";
408  if (0 == address->address_length)
409  return TRANSPORT_SESSION_INBOUND_STRING; /* Addresse with length 0 are inbound, address->address itself may be NULL */
410  api = GST_plugins_printer_find (address->transport_name);
411  if (NULL == api)
412  {
414  "Failed to find transport plugin `%s'\n",
415  address->transport_name);
416  return "<plugin unknown>";
417  }
418  if (0 == address->address_length)
419  {
420  GNUNET_snprintf (unable_to_show,
421  sizeof (unable_to_show),
422  "<unable to stringify %u-byte long address of %s transport>",
423  (unsigned int) address->address_length,
424  address->transport_name);
425  return unable_to_show;
426  }
427  return (NULL != (s = api->address_to_string (NULL,
428  address->address,
429  address->address_length))
430  ? s
431  : "<invalid>");
432 }
size_t address_length
Number of bytes in address.
GNUNET_TRANSPORT_AddressToString address_to_string
Function that will be called to convert a binary address to a string (numeric conversion only)...
const void * address
Binary representation of the address (plugin-specific).
int GNUNET_snprintf(char *buf, size_t size, const char *format,...)
Like snprintf, just aborts if the buffer is of insufficient size.
Each plugin is required to return a pointer to a struct of this type as the return value from its ent...
#define TRANSPORT_SESSION_INBOUND_STRING
struct GNUNET_TRANSPORT_PluginFunctions * GST_plugins_printer_find(const char *name)
Obtain the plugin API based on a the stripped plugin name after the underscore.
const char * transport_name
Name of the transport plugin enabling the communication using this address.
#define GNUNET_log(kind,...)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_plugins_monitor_subscribe()

void GST_plugins_monitor_subscribe ( GNUNET_TRANSPORT_SessionInfoCallback  cb,
void *  cb_cls 
)

Register callback with all plugins to monitor their status.

Parameters
cbcallback to register, NULL to unsubscribe
cb_clsclosure for cb

Definition at line 442 of file gnunet-service-transport_plugins.c.

References TransportPlugin::api, GNUNET_TRANSPORT_PluginFunctions::cls, GNUNET_break, TransportPlugin::next, and GNUNET_TRANSPORT_PluginFunctions::setup_monitor.

Referenced by handle_client_monitor_plugins(), and plugin_session_info_cb().

444 {
445  struct TransportPlugin *pos;
446 
447  for (pos = plugins_head; NULL != pos; pos = pos->next)
448  if (NULL == pos->api->setup_monitor)
449  GNUNET_break (0);
450  else
451  pos->api->setup_monitor (pos->api->cls,
452  cb,
453  cb_cls);
454 }
struct TransportPlugin * next
This is a doubly-linked list.
GNUNET_TRANSPORT_SessionMonitorSetup setup_monitor
Function to monitor the sessions managed by the plugin.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
void * cls
Closure for all of the callbacks.
static struct TransportPlugin * plugins_head
Head of DLL of all loaded plugins.
Entry in doubly-linked list of all of our plugins.
struct GNUNET_TRANSPORT_PluginFunctions * api
API of the transport as returned by the plugin&#39;s initialization function.
Here is the caller graph for this function:

Variable Documentation

◆ plugins_head

struct TransportPlugin* plugins_head
static

Head of DLL of all loaded plugins.

Definition at line 74 of file gnunet-service-transport_plugins.c.

Referenced by GST_plugins_load().

◆ plugins_tail

struct TransportPlugin* plugins_tail
static

Head of DLL of all loaded plugins.

Definition at line 79 of file gnunet-service-transport_plugins.c.