diff --git a/sys/net/network_layer/ng_ipv6/ng_ipv6.c b/sys/net/network_layer/ng_ipv6/ng_ipv6.c index d0cd6e16ccc69385e1201fdc5e145272b3d61b5c..825a1c1d021d6c936b445b60d8402d34d3b2c85a 100644 --- a/sys/net/network_layer/ng_ipv6/ng_ipv6.c +++ b/sys/net/network_layer/ng_ipv6/ng_ipv6.c @@ -689,6 +689,7 @@ static void _receive(ng_pktsnip_t *pkt) ipv6->next = pkt; /* reorder for sending */ pkt->next = NULL; _send(ipv6, false); + return; } else { DEBUG("ipv6: hop limit reached 0: drop packet\n"); diff --git a/sys/net/network_layer/ng_ndp/ng_ndp.c b/sys/net/network_layer/ng_ndp/ng_ndp.c index 816d35e454eb62d41beaad0b7807be62f6bed734..51eb066b35b6e788ce7317015960dab3e6310f8f 100644 --- a/sys/net/network_layer/ng_ndp/ng_ndp.c +++ b/sys/net/network_layer/ng_ndp/ng_ndp.c @@ -19,7 +19,6 @@ #include <string.h> #include "byteorder.h" -#include "net/fib.h" #include "net/ng_icmpv6.h" #include "net/ng_ipv6.h" #include "net/ng_ipv6/ext/rh.h" @@ -312,9 +311,6 @@ void ng_ndp_retrans_nbr_sol(ng_ipv6_nc_t *nc_entry) ipv6_addr_to_str(addr_str, &nc_entry->ipv6_addr, sizeof(addr_str)), nc_entry->iface); -#ifdef MODULE_FIB - fib_remove_entry((uint8_t *) & (nc_entry->ipv6_addr), sizeof(ipv6_addr_t)); -#endif ng_ipv6_nc_remove(nc_entry->iface, &nc_entry->ipv6_addr); } } diff --git a/sys/net/network_layer/ng_ndp/node/ng_ndp_node.c b/sys/net/network_layer/ng_ndp/node/ng_ndp_node.c index 87992be8cabb6ca0e2875beabf653fc01fd74d53..1107d36adf855e61bff8def494438e2e6f252966 100644 --- a/sys/net/network_layer/ng_ndp/node/ng_ndp_node.c +++ b/sys/net/network_layer/ng_ndp/node/ng_ndp_node.c @@ -59,24 +59,27 @@ kernel_pid_t ng_ndp_node_next_hop_l2addr(uint8_t *l2addr, uint8_t *l2addr_len, kernel_pid_t iface, ipv6_addr_t *dst, ng_pktsnip_t *pkt) { + ng_ipv6_nc_t *nc_entry; ipv6_addr_t *next_hop_ip = NULL, *prefix = NULL; #ifdef MODULE_NG_IPV6_EXT_RH next_hop_ip = ng_ipv6_ext_rh_next_hop(hdr); #endif #ifdef MODULE_FIB - size_t next_hop_size = sizeof(ipv6_addr_t); - uint32_t next_hop_flags = 0; - ipv6_addr_t next_hop_actual; /* FIB copies address into this variable */ - - if ((next_hop_ip == NULL) && - (fib_get_next_hop(&iface, next_hop_actual.u8, &next_hop_size, - &next_hop_flags, (uint8_t *)dst, - sizeof(ipv6_addr_t), 0) >= 0) && - (next_hop_size == sizeof(ipv6_addr_t))) { - next_hop_ip = &next_hop_actual; + /* don't look-up link local addresses in FIB */ + if (!ipv6_addr_is_link_local(dst)) { + size_t next_hop_size = sizeof(ipv6_addr_t); + uint32_t next_hop_flags = 0; + ipv6_addr_t next_hop_actual; /* FIB copies address into this variable */ + + if ((next_hop_ip == NULL) && + (fib_get_next_hop(&iface, next_hop_actual.u8, &next_hop_size, + &next_hop_flags, (uint8_t *)dst, + sizeof(ipv6_addr_t), 0) >= 0) && + (next_hop_size == sizeof(ipv6_addr_t))) { + next_hop_ip = &next_hop_actual; + } } - #endif if ((next_hop_ip == NULL)) { /* no route to host */ @@ -93,97 +96,89 @@ kernel_pid_t ng_ndp_node_next_hop_l2addr(uint8_t *l2addr, uint8_t *l2addr_len, (ng_ipv6_netif_addr_get(prefix)->flags & NG_IPV6_NETIF_ADDR_FLAGS_NDP_ON_LINK)) { next_hop_ip = dst; -#ifdef MODULE_FIB - /* We don't care if FIB is full, this is just for efficiency - * for later sends */ - fib_add_entry(iface, (uint8_t *)dst, sizeof(ipv6_addr_t), 0, - (uint8_t *)next_hop_ip, sizeof(ipv6_addr_t), 0, - FIB_LIFETIME_NO_EXPIRE); -#endif } } + /* dst has not an on-link prefix */ if (next_hop_ip == NULL) { next_hop_ip = ng_ndp_internal_default_router(); -#ifdef MODULE_FIB - /* We don't care if FIB is full, this is just for efficiency for later - * sends */ - fib_add_entry(iface, (uint8_t *)dst, sizeof(ipv6_addr_t), 0, - (uint8_t *)next_hop_ip, sizeof(ipv6_addr_t), 0, - FIB_LIFETIME_NO_EXPIRE); -#endif } - if (next_hop_ip != NULL) { - ng_ipv6_nc_t *nc_entry = ng_ipv6_nc_get(iface, next_hop_ip); - if ((nc_entry != NULL) && ng_ipv6_nc_is_reachable(nc_entry)) { - DEBUG("ndp node: found reachable neighbor (%s => ", - ipv6_addr_to_str(addr_str, &nc_entry->ipv6_addr, sizeof(addr_str))); - DEBUG("%s)\n", - ng_netif_addr_to_str(addr_str, sizeof(addr_str), - nc_entry->l2_addr, nc_entry->l2_addr_len)); + if (next_hop_ip == NULL) { + next_hop_ip = dst; /* Just look if it's in the neighbor cache + * (aka on-link but not registered in prefix list as such) */ + } - if (ng_ipv6_nc_get_state(nc_entry) == NG_IPV6_NC_STATE_STALE) { - ng_ndp_internal_set_state(nc_entry, NG_IPV6_NC_STATE_DELAY); - } + /* start address resolution */ + nc_entry = ng_ipv6_nc_get(iface, next_hop_ip); - memcpy(l2addr, nc_entry->l2_addr, nc_entry->l2_addr_len); - *l2addr_len = nc_entry->l2_addr_len; - /* TODO: unreachability check */ - return nc_entry->iface; + if ((nc_entry != NULL) && ng_ipv6_nc_is_reachable(nc_entry)) { + DEBUG("ndp node: found reachable neighbor (%s => ", + ipv6_addr_to_str(addr_str, &nc_entry->ipv6_addr, sizeof(addr_str))); + DEBUG("%s)\n", + ng_netif_addr_to_str(addr_str, sizeof(addr_str), + nc_entry->l2_addr, nc_entry->l2_addr_len)); + + if (ng_ipv6_nc_get_state(nc_entry) == NG_IPV6_NC_STATE_STALE) { + ng_ndp_internal_set_state(nc_entry, NG_IPV6_NC_STATE_DELAY); } - else if (nc_entry == NULL) { - ng_pktqueue_t *pkt_node; - ipv6_addr_t dst_sol; - nc_entry = ng_ipv6_nc_add(iface, next_hop_ip, NULL, 0, - NG_IPV6_NC_STATE_INCOMPLETE << NG_IPV6_NC_STATE_POS); + memcpy(l2addr, nc_entry->l2_addr, nc_entry->l2_addr_len); + *l2addr_len = nc_entry->l2_addr_len; + /* TODO: unreachability check */ + return nc_entry->iface; + } + else if (nc_entry == NULL) { + ng_pktqueue_t *pkt_node; + ipv6_addr_t dst_sol; - if (nc_entry == NULL) { - DEBUG("ndp node: could not create neighbor cache entry\n"); - return KERNEL_PID_UNDEF; - } + nc_entry = ng_ipv6_nc_add(iface, next_hop_ip, NULL, 0, + NG_IPV6_NC_STATE_INCOMPLETE << NG_IPV6_NC_STATE_POS); - pkt_node = _alloc_pkt_node(pkt); + if (nc_entry == NULL) { + DEBUG("ndp node: could not create neighbor cache entry\n"); + return KERNEL_PID_UNDEF; + } - if (pkt_node == NULL) { - DEBUG("ndp node: could not add packet to packet queue\n"); - } - else { - /* prevent packet from being released by IPv6 */ - ng_pktbuf_hold(pkt_node->pkt, 1); - ng_pktqueue_add(&nc_entry->pkts, pkt_node); - } + pkt_node = _alloc_pkt_node(pkt); - /* address resolution */ - ipv6_addr_set_solicited_nodes(&dst_sol, next_hop_ip); + if (pkt_node == NULL) { + DEBUG("ndp node: could not add packet to packet queue\n"); + } + else { + /* prevent packet from being released by IPv6 */ + ng_pktbuf_hold(pkt_node->pkt, 1); + ng_pktqueue_add(&nc_entry->pkts, pkt_node); + } - if (iface == KERNEL_PID_UNDEF) { - timex_t t = { 0, NG_NDP_RETRANS_TIMER }; - kernel_pid_t ifs[NG_NETIF_NUMOF]; - size_t ifnum = ng_netif_get(ifs); + /* address resolution */ + ipv6_addr_set_solicited_nodes(&dst_sol, next_hop_ip); - for (size_t i = 0; i < ifnum; i++) { - ng_ndp_internal_send_nbr_sol(ifs[i], next_hop_ip, &dst_sol); - } + if (iface == KERNEL_PID_UNDEF) { + timex_t t = { 0, NG_NDP_RETRANS_TIMER }; + kernel_pid_t ifs[NG_NETIF_NUMOF]; + size_t ifnum = ng_netif_get(ifs); - vtimer_remove(&nc_entry->nbr_sol_timer); - vtimer_set_msg(&nc_entry->nbr_sol_timer, t, ng_ipv6_pid, - NG_NDP_MSG_NBR_SOL_RETRANS, nc_entry); + for (size_t i = 0; i < ifnum; i++) { + ng_ndp_internal_send_nbr_sol(ifs[i], next_hop_ip, &dst_sol); } - else { - ng_ipv6_netif_t *ipv6_iface = ng_ipv6_netif_get(iface); - ng_ndp_internal_send_nbr_sol(iface, next_hop_ip, &dst_sol); + vtimer_remove(&nc_entry->nbr_sol_timer); + vtimer_set_msg(&nc_entry->nbr_sol_timer, t, ng_ipv6_pid, + NG_NDP_MSG_NBR_SOL_RETRANS, nc_entry); + } + else { + ng_ipv6_netif_t *ipv6_iface = ng_ipv6_netif_get(iface); - mutex_lock(&ipv6_iface->mutex); - vtimer_remove(&nc_entry->nbr_sol_timer); - vtimer_set_msg(&nc_entry->nbr_sol_timer, - ipv6_iface->retrans_timer, ng_ipv6_pid, - NG_NDP_MSG_NBR_SOL_RETRANS, nc_entry); - mutex_unlock(&ipv6_iface->mutex); - } + ng_ndp_internal_send_nbr_sol(iface, next_hop_ip, &dst_sol); + + mutex_lock(&ipv6_iface->mutex); + vtimer_remove(&nc_entry->nbr_sol_timer); + vtimer_set_msg(&nc_entry->nbr_sol_timer, + ipv6_iface->retrans_timer, ng_ipv6_pid, + NG_NDP_MSG_NBR_SOL_RETRANS, nc_entry); + mutex_unlock(&ipv6_iface->mutex); } }