Browse Source

sys: net: fib: switch to xtimer

dev/timer
Kaspar Schleiser 8 years ago
parent
commit
5a485c3f73
  1. 3
      Makefile.dep
  2. 7
      sys/include/net/fib.h
  3. 5
      sys/include/net/fib/table.h
  4. 66
      sys/net/network_layer/fib/fib.c
  5. 4
      sys/shell/commands/sc_fib.c
  6. 15
      tests/unittests/tests-fib/tests-fib.c

3
Makefile.dep

@ -283,8 +283,7 @@ endif
ifneq (,$(filter fib,$(USEMODULE)))
USEMODULE += universal_address
USEMODULE += timex
USEMODULE += vtimer
USEMODULE += xtimer
USEMODULE += net_help
endif

7
sys/include/net/fib.h

@ -23,9 +23,10 @@
#ifndef FIB_H_
#define FIB_H_
#include <stdint.h>
#include "net/fib/table.h"
#include "kernel_types.h"
#include "timex.h"
#ifdef __cplusplus
extern "C" {
@ -59,7 +60,7 @@ typedef struct fib_destination_set_entry_t {
/**
* @brief indicator of a lifetime that does not expire (2^32 - 1)
*/
#define FIB_LIFETIME_NO_EXPIRE (0xFFFFFFFF)
#define FIB_LIFETIME_NO_EXPIRE (0xFFFFFFFFffffffff)
/**
* @brief initializes all FIB entries with 0
@ -227,7 +228,7 @@ void fib_print_routes(fib_table_t *table);
* @return 0 on success: entry for dst found and lifetime copied
* -EHOSTUNREACH if no fitting entry is available
*/
int fib_devel_get_lifetime(fib_table_t *table, timex_t *lifetime, uint8_t *dst,
int fib_devel_get_lifetime(fib_table_t *table, uint64_t *lifetime, uint8_t *dst,
size_t dst_size);
#endif

5
sys/include/net/fib/table.h

@ -20,7 +20,8 @@
#define FIB_TABLE_H_
#include <stdint.h>
#include "vtimer.h"
#include "kernel_types.h"
#include "universal_address.h"
#ifdef __cplusplus
@ -34,7 +35,7 @@ typedef struct fib_entry_t {
/** interface ID */
kernel_pid_t iface_id;
/** Lifetime of this entry (an absolute time-point is stored by the FIB) */
timex_t lifetime;
uint64_t lifetime;
/** Unique identifier for the type of the global address */
uint32_t global_flags;
/** Pointer to the shared generic address */

66
sys/net/network_layer/fib/fib.c

@ -27,6 +27,7 @@
#include "thread.h"
#include "mutex.h"
#include "msg.h"
#include "xtimer.h"
#define ENABLE_DEBUG (0)
#include "debug.h"
@ -79,15 +80,13 @@ static kernel_pid_t notify_rp[FIB_MAX_REGISTERED_RP];
static universal_address_container_t* prefix_rp[FIB_MAX_REGISTERED_RP];
/**
* @brief convert given ms to a point in time from now on in the future
* @param[in] ms the milliseconds to be converted
* @param[out] timex the converted point in time
* @brief convert an offset given in ms to abolute time in time in us
* @param[in] ms the milliseconds to be converted
* @param[out] target the converted point in time
*/
static void fib_ms_to_timex(uint32_t ms, timex_t *timex)
static void fib_lifetime_to_absolute(uint32_t ms, uint64_t *target)
{
vtimer_now(timex);
timex->seconds += ms / 1000;
timex->microseconds += (ms - timex->seconds * 1000) * 1000;
*target = xtimer_now64() + (ms * 1000);
}
/**
@ -106,8 +105,7 @@ static void fib_ms_to_timex(uint32_t ms, timex_t *timex)
*/
static int fib_find_entry(fib_table_t *table, uint8_t *dst, size_t dst_size,
fib_entry_t **entry_arr, size_t *entry_arr_size) {
timex_t now;
vtimer_now(&now);
uint64_t now = xtimer_now64();
size_t count = 0;
size_t prefix_size = 0;
@ -125,14 +123,12 @@ static int fib_find_entry(fib_table_t *table, uint8_t *dst, size_t dst_size,
for (size_t i = 0; i < table->size; ++i) {
/* autoinvalidate if the entry lifetime is not set to not expire */
if ((table->entries[i].lifetime.seconds != FIB_LIFETIME_NO_EXPIRE)
|| (table->entries[i].lifetime.microseconds != FIB_LIFETIME_NO_EXPIRE)) {
if (table->entries[i].lifetime != FIB_LIFETIME_NO_EXPIRE) {
/* check if the lifetime expired */
if (timex_cmp(now, table->entries[i].lifetime) > -1) {
if (table->entries[i].lifetime < now) {
/* remove this entry if its lifetime expired */
table->entries[i].lifetime.seconds = 0;
table->entries[i].lifetime.microseconds = 0;
table->entries[i].lifetime = 0;
table->entries[i].global_flags = 0;
table->entries[i].next_hop_flags = 0;
table->entries[i].iface_id = KERNEL_PID_UNDEF;
@ -204,12 +200,11 @@ static int fib_upd_entry(fib_entry_t *entry, uint8_t *next_hop,
entry->next_hop = container;
entry->next_hop_flags = next_hop_flags;
if (lifetime < FIB_LIFETIME_NO_EXPIRE) {
fib_ms_to_timex(lifetime, &entry->lifetime);
if (lifetime != (uint32_t)FIB_LIFETIME_NO_EXPIRE) {
fib_lifetime_to_absolute(lifetime, &entry->lifetime);
}
else {
entry->lifetime.seconds = FIB_LIFETIME_NO_EXPIRE;
entry->lifetime.microseconds = FIB_LIFETIME_NO_EXPIRE;
entry->lifetime = FIB_LIFETIME_NO_EXPIRE;
}
return 0;
@ -237,8 +232,7 @@ static int fib_create_entry(fib_table_t *table, kernel_pid_t iface_id,
next_hop_flags, uint32_t lifetime)
{
for (size_t i = 0; i < table->size; ++i) {
if ((table->entries[i].lifetime.seconds == 0) &&
(table->entries[i].lifetime.microseconds == 0)) {
if (table->entries[i].lifetime == 0) {
table->entries[i].global = universal_address_add(dst, dst_size);
@ -252,12 +246,11 @@ static int fib_create_entry(fib_table_t *table, kernel_pid_t iface_id,
/* everything worked fine */
table->entries[i].iface_id = iface_id;
if (lifetime < FIB_LIFETIME_NO_EXPIRE) {
fib_ms_to_timex(lifetime, &table->entries[i].lifetime);
if (lifetime != (uint32_t) FIB_LIFETIME_NO_EXPIRE) {
fib_lifetime_to_absolute(lifetime, &table->entries[i].lifetime);
}
else {
table->entries[i].lifetime.seconds = FIB_LIFETIME_NO_EXPIRE;
table->entries[i].lifetime.microseconds = FIB_LIFETIME_NO_EXPIRE;
table->entries[i].lifetime = FIB_LIFETIME_NO_EXPIRE;
}
return 0;
@ -291,8 +284,7 @@ static int fib_remove(fib_entry_t *entry)
entry->next_hop_flags = 0;
entry->iface_id = KERNEL_PID_UNDEF;
entry->lifetime.seconds = 0;
entry->lifetime.microseconds = 0;
entry->lifetime = 0;
return 0;
}
@ -608,12 +600,11 @@ void fib_print_fib_table(fib_table_t *table)
mutex_lock(&mtx_access);
for (size_t i = 0; i < table->size; ++i) {
printf("[fib_print_table] %d) iface_id: %d, global: %p, next hop: %p, lifetime: %d.%d\n",
printf("[fib_print_table] %d) iface_id: %d, global: %p, next hop: %p, lifetime: %"PRIu32"\n",
(int)i, (int)table->entries[i].iface_id,
(void *)table->entries[i].global,
(void *)table->entries[i].next_hop,
(int)table->entries[i].lifetime.seconds,
(int)table->entries[i].lifetime.microseconds);
(uint32_t)(table->entries[i].lifetime / 1000));
}
mutex_unlock(&mtx_access);
@ -656,28 +647,25 @@ void fib_print_routes(fib_table_t *table)
printf("%-" FIB_ADDR_PRINT_LENS "s %-6s %-" FIB_ADDR_PRINT_LENS "s %-6s %-16s Interface\n"
, "Destination", "Flags", "Next Hop", "Flags", "Expires");
timex_t now;
vtimer_now(&now);
uint64_t now = xtimer_now64();
for (size_t i = 0; i < table->size; ++i) {
if (table->entries[i].lifetime.seconds != 0 || table->entries[i].lifetime.microseconds != 0) {
if (table->entries[i].lifetime != 0) {
fib_print_address(table->entries[i].global);
printf(" 0x%04"PRIx32" ", table->entries[i].global_flags);
fib_print_address(table->entries[i].next_hop);
printf(" 0x%04"PRIx32" ", table->entries[i].next_hop_flags);
if ((table->entries[i].lifetime.seconds != FIB_LIFETIME_NO_EXPIRE)
|| (table->entries[i].lifetime.microseconds != FIB_LIFETIME_NO_EXPIRE)) {
if (table->entries[i].lifetime != FIB_LIFETIME_NO_EXPIRE) {
timex_t tm = timex_sub(table->entries[i].lifetime, now);
uint64_t tm = table->entries[i].lifetime - now;
/* we must interpret the values as signed */
if ((int32_t)tm.seconds < 0
|| (tm.seconds == 0 && (int32_t)tm.microseconds < 0)) {
if ((int64_t)tm < 0 ) {
printf("%-16s ", "EXPIRED");
}
else {
printf("%"PRIu32".%05"PRIu32, tm.seconds, tm.microseconds);
printf("%"PRIu32".%05"PRIu32, (uint32_t)(tm / 1000000), (uint32_t)(tm % 1000000));
}
}
else {
@ -692,7 +680,7 @@ void fib_print_routes(fib_table_t *table)
}
#if FIB_DEVEL_HELPER
int fib_devel_get_lifetime(fib_table_t *table, timex_t *lifetime, uint8_t *dst,
int fib_devel_get_lifetime(fib_table_t *table, uint64_t *lifetime, uint8_t *dst,
size_t dst_size)
{
size_t count = 1;

4
sys/shell/commands/sc_fib.c

@ -159,7 +159,7 @@ int _fib_route_handler(int argc, char **argv)
kernel_pid_t ifs[GNRC_NETIF_NUMOF];
size_t ifnum = gnrc_netif_get(ifs);
if (ifnum == 1) {
_fib_add(argv[2], argv[4], ifs[0], FIB_LIFETIME_NO_EXPIRE);
_fib_add(argv[2], argv[4], ifs[0], (uint32_t)FIB_LIFETIME_NO_EXPIRE);
}
else {
_fib_usage(1);
@ -190,7 +190,7 @@ int _fib_route_handler(int argc, char **argv)
if (argc == 7) {
if ((strcmp("add", argv[1]) == 0) && (strcmp("via", argv[3]) == 0)
&& (strcmp("dev", argv[5]) == 0)) {
_fib_add(argv[2], argv[4], (kernel_pid_t)atoi(argv[6]), FIB_LIFETIME_NO_EXPIRE);
_fib_add(argv[2], argv[4], (kernel_pid_t)atoi(argv[6]), (uint32_t)FIB_LIFETIME_NO_EXPIRE);
}
else {
_fib_usage(1);

15
tests/unittests/tests-fib/tests-fib.c

@ -13,7 +13,7 @@
#include <errno.h>
#include "embUnit.h"
#include "tests-fib.h"
#include "vtimer.h"
#include "xtimer.h"
#include "thread.h"
#include "net/fib.h"
@ -550,7 +550,7 @@ static void test_fib_14_exact_and_prefix_match(void)
static void test_fib_15_get_lifetime(void)
{
timex_t lifetime, now;
uint64_t lifetime, now;
kernel_pid_t iface_id = 1;
char addr_dst[] = "Test address151";
char addr_nxt[] = "Test address152";
@ -568,12 +568,13 @@ static void test_fib_15_get_lifetime(void)
add_buf_size - 1));
/* assuming some ms passed during these operations... */
vtimer_now(&now);
timex_t cmp_lifetime = timex_add(now, timex_set(0, 900000));
timex_t cmp_max_lifetime = timex_add(now, timex_set(1,1));
TEST_ASSERT_EQUAL_INT(1, timex_cmp(lifetime, cmp_lifetime));
now = xtimer_now64();
uint64_t cmp_lifetime = now + 900000lU;
uint64_t cmp_max_lifetime = now + 1100000lU;
TEST_ASSERT_EQUAL_INT(1, (lifetime > cmp_lifetime));
/* make sure lifetime hasn't grown magically either */
TEST_ASSERT_EQUAL_INT(-1, timex_cmp(lifetime, cmp_max_lifetime));
TEST_ASSERT_EQUAL_INT(1, (lifetime < cmp_max_lifetime));
fib_deinit(&test_fib_table);
}

Loading…
Cancel
Save