eive-obsw/thirdparty/libcsp/src/rtable/csp_rtable_static.c
2021-03-04 18:29:28 +01:00

129 lines
3.6 KiB
C

/*
Cubesat Space Protocol - A small network-layer protocol designed for Cubesats
Copyright (C) 2012 GomSpace ApS (http://www.gomspace.com)
Copyright (C) 2012 AAUSAT3 Project (http://aausat3.space.aau.dk)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <csp/csp.h>
#include <stdio.h>
/* Local typedef for routing table */
typedef struct __attribute__((__packed__)) csp_rtable_s {
csp_iface_t * interface;
uint8_t mac;
} csp_rtable_t;
/* Static storage context for routing table */
static csp_rtable_t routes[CSP_ROUTE_COUNT] = {};
/**
* Find entry in static routing table
* This is done by table lookup with fallback to the default route
* The reason why the csp_rtable_t struct is not returned directly
* is that we wish to hide the storage format, mainly because of
* the alternative routing table storage (cidr).
* @param id Node
* @return pointer to found routing entry
*/
static csp_rtable_t * csp_rtable_find(uint8_t id) {
if (routes[id].interface != NULL) {
return &routes[id];
} else if (routes[CSP_DEFAULT_ROUTE].interface != NULL) {
return &routes[CSP_DEFAULT_ROUTE];
}
return NULL;
}
csp_iface_t * csp_rtable_find_iface(uint8_t id) {
csp_rtable_t * route = csp_rtable_find(id);
if (route == NULL)
return NULL;
return route->interface;
}
uint8_t csp_rtable_find_mac(uint8_t id) {
csp_rtable_t * route = csp_rtable_find(id);
if (route == NULL)
return 255;
return route->mac;
}
void csp_rtable_clear(void) {
memset(routes, 0, sizeof(routes[0]) * CSP_ROUTE_COUNT);
}
void csp_route_table_load(uint8_t route_table_in[CSP_ROUTE_TABLE_SIZE]) {
memcpy(routes, route_table_in, sizeof(routes[0]) * CSP_ROUTE_COUNT);
}
void csp_route_table_save(uint8_t route_table_out[CSP_ROUTE_TABLE_SIZE]) {
memcpy(route_table_out, routes, sizeof(routes[0]) * CSP_ROUTE_COUNT);
}
int csp_rtable_set(uint8_t node, uint8_t mask, csp_iface_t *ifc, uint8_t mac) {
/* Don't add nothing */
if (ifc == NULL)
return CSP_ERR_INVAL;
/**
* Check if the interface has been added.
*
* NOTE: For future implementations, interfaces should call
* csp_route_add_if in its csp_if_<name>_init function, instead
* of registering at first route_set, in order to make the interface
* available to network based (CMP) route configuration.
*/
csp_iflist_add(ifc);
/* Set route */
if (node <= CSP_DEFAULT_ROUTE) {
routes[node].interface = ifc;
routes[node].mac = mac;
} else {
csp_log_error("Failed to set route: invalid node id %u", node);
return CSP_ERR_INVAL;
}
return CSP_ERR_NONE;
}
void csp_rtable_load(const char * buffer) {
}
int csp_rtable_check(const char * buffer) {
return -1;
}
#ifdef CSP_DEBUG
void csp_rtable_print(void) {
int i;
printf("Node Interface Address\r\n");
for (i = 0; i < CSP_DEFAULT_ROUTE; i++)
if (routes[i].interface != NULL)
printf("%4u %-9s %u\r\n", i,
routes[i].interface->name,
routes[i].mac == CSP_NODE_MAC ? i : routes[i].mac);
printf(" * %-9s %u\r\n", routes[CSP_DEFAULT_ROUTE].interface->name, routes[CSP_DEFAULT_ROUTE].mac);
}
#endif