GNUnet 0.21.0
arm_monitor_api.c File Reference

API for monitoring the ARM service. More...

#include "platform.h"
#include "gnunet_arm_service.h"
#include "gnunet_util_lib.h"
#include "gnunet_protocols.h"
#include "arm.h"
Include dependency graph for arm_monitor_api.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_ARM_MonitorHandle
 Handle for interacting with ARM. More...
 

Macros

#define INIT_TIMEOUT   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
 
#define LOG(kind, ...)   GNUNET_log_from (kind, "arm-monitor-api", __VA_ARGS__)
 

Functions

static int reconnect_arm_monitor (struct GNUNET_ARM_MonitorHandle *h)
 Connect to the ARM service for monitoring. More...
 
static void reconnect_arm_monitor_task (void *cls)
 Task scheduled to try to re-connect to arm. More...
 
static void reconnect_arm_monitor_later (struct GNUNET_ARM_MonitorHandle *h)
 Close down any existing connection to the ARM service and try re-establishing it later. More...
 
static int check_monitor_notify (void *cls, const struct GNUNET_ARM_StatusMessage *msg)
 Check notification messages received from ARM is well-formed. More...
 
static void handle_monitor_notify (void *cls, const struct GNUNET_ARM_StatusMessage *res)
 Handler for notification messages received from ARM. More...
 
static void mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue. More...
 
struct GNUNET_ARM_MonitorHandleGNUNET_ARM_monitor_start (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_ARM_ServiceMonitorCallback cont, void *cont_cls)
 Setup a context for monitoring ARM, then start connecting to the ARM service for monitoring using that context. More...
 
void GNUNET_ARM_monitor_stop (struct GNUNET_ARM_MonitorHandle *h)
 Disconnect from the ARM service (if connected) and destroy the context. More...
 

Detailed Description

API for monitoring the ARM service.

Author
Christian Grothoff
LRN

Definition in file arm_monitor_api.c.

Macro Definition Documentation

◆ INIT_TIMEOUT

Definition at line 33 of file arm_monitor_api.c.

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "arm-monitor-api", __VA_ARGS__)

Definition at line 35 of file arm_monitor_api.c.

Function Documentation

◆ reconnect_arm_monitor()

static int reconnect_arm_monitor ( struct GNUNET_ARM_MonitorHandle h)
static

Connect to the ARM service for monitoring.

Parameters
hhandle to connect
Returns
GNUNET_OK on success

Definition at line 194 of file arm_monitor_api.c.

195{
197 { GNUNET_MQ_hd_var_size (monitor_notify,
200 h),
203 struct GNUNET_MQ_Envelope *env;
204
205 GNUNET_assert (NULL == h->mq);
207 if (NULL == h->mq)
208 {
209 if (NULL != h->service_status)
210 h->service_status (h->service_status_cls,
211 NULL,
213 return GNUNET_SYSERR;
214 }
217 return GNUNET_OK;
218}
struct GNUNET_MQ_MessageHandlers handlers[]
Definition: 003.c:1
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
@ GNUNET_ARM_SERVICE_STOPPED
Service was stopped.
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:1057
@ GNUNET_OK
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:304
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:78
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MESSAGE_TYPE_ARM_STATUS
Status update from ARM.
#define GNUNET_MESSAGE_TYPE_ARM_MONITOR
Request to ARM to notify client of service status changes.
struct GNUNET_MQ_Handle * mq
Our connection to the ARM service.
Definition: arm_api.c:107
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration that we are using.
Definition: arm_api.c:112
Status update from ARM to client.
Definition: arm.h:42
Message handler for a specific message type.
Header for all communications.

References GNUNET_ARM_Handle::cfg, env, GNUNET_ARM_SERVICE_STOPPED, GNUNET_assert, GNUNET_CLIENT_connect(), GNUNET_MESSAGE_TYPE_ARM_MONITOR, GNUNET_MESSAGE_TYPE_ARM_STATUS, GNUNET_MQ_handler_end, GNUNET_MQ_hd_var_size, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_OK, GNUNET_SYSERR, h, handlers, GNUNET_ARM_Handle::mq, mq_error_handler(), and msg.

Referenced by GNUNET_ARM_monitor_start(), and reconnect_arm_monitor_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ reconnect_arm_monitor_task()

static void reconnect_arm_monitor_task ( void *  cls)
static

Task scheduled to try to re-connect to arm.

Parameters
clsthe struct GNUNET_ARM_MonitorHandle

Definition at line 90 of file arm_monitor_api.c.

91{
92 struct GNUNET_ARM_MonitorHandle *h = cls;
93
94 h->reconnect_task = NULL;
96 "Connecting to ARM service for monitoring after delay\n");
98}
static int reconnect_arm_monitor(struct GNUNET_ARM_MonitorHandle *h)
Connect to the ARM service for monitoring.
#define LOG(kind,...)
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_DEBUG
struct GNUNET_SCHEDULER_Task * reconnect_task
ID of the reconnect task (if any).
Definition: arm_api.c:147
Handle for interacting with ARM.

References GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_OK, h, LOG, reconnect_arm_monitor(), and GNUNET_ARM_Handle::reconnect_task.

Referenced by reconnect_arm_monitor_later().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ reconnect_arm_monitor_later()

static void reconnect_arm_monitor_later ( struct GNUNET_ARM_MonitorHandle h)
static

Close down any existing connection to the ARM service and try re-establishing it later.

Parameters
hour handle

Definition at line 108 of file arm_monitor_api.c.

109{
110 if (NULL != h->mq)
111 {
113 h->mq = NULL;
114 }
115 GNUNET_assert (NULL == h->reconnect_task);
118 h);
120}
static void reconnect_arm_monitor_task(void *cls)
Task scheduled to try to re-connect to arm.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:683
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1272
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
struct GNUNET_TIME_Relative retry_backoff
Current delay we use for re-trying to connect to core.
Definition: arm_api.c:152

