/****************************************************************************
 * **File:** csp/csp_rtable.h
 *
 * **Description:** Routing table. The routing table maps a CSP destination address
 * to an interface (and optional a via address). Normal routing: If the route's
 * via address is set to #CSP_NO_VIA_ADDRESS, the packet will be sent directly to
 * the destination address specified in the CSP header, otherwise the packet
 * will be sent the to the route's via address.
 ****************************************************************************/
#pragma once
#include <csp/csp_iflist.h>
#ifdef __cplusplus
extern "C" {
#endif
#define CSP_NO_VIA_ADDRESS	0xFFFF
typedef struct csp_route_s {
} csp_route_t;  
[docs]/**
 * Loop through routes backwards and find routes that match on addr and mask from start_route
 */
csp_route_t * csp_rtable_search_backward(csp_route_t * start_route); 
[docs]csp_route_t * csp_rtable_find_route(uint16_t dest_address); 
[docs]/**
 * Set route to destination address/node.
 *
 * @param[in] dest_address destination address.
 * @param[in] netmask number of bits in netmask (set to -1 for maximum number of bits)
 * @param[in] ifc interface.
 * @param[in] via assosicated via address.
 * @return #CSP_ERR_NONE on success, or an error code.
 */
int csp_rtable_set(uint16_t dest_address, int netmask, csp_iface_t *ifc, uint16_t via); 
#if (CSP_HAVE_STDIO)
/**
 * Save routing table as a string (readable format).
 * @see csp_rtable_load() for additional information, e.g. format.
 *
 * @param[out] buffer user supplied buffer.
 * @param[in] buffer_size size of \a buffer.
 * @return #CSP_ERR_NONE on success, or an error code.
 */
int csp_rtable_save(char * buffer, size_t buffer_size);
/**
 * Load routing table from a string.
 * Table will be loaded on-top of existing routes, possibly overwriting existing entries.
 * Format: \<address\>[/mask] \<interface\> [via][, next entry]
 * Example: "0/0 CAN, 8 KISS, 10 I2C 10", same as "0/0 CAN, 8/5 KISS, 10/5 I2C 10".
 * @see csp_rtable_save(), csp_rtable_clear(), csp_rtable_free()
 *
 * @param[in] rtable routing table (nul terminated)
 * @return CSP_ERR or number of entries.
 */
int csp_rtable_load(const char * rtable);
/**
 * Check string for valid routing elements.
 *
 * @param[in] rtable routing table (nul terminated)
 * @return CSP_ERR or number of entries.
 */
int csp_rtable_check(const char * rtable);
#else
[docs]inline int csp_rtable_save(char * buffer, size_t buffer_size) {
   /* Avoid compiler warnings about unused parameter */
   (void)buffer;
   (void)buffer_size;
   return CSP_ERR_NOSYS;
} 
[docs]inline int csp_rtable_load(const char * rtable) {
   (void)rtable; /* Avoid compiler warnings about unused parameter */
   return CSP_ERR_NOSYS;
} 
[docs]inline int csp_rtable_check(const char * rtable) {
   (void)rtable; /* Avoid compiler warnings about unused parameter */
   return CSP_ERR_NOSYS;
} 
#endif
[docs]/**
 * Clear routing table and add loopback route.
 * @see csp_rtable_free()
 */
void csp_rtable_clear(void); 
[docs]/**
 * Clear/free all entries in the routing table.
 */
void csp_rtable_free(void); 
/** Iterator for looping through the routing table. */
typedef bool (*csp_rtable_iterator_t)(void * ctx, csp_route_t * route);
[docs]/**
 * Iterate routing table.
 */
void csp_rtable_iterate(csp_rtable_iterator_t iter, void * ctx); 
#if (CSP_ENABLE_CSP_PRINT)
/**
 * Print routing table
 */
void csp_rtable_print(void);
#else
[docs]inline void csp_rtable_print(void) {} 
#endif
#ifdef __cplusplus
}
#endif