eive-obsw/gomspace/libgscsp/include/gs/csp/service_dispatcher.h
2020-11-19 18:24:03 +01:00

125 lines
3.8 KiB
C

#ifndef LIBGSCSP_INCLUDE_GS_CSP_SERVICE_DISPATCHER_H
#define LIBGSCSP_INCLUDE_GS_CSP_SERVICE_DISPATCHER_H
/* Copyright (c) 2013-2018 GomSpace A/S. All rights reserved. */
/**
@file
CSP Service Dispatcher.
The dispatcher is a task/thread, listening on a configured number of ports and forwards the the incoming connection
to a configured CSP service handler.
The dispatcher touches a software watchdog for every handled connection.
*/
#include <gs/csp/service_handler.h>
#include <gs/csp/port.h>
#include <gs/util/thread.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
CSP service dispatcher configuration.
*/
typedef struct {
/**
Name of dispatcher.
*/
const char * name;
/**
Array of service handlers - index'ed by CSP port number.
*/
const gs_csp_service_handler_t * handler_array;
/**
Array size of \a handler_array.
*/
unsigned int handler_array_size;
/**
Bind to any unbound ports (CSP_ANY).
Only one task/dispatcher can bind to any ports. This can be used to log unexpected incoming connections.
*/
bool bind_any;
/**
Disable watchdog.
The watchdog is created with a fixed timeout of 20 seconds.
*/
bool disable_watchdog;
/**
CSP connection backlog.
If 0 (zero), the backlog is set to 10.
*/
size_t listen_backlog;
/**
Callback after timeout or processsed connection.
The return value is the next timeout in milli seconds.
Return UINT32_MAX to use default timeout.
*/
unsigned int (*callback)(void);
/**
Socket options.
*/
uint32_t socket_options;
} gs_csp_service_dispatcher_conf_t;
/**
Basic CSP service handlers.
Can be used to configure handlers for all basic CSP services.
*/
#define GS_CSP_BASIC_SERVICE_HANDLERS \
[GS_CSP_CMP] = gs_csp_cmp_service_handler, \
[GS_CSP_PING] = gs_csp_ping_service_handler, \
[GS_CSP_PS] = gs_csp_ps_service_handler, \
[GS_CSP_MEMFREE] = gs_csp_mem_free_service_handler, \
[GS_CSP_REBOOT] = gs_csp_reboot_service_handler, \
[GS_CSP_BUF_FREE] = gs_csp_buf_free_service_handler, \
[GS_CSP_UPTIME] = gs_csp_uptime_service_handler
/**
Service dispatcher handle.
@see gs_csp_service_dispatcher_create(), gs_csp_service_dispatcher_close()
*/
typedef struct gs_csp_service_dispatcher * gs_csp_service_dispatcher_t;
/**
Create service dispatcher (task/thread).
@param[in] conf configuration - must remain valid as long as the dispatcher is running.
@param[in] stack_size thread stack size.
@param[in] priority thread priority.
@param[out] return_handle created dispatcher - use NULL if not used.
@return_gs_error_t
*/
gs_error_t gs_csp_service_dispatcher_create(const gs_csp_service_dispatcher_conf_t * conf,
size_t stack_size,
gs_thread_priority_t priority,
gs_csp_service_dispatcher_t * return_handle);
/**
Wake up service dispatcher.
This will cause the disapther to wake up (from listing for new connections), and invoke the configured \a callback function,
before listing for new connections.
@param[in] handle dispatcher.
@return_gs_error_t
*/
gs_error_t gs_csp_service_dispatcher_wake_up(gs_csp_service_dispatcher_t handle);
/**
Destroy/close service dispatcher (for testing).
Signal stop to the dispatcher and waits for it to terminate (join).
@note Join is performed, which may hang forever if the dispatcher doesn't respond to the stop request.
@param[in] handle dispatcher.
@return_gs_error_t
*/
gs_error_t gs_csp_service_dispatcher_destroy(gs_csp_service_dispatcher_t handle);
#ifdef __cplusplus
}
#endif
#endif