1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

Make NCE type and status types publicly available

This commit is contained in:
authmillenon 2013-08-14 17:04:17 +02:00
parent a8d5a83cf2
commit 15290c897f
5 changed files with 56 additions and 37 deletions

View File

@ -88,16 +88,7 @@
#define ABR_CACHE_SIZE (2)
/* neighbor cache size */
#define NBR_CACHE_SIZE (8)
#define NBR_CACHE_TYPE_GC (1)
#define NBR_CACHE_TYPE_REG (2)
#define NBR_CACHE_TYPE_TEN (3)
#define NBR_CACHE_LTIME_TEN (20)
/* neighbor status values */
#define NBR_STATUS_INCOMPLETE (0)
#define NBR_STATUS_REACHABLE (1)
#define NBR_STATUS_STALE (2)
#define NBR_STATUS_DELAY (3)
#define NBR_STATUS_PROBE (4)
/* default router list size */
#define DEF_RTR_LST_SIZE (3) /* geeigneten wert finden */
@ -150,8 +141,9 @@ uint8_t recvd_pref_len = 0;
void def_rtr_lst_add(ipv6_addr_t *ipaddr, uint32_t rtr_ltime);
void def_rtr_lst_rem(ndp_default_router_list_t *entry);
uint8_t nbr_cache_add(ipv6_addr_t *ipaddr, ieee_802154_long_t *laddr,
uint8_t isrouter, uint8_t state, uint8_t type,
uint16_t ltime, ieee_802154_short_t *saddr);
uint8_t isrouter, ndp_nce_state_t state,
ndp_nce_type_t type, uint16_t ltime,
ieee_802154_short_t *saddr);
void nbr_cache_rem(ipv6_addr_t *addr);
int min(int a, int b)
@ -447,14 +439,14 @@ void recv_rtr_sol(void)
else {
/* new long addr found, update */
memcpy(&nbr_entry->laddr, &llao[2], 8);
nbr_entry->state = NBR_STATUS_STALE;
nbr_entry->state = NDP_NCE_STATUS_STALE;
nbr_entry->isrouter = 0;
}
}
else {
/* nothing found, add neigbor into cache*/
nbr_cache_add(&ipv6_buf->srcaddr, (ieee_802154_long_t *)&llao[2],
0, NBR_STATUS_STALE, NBR_CACHE_TYPE_TEN,
0, NDP_NCE_STATUS_STALE, NDP_NCE_TYPE_TENTATIVE,
NBR_CACHE_LTIME_TEN, NULL);
}
}
@ -981,7 +973,7 @@ void recv_nbr_sol(void)
}
else {
memcpy(&nbr_entry->saddr, &llao[2], 2);
nbr_entry->state = NBR_STATUS_STALE;
nbr_entry->state = NDP_NCE_STATUS_STALE;
nbr_entry->isrouter = 0;
}
@ -994,7 +986,7 @@ void recv_nbr_sol(void)
}
else {
memcpy(&nbr_entry->laddr, &llao[2], 8);
nbr_entry->state = NBR_STATUS_STALE;
nbr_entry->state = NDP_NCE_STATUS_STALE;
nbr_entry->isrouter = 0;
}
@ -1009,8 +1001,8 @@ void recv_nbr_sol(void)
switch (opt_stllao_buf->length) {
case (1): {
nbr_cache_add(&ipv6_buf->srcaddr,
NULL , 0, NBR_STATUS_STALE,
NBR_CACHE_TYPE_TEN,
NULL , 0, NDP_NCE_STATUS_STALE,
NDP_NCE_TYPE_TENTATIVE,
NBR_CACHE_LTIME_TEN,
(ieee_802154_short_t *)&llao[2]);
@ -1020,8 +1012,8 @@ void recv_nbr_sol(void)
case (2): {
nbr_cache_add(&ipv6_buf->srcaddr,
(ieee_802154_long_t *)&llao[2], 0,
NBR_STATUS_STALE,
NBR_CACHE_TYPE_TEN,
NDP_NCE_STATUS_STALE,
NDP_NCE_TYPE_TENTATIVE,
NBR_CACHE_LTIME_TEN, NULL);
break;
}
@ -1052,7 +1044,7 @@ void recv_nbr_sol(void)
/* create neighbor cache */
aro_state = nbr_cache_add(&ipv6_buf->srcaddr,
&(opt_aro_buf->eui64), 0,
NBR_STATUS_STALE, NBR_CACHE_TYPE_TEN,
NDP_NCE_STATUS_STALE, NDP_NCE_TYPE_TENTATIVE,
opt_aro_buf->reg_ltime, NULL);
}
else {
@ -1065,7 +1057,7 @@ void recv_nbr_sol(void)
}
else {
set_remaining_time(&(nbr_entry->ltime), (uint32_t)opt_aro_buf->reg_ltime);
nbr_entry->state = NBR_STATUS_STALE;
nbr_entry->state = NDP_NCE_STATUS_STALE;
nbr_entry->isrouter = 0;
memcpy(&(nbr_entry->addr.uint8[0]),
&(ipv6_buf->srcaddr.uint8[0]), 16);
@ -1223,7 +1215,7 @@ void recv_nbr_adv(void)
new_ll = memcmp(&llao[2], &(nbr_entry->laddr), 8);
}
if (nbr_entry->state == NBR_STATUS_INCOMPLETE) {
if (nbr_entry->state == NDP_NCE_STATUS_INCOMPLETE) {
if (llao == NULL) {
return;
}
@ -1232,19 +1224,19 @@ void recv_nbr_adv(void)
memcpy(&nbr_entry->laddr, &llao[2], 8);
if (nbr_adv_buf->rso & ICMPV6_NEIGHBOR_ADV_FLAG_SOLICITED) {
nbr_entry->state = NBR_STATUS_REACHABLE;
nbr_entry->state = NDP_NCE_STATUS_REACHABLE;
/* TODO: set rechability */
}
else {
nbr_entry->state = NBR_STATUS_STALE;
nbr_entry->state = NDP_NCE_STATUS_STALE;
}
nbr_entry->isrouter = nbr_adv_buf->rso & ICMPV6_NEIGHBOR_ADV_FLAG_ROUTER;
}
else {
if (new_ll && !(nbr_adv_buf->rso & ICMPV6_NEIGHBOR_ADV_FLAG_OVERRIDE)) {
if (nbr_entry->state == NBR_STATUS_REACHABLE) {
nbr_entry->state = NBR_STATUS_STALE;
if (nbr_entry->state == NDP_NCE_STATUS_REACHABLE) {
nbr_entry->state = NDP_NCE_STATUS_STALE;
}
return;
@ -1258,12 +1250,12 @@ void recv_nbr_adv(void)
}
if (nbr_adv_buf->rso & ICMPV6_NEIGHBOR_ADV_FLAG_SOLICITED) {
nbr_entry->state = NBR_STATUS_REACHABLE;
nbr_entry->state = NDP_NCE_STATUS_REACHABLE;
/* TODO: set rechablility */
}
else {
if (llao != 0 && new_ll) {
nbr_entry->state = NBR_STATUS_STALE;
nbr_entry->state = NDP_NCE_STATUS_STALE;
}
}
}
@ -1367,8 +1359,9 @@ ndp_neighbor_cache_t *ndp_neighbor_cache_search(ipv6_addr_t *ipaddr)
}
uint8_t nbr_cache_add(ipv6_addr_t *ipaddr, ieee_802154_long_t *laddr,
uint8_t isrouter, uint8_t state, uint8_t type,
uint16_t ltime, ieee_802154_short_t *saddr)
uint8_t isrouter, ndp_nce_state_t state,
ndp_nce_type_t type, uint16_t ltime,
ieee_802154_short_t *saddr)
{
if (nbr_count == NBR_CACHE_SIZE) {
printf("ERROR: neighbor cache full\n");
@ -1395,7 +1388,7 @@ void nbr_cache_auto_rem(void)
for (i = 0; i < NBR_CACHE_SIZE; i++) {
if (get_remaining_time(&(nbr_cache[i].ltime)) == 0 &&
nbr_cache[i].type == NBR_CACHE_TYPE_TEN) {
nbr_cache[i].type == NDP_NCE_TYPE_TENTATIVE) {
memmove(&(nbr_cache[i]), &(nbr_cache[nbr_count]),
sizeof(ndp_neighbor_cache_t));
memset(&(nbr_cache[nbr_count]), 0, sizeof(ndp_neighbor_cache_t));
@ -1485,7 +1478,7 @@ lowpan_context_t *abr_get_context(ndp_a6br_cache_t *abr, uint8_t cid)
}
ndp_a6br_cache_t *abr_add_context(uint16_t version, ipv6_addr_t *abr_addr,
uint8_t cid)
uint8_t cid)
{
ndp_a6br_cache_t *abr = abr_get_version(version, abr_addr);

View File

@ -57,7 +57,7 @@ int8_t plist_add(ipv6_addr_t *addr, uint8_t size, uint32_t val_ltime,
uint32_t pref_ltime, uint8_t adv_opt, uint8_t l_a_reserved1);
ndp_a6br_cache_t *abr_add_context(uint16_t version, ipv6_addr_t *abr_addr,
uint8_t cid);
uint8_t cid);
void abr_remove_context(uint8_t cid);
uint16_t icmpv6_csum(uint8_t proto);

View File

@ -273,7 +273,7 @@ int ipv6_addr_is_link_local(const ipv6_addr_t *ipv6_addr);
*
* @param[in] ipv6_addr An IPv6 address.
*
* @return 1 if *ipv6_addr* is unique local unicast address,
* @return 1 if *ipv6_addr* is unique local unicast address,
* 0 otherwise.
*/
int ipv6_addr_is_unique_local_unicast(const ipv6_addr_t *addr);

View File

@ -35,6 +35,32 @@
#define NDP_OPT_ARO_STATE_DUP_ADDR (1)
#define NDP_OPT_ARO_STATE_NBR_CACHE_FULL (2)
/**
* @brief Neighbor cache entry state according to
* <a href="http://tools.ietf.org/html/rfc4861#section-7.3.2">
* RFC 4861, section 7.3.2
* </a>.
*/
typedef enum __attribute__((packed)) {
NDP_NCE_STATUS_INCOMPLETE,
NDP_NCE_STATUS_REACHABLE,
NDP_NCE_STATUS_STALE,
NDP_NCE_STATUS_DELAY,
NDP_NCE_STATUS_PROBE,
} ndp_nce_state_t;
/**
* @brief Neighbor cache entry type according to
* <a href="http://tools.ietf.org/html/rfc6775#section-3.5">
* RFC 6775, section 3.5
* </a>.
*/
typedef enum __attribute__((packed)) {
NDP_NCE_TYPE_GC = 1, ///< Garbage-collectible.
NDP_NCE_TYPE_REGISTERED, ///< Registered.
NDP_NCE_TYPE_TENTATIVE ///< Tentetive.
} ndp_nce_type_t;
typedef struct __attribute__((packed)) {
uint8_t inuse;
uint8_t adv;
@ -54,8 +80,8 @@ typedef struct __attribute__((packed)) {
/* neighbor cache - rfc4861 5.1. */
typedef struct __attribute__((packed)) {
uint8_t type;
uint8_t state;
ndp_nce_type_t type;
ndp_nce_state_t state;
uint8_t isrouter;
ipv6_addr_t addr;
ieee_802154_long_t laddr;

View File

@ -483,7 +483,7 @@ void ipv6_iface_get_best_src_addr(ipv6_addr_t *src, const ipv6_addr_t *dest)
if (!(ipv6_addr_is_link_local(dest)) && !(ipv6_addr_is_multicast(dest))) {
for (int i = 0; i < IFACE_ADDR_LIST_LEN; i++) {
if (iface.addr_list[i].state == NDP_ADDR_STATE_PREFERRED) {
if (!ipv6_addr_is_link_local(&(iface.addr_list[i].addr)) &&
if (!ipv6_addr_is_link_local(&(iface.addr_list[i].addr)) &&
!ipv6_addr_is_multicast(&(iface.addr_list[i].addr)) &&
!ipv6_addr_is_unique_local_unicast(&(iface.addr_list[i].addr))) {
tmp = ipv6_get_addr_match(dest, &(iface.addr_list[i].addr));