References GNUNET_assert, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_STD_BACKOFF, h, GNUNET_ARM_Handle::mq, reconnect_arm_monitor_task(), GNUNET_ARM_Handle::reconnect_task, and GNUNET_ARM_Handle::retry_backoff.

Referenced by mq_error_handler().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_monitor_notify()

static int check_monitor_notify ( void *  cls,
const struct GNUNET_ARM_StatusMessage msg 
)
static

Check notification messages received from ARM is well-formed.

Parameters
clsour struct GNUNET_ARM_MonitorHandle
msgthe message received from the arm service
Returns
GNUNET_OK if the message is well-formed

Definition at line 131 of file arm_monitor_api.c.

132{
133 size_t sl =
134 ntohs (msg->header.size) - sizeof(struct GNUNET_ARM_StatusMessage);
135 const char *name = (const char *) &msg[1];
136
137 (void) cls;
138 if ((0 == sl) || ('\0' != name[sl - 1]))
139 {
140 GNUNET_break (0);
141 return GNUNET_SYSERR;
142 }
143 return GNUNET_OK;
144}
static char * name
Name (label) of the records to list.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, msg, name, and GNUNET_MessageHeader::size.

◆ handle_monitor_notify()

static void handle_monitor_notify ( void *  cls,
const struct GNUNET_ARM_StatusMessage res 
)
static

Handler for notification messages received from ARM.

Parameters
clsour struct GNUNET_ARM_MonitorHandle
resthe message received from the arm service

Definition at line 154 of file arm_monitor_api.c.

155{
156 struct GNUNET_ARM_MonitorHandle *h = cls;
158
159 status = (enum GNUNET_ARM_ServiceMonitorStatus) ntohl (res->status);
161 "Received notification from ARM for service `%s' with status %d\n",
162 (const char *) &res[1],
163 (int) status);
164 if (NULL != h->service_status)
165 h->service_status (h->service_status_cls, (const char *) &res[1], status);
166}
static char * res
Currently read line or NULL on EOF.
static int status
The program status; 0 for success.
Definition: gnunet-nse.c:38
GNUNET_ARM_ServiceMonitorStatus
Statuses of services.

References GNUNET_ERROR_TYPE_DEBUG, h, LOG, res, and status.

◆ mq_error_handler()

static void mq_error_handler ( void *  cls,
enum GNUNET_MQ_Error  error 
)
static

Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue.

Not every message queue implementation supports an error handler.

Parameters
clsclosure with the struct GNUNET_ARM_MonitorHandle *
errorerror code

Definition at line 178 of file arm_monitor_api.c.

179{
180 struct GNUNET_ARM_MonitorHandle *h = cls;
181
182 (void) error;
184}
static void reconnect_arm_monitor_later(struct GNUNET_ARM_MonitorHandle *h)
Close down any existing connection to the ARM service and try re-establishing it later.

References h, and reconnect_arm_monitor_later().

Referenced by reconnect_arm_monitor().

Here is the call graph for this function:
Here is the caller graph for this function: