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 89 of file gnunet-service-transport_plugins.c.

References GST_ats_update_distance().

Referenced by GST_plugins_load().

92 {
94  distance);
95 }
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 108 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().

111 {
112  if (NULL == GST_is)
113  {
114  GNUNET_break(0);
115  return GNUNET_NT_UNSPECIFIED;
116  }
118  addr,
119  addrlen);
120 }
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:306
#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:39
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 136 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().

140 {
141  struct TransportPlugin *plug;
142  struct TransportPlugin *next;
143  unsigned long long tneigh;
144  char *libname;
145  char *plugs;
146  char *pos;
147  int fail;
148 
149  if (GNUNET_OK !=
151  "TRANSPORT",
152  "NEIGHBOUR_LIMIT",
153  &tneigh))
154  {
156  _("Transport service is lacking NEIGHBOUR_LIMIT option.\n"));
157  return;
158  }
159  if (GNUNET_OK !=
161  "TRANSPORT",
162  "PLUGINS",
163  &plugs))
164  return;
166  _("Starting transport plugins `%s'\n"),
167  plugs);
168  for (pos = strtok(plugs, " "); pos != NULL; pos = strtok(NULL, " "))
169  {
171  _("Loading `%s' transport plugin\n"),
172  pos);
173  GNUNET_asprintf(&libname,
174  "libgnunet_plugin_transport_%s",
175  pos);
176  plug = GNUNET_new(struct TransportPlugin);
177  plug->short_name = GNUNET_strdup(pos);
178  plug->lib_name = libname;
179  plug->env.cfg = GST_cfg;
182  plug->env.cls = plug->short_name;
183  plug->env.receive = recv_cb;
184  plug->env.notify_address = address_cb;
185  plug->env.session_start = session_start_cb;
186  plug->env.session_end = session_end_cb;
189  plug->env.max_connections = tneigh;
190  plug->env.stats = GST_stats;
192  plugins_tail,
193  plug);
194  }
195  GNUNET_free(plugs);
196  next = plugins_head;
197  while (NULL != next)
198  {
199  plug = next;
200  next = plug->next;
201  plug->api = GNUNET_PLUGIN_load(plug->lib_name,
202  &plug->env);
203  if (NULL == plug->api)
204  {
206  _("Failed to load transport plugin for `%s'\n"),
207  plug->lib_name);
209  plugins_tail,
210  plug);
211  GNUNET_free(plug->short_name);
212  GNUNET_free(plug->lib_name);
213  GNUNET_free(plug);
214  continue;
215  }
216  fail = GNUNET_NO;
217  if (NULL == plug->api->address_pretty_printer)
218  {
219  fail = GNUNET_YES;
221  _("Missing function `%s' in transport plugin for `%s'\n"),
222  "address_pretty_printer",
223  plug->lib_name);
224  }
225  if (NULL == plug->api->address_to_string)
226  {
227  fail = GNUNET_YES;
229  _("Missing function `%s' in transport plugin for `%s'\n"),
230  "address_to_string",
231  plug->lib_name);
232  }
233  if (NULL == plug->api->string_to_address)
234  {
235  fail = GNUNET_YES;
237  _("Missing function `%s' in transport plugin for `%s'\n"),
238  "string_to_address",
239  plug->lib_name);
240  }
241  if (NULL == plug->api->check_address)
242  {
243  fail = GNUNET_YES;
245  _("Missing function `%s' in transport plugin for `%s'\n"),
246  "check_address",
247  plug->lib_name);
248  }
249  if (NULL == plug->api->get_session)
250  {
251  fail = GNUNET_YES;
253  _("Missing function `%s' in transport plugin for `%s'\n"),
254  "get_session",
255  plug->lib_name);
256  }
257  if (NULL == plug->api->get_network)
258  {
259  fail = GNUNET_YES;
261  _("Missing function `%s' in transport plugin for `%s'\n"),
262  "get_network",
263  plug->lib_name);
264  }
265  if (NULL == plug->api->send)
266  {
267  fail = GNUNET_YES;
269  _("Missing function `%s' in transport plugin for `%s'\n"),
270  "send",
271  plug->lib_name);
272  }
273  if (NULL == plug->api->disconnect_peer)
274  {
275  fail = GNUNET_YES;
277  _("Missing function `%s' in transport plugin for `%s'\n"),
278  "disconnect_peer",
279  plug->lib_name);
280  }
281  if (NULL == plug->api->disconnect_session)
282  {
283  fail = GNUNET_YES;
285  _("Missing function `%s' in transport plugin for `%s'\n"),
286  "disconnect_session",
287  plug->lib_name);
288  }
289  if (NULL == plug->api->query_keepalive_factor)
290  {
291  fail = GNUNET_YES;
293  _("Missing function `%s' in transport plugin for `%s'\n"),
294  "query_keepalive_factor",
295  plug->lib_name);
296  }
297  if (NULL == plug->api->update_session_timeout)
298  {
299  fail = GNUNET_YES;
301  _("Missing function `%s' in transport plugin for `%s'\n"),
302  "update_session_timeout",
303  plug->lib_name);
304  }
305  if (GNUNET_YES == fail)
306  {
308  _("Did not load plugin `%s' due to missing functions\n"),
309  plug->lib_name);
310  GNUNET_break(NULL == GNUNET_PLUGIN_unload(plug->lib_name, plug->api));
312  plugins_tail,
313  plug);
314  GNUNET_free(plug->short_name);
315  GNUNET_free(plug->lib_name);
316  GNUNET_free(plug);
317  }
318  }
319 }
#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:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#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:181
void * GNUNET_PLUGIN_unload(const char *library_name, void *arg)
Unload plugin (runs the "done" callback and returns whatever "done" returned).
Definition: plugin.c:255
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:77
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:206
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 326 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().

