Merge pull request #3157 from BytesGalore/fib_host_prefix_flags

net/fib: Added network prefix flag to indicate a network destination
cc430
Cenk Gündoğan 8 years ago
commit be7a34b1b8

@ -76,6 +76,11 @@ typedef struct fib_destination_set_entry_t {
*/
#define FIB_FLAG_RPL_ROUTE (1UL << 0)
/**
* @brief flag to identify if the FIB-Entry is a net prefix (MSB == 1)
*/
#define FIB_FLAG_NET_PREFIX (1UL<<31)
/**
* @brief initializes all FIB entries with 0
*

@ -242,7 +242,8 @@ void gnrc_rpl_parent_update(gnrc_rpl_dodag_t *dodag, gnrc_rpl_parent_t *parent)
ipv6_addr_t all_RPL_nodes = GNRC_RPL_ALL_NODES_ADDR;
kernel_pid_t if_id;
if ((if_id = gnrc_ipv6_netif_find_by_addr(NULL, &all_RPL_nodes)) != KERNEL_PID_UNDEF) {
fib_add_entry(&gnrc_ipv6_fib_table, if_id, def.u8, sizeof(ipv6_addr_t), 0x0,
fib_add_entry(&gnrc_ipv6_fib_table, if_id, def.u8, sizeof(ipv6_addr_t),
(FIB_FLAG_NET_PREFIX | 0x0),
parent->addr.u8, sizeof(ipv6_addr_t), FIB_FLAG_RPL_ROUTE,
(dodag->default_lifetime * dodag->lifetime_unit) * SEC_IN_MS);
}
@ -304,7 +305,7 @@ static gnrc_rpl_parent_t *_gnrc_rpl_find_preferred_parent(gnrc_rpl_dodag_t *doda
}
fib_add_entry(&gnrc_ipv6_fib_table, if_id, def.u8, sizeof(ipv6_addr_t),
0x0, dodag->parents->addr.u8, sizeof(ipv6_addr_t),
(FIB_FLAG_NET_PREFIX | 0x0), dodag->parents->addr.u8, sizeof(ipv6_addr_t),
FIB_FLAG_RPL_ROUTE, (dodag->default_lifetime * dodag->lifetime_unit)
* SEC_IN_MS);
}

@ -132,15 +132,18 @@ static int fib_find_entry(fib_table_t *table, uint8_t *dst, size_t dst_size,
}
else {
/* we try to find the most fitting prefix */
if (ret_comp == 1) {
entry_arr[0] = &(table->data.entries[i]);
/* we could find a better one so we move on */
ret = 0;
prefix_size = match_size;
match_size = dst_size << 3;
count = 1;
if ((ret_comp == 1)
&& (table->data.entries[i].global_flags & FIB_FLAG_NET_PREFIX)) {
if ((prefix_size == 0) || (match_size > prefix_size)) {
entry_arr[0] = &(table->data.entries[i]);
/* we could find a better one so we move on */
ret = 0;
prefix_size = match_size;
count = 1;
}
}
match_size = dst_size<<3;
}
}
}
@ -1499,6 +1502,7 @@ void fib_print_routes(fib_table_t *table)
{
mutex_lock(&(table->mtx_access));
uint64_t now = xtimer_now64();
if (table->table_type == FIB_TABLE_TYPE_SH) {
printf("%-" FIB_ADDR_PRINT_LENS "s %-6s %-" FIB_ADDR_PRINT_LENS "s %-6s %-16s Interface\n"
, "Destination", "Flags", "Next Hop", "Flags", "Expires");
@ -1507,9 +1511,14 @@ void fib_print_routes(fib_table_t *table)
if (table->data.entries[i].lifetime != 0) {
fib_print_address(table->data.entries[i].global);
printf(" 0x%04"PRIx32" ", table->data.entries[i].global_flags);
if(table->data.entries[i].global_flags & FIB_FLAG_NET_PREFIX) {
printf("N ");
} else {
printf("H ");
}
fib_print_address(table->data.entries[i].next_hop);
printf(" 0x%04"PRIx32" ", table->data.entries[i].next_hop_flags);
if (table->data.entries[i].lifetime != FIB_LIFETIME_NO_EXPIRE) {
uint64_t tm = table->data.entries[i].lifetime - now;

@ -492,20 +492,24 @@ static void test_fib_14_exact_and_prefix_match(void)
snprintf(addr_dst, add_buf_size, "Test addr12");
snprintf(addr_nxt, add_buf_size, "Test address %02d", 12);
fib_add_entry(&test_fib_table, 42, (uint8_t *)addr_dst,
add_buf_size - 1, 0x12, (uint8_t *)addr_nxt, add_buf_size - 1,
add_buf_size - 1, (FIB_FLAG_NET_PREFIX | 0x12),
(uint8_t *)addr_nxt, add_buf_size - 1,
0x12, 100000);
snprintf(addr_dst, add_buf_size, "Test addr123");
snprintf(addr_nxt, add_buf_size, "Test address %02d", 23);
fib_add_entry(&test_fib_table, 42, (uint8_t *)addr_dst,
add_buf_size - 1, 0x123, (uint8_t *)addr_nxt, add_buf_size - 1,
add_buf_size - 1, (FIB_FLAG_NET_PREFIX | 0x123),
(uint8_t *)addr_nxt, add_buf_size - 1,
0x23, 100000);
snprintf(addr_dst, add_buf_size, "Test addr1234");
snprintf(addr_nxt, add_buf_size, "Test address %02d", 34);
fib_add_entry(&test_fib_table, 42, (uint8_t *)addr_dst,
add_buf_size - 1, 0x1234, (uint8_t *)addr_nxt, add_buf_size - 1,
add_buf_size - 1, (FIB_FLAG_NET_PREFIX | 0x1234),
(uint8_t *)addr_nxt, add_buf_size - 1,
0x34, 100000);
memset(addr_lookup, 0, add_buf_size);
@ -609,12 +613,14 @@ static void test_fib_16_prefix_match(void)
addr_lookup[14] = (char)0x87; /* 1000 0111 */
fib_add_entry(&test_fib_table, 42, (uint8_t *)addr_dst,
add_buf_size - 1, 0x123, (uint8_t *)addr_nxt, add_buf_size - 1,
add_buf_size - 1, (FIB_FLAG_NET_PREFIX | 0x123),
(uint8_t *)addr_nxt, add_buf_size - 1,
0x23, 100000);
addr_dst[14] = (char)0x3c; /* 0011 1100 */
fib_add_entry(&test_fib_table, 42, (uint8_t *)addr_dst,
add_buf_size - 1, 0x123, (uint8_t *)addr_nxt, add_buf_size - 1,
add_buf_size - 1, (FIB_FLAG_NET_PREFIX | 0x123),
(uint8_t *)addr_nxt, add_buf_size - 1,
0x23, 100000);
memset(addr_nxt, 0, add_buf_size);
@ -631,7 +637,8 @@ static void test_fib_16_prefix_match(void)
add_buf_size = 16;
fib_add_entry(&test_fib_table, 42, (uint8_t *)addr_dst,
add_buf_size - 1, 0x123, (uint8_t *)addr_nxt, add_buf_size -
add_buf_size - 1, (FIB_FLAG_NET_PREFIX | 0x123),
(uint8_t *)addr_nxt, add_buf_size -
1, 0x23, 100000);
memset(addr_nxt, 0, add_buf_size);
@ -687,6 +694,9 @@ static void test_fib_17_get_entry_set(void)
fib_destination_set_entry_t arr_dst[arr_size];
char prefix[addr_buf_size];
memset(prefix,0, addr_buf_size);
/* cppcheck: prefix is set to all 0 before adding an address
*/
/* cppcheck-suppress redundantCopy */
snprintf(prefix, addr_buf_size, "Test address 1");
int ret = fib_get_destination_set(&test_fib_table,
@ -699,6 +709,9 @@ static void test_fib_17_get_entry_set(void)
arr_size = 20;
memset(prefix,0, addr_buf_size);
/* cppcheck: prefix is set to all 0 before adding an address
*/
/* cppcheck-suppress redundantCopy */
snprintf(prefix, addr_buf_size, "Test address 0");
ret = fib_get_destination_set(&test_fib_table,
@ -800,7 +813,8 @@ static void test_fib_19_default_gateway(void)
/* add a default gateway entry */
fib_add_entry(&test_fib_table, 42, (uint8_t *)addr_dst,
add_buf_size, 0x123, (uint8_t *)addr_nxt, add_buf_size, 0x23,
add_buf_size, (FIB_FLAG_NET_PREFIX | 0x123),
(uint8_t *)addr_nxt, add_buf_size, 0x23,
100000);
/* check if it matches all */
@ -876,7 +890,8 @@ static void test_fib_20_replace_prefix(void)
/* add a prefix entry */
fib_add_entry(&test_fib_table, 42, (uint8_t *)addr_dst,
add_buf_size, 0x123, (uint8_t *)addr_nxt, add_buf_size, 0x23,
add_buf_size, (FIB_FLAG_NET_PREFIX | 0x123),
(uint8_t *)addr_nxt, add_buf_size, 0x23,
100000);
/* check if it matches */
@ -905,7 +920,8 @@ static void test_fib_20_replace_prefix(void)
/* change the prefix entry */
fib_add_entry(&test_fib_table, 42, (uint8_t *)addr_dst,
add_buf_size, 0x123, (uint8_t *)addr_nxt, add_buf_size, 0x24,
add_buf_size, (FIB_FLAG_NET_PREFIX | 0x123),
(uint8_t *)addr_nxt, add_buf_size, 0x24,
100000);
/* and check again if it matches */

Loading…
Cancel
Save