327 {
328  struct TransportPlugin *plug;
329 
330  while (NULL != (plug = plugins_head))
331  {
332  GNUNET_break(NULL == GNUNET_PLUGIN_unload(plug->lib_name, plug->api));
333  GNUNET_free(plug->lib_name);
334  GNUNET_free(plug->short_name);
336  GNUNET_free(plug);
337  }
338 }
#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:255
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 348 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().

349 {
350  struct TransportPlugin *pos;
351 
352  for (pos = plugins_head; NULL != pos; pos = pos->next)
353  if (0 == strcmp(name, pos->short_name))
354  break;
355  if (NULL == pos)
356  return NULL;
357  return pos->api;
358 }
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 372 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().

373 {
374  struct TransportPlugin *pos;
375  char *stripped = GNUNET_strdup(name);
376  char *sep = strchr(stripped, '_');
377 
378  if (NULL != sep)
379  sep[0] = '\0';
380  for (pos = plugins_head; NULL != pos; pos = pos->next)
381  if (pos->short_name == strstr(pos->short_name, stripped))
382  break;
383  GNUNET_free(stripped);
384  if (NULL == pos)
385  return NULL;
386  return pos->api;
387 }
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 398 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().

399 {
401  static char unable_to_show[1024];
402  static const char *s;
403 
404  if (NULL == address)
405  return "<NULL>";
406  if (0 == address->address_length)
407  return TRANSPORT_SESSION_INBOUND_STRING; /* Addresse with length 0 are inbound, address->address itself may be NULL */
409  if (NULL == api)
410  {
412  "Failed to find transport plugin `%s'\n",
413  address->transport_name);
414  return "<plugin unknown>";
415  }
416  if (0 == address->address_length)
417  {
418  GNUNET_snprintf(unable_to_show,
419  sizeof(unable_to_show),
420  "<unable to stringify %u-byte long address of %s transport>",
421  (unsigned int)address->address_length,
422  address->transport_name);
423  return unable_to_show;
424  }
425  return(NULL != (s = api->address_to_string(NULL,
426  address->address,
427  address->address_length))
428  ? s
429  : "<invalid>");
430 }
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 440 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().

442 {
443  struct TransportPlugin *pos;
444 
445  for (pos = plugins_head; NULL != pos; pos = pos->next)
446  if (NULL == pos->api->setup_monitor)
447  GNUNET_break(0);
448  else
449  pos->api->setup_monitor(pos->api->cls,
450  cb,
451  cb_cls);
452 }
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 72 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 77 of file gnunet-service-transport_plugins.c.