mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-18 12:52:44 +01:00
ng_ipv6_netif: find source addresses for destinations from other subnets
This commit is contained in:
parent
0dbe086b0b
commit
5174f75bc2
@ -328,14 +328,14 @@ ng_ipv6_addr_t *ng_ipv6_netif_find_addr(kernel_pid_t pid, const ng_ipv6_addr_t *
|
|||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t _find_by_prefix_unsafe(ng_ipv6_addr_t **res, ng_ipv6_netif_t *iface,
|
static uint8_t _find_by_prefix_unsafe(ng_ipv6_addr_t **res, ng_ipv6_netif_t *iface,
|
||||||
const ng_ipv6_addr_t *addr, bool only_unicast)
|
const ng_ipv6_addr_t *addr, bool src_search)
|
||||||
{
|
{
|
||||||
uint8_t best_match = 0;
|
uint8_t best_match = 0;
|
||||||
|
|
||||||
for (int i = 0; i < NG_IPV6_NETIF_ADDR_NUMOF; i++) {
|
for (int i = 0; i < NG_IPV6_NETIF_ADDR_NUMOF; i++) {
|
||||||
uint8_t match;
|
uint8_t match;
|
||||||
|
|
||||||
if ((only_unicast &&
|
if ((src_search &&
|
||||||
ng_ipv6_netif_addr_is_non_unicast(&(iface->addrs[i].addr))) ||
|
ng_ipv6_netif_addr_is_non_unicast(&(iface->addrs[i].addr))) ||
|
||||||
ng_ipv6_addr_is_unspecified(&(iface->addrs[i].addr))) {
|
ng_ipv6_addr_is_unspecified(&(iface->addrs[i].addr))) {
|
||||||
continue;
|
continue;
|
||||||
@ -343,7 +343,7 @@ static uint8_t _find_by_prefix_unsafe(ng_ipv6_addr_t **res, ng_ipv6_netif_t *ifa
|
|||||||
|
|
||||||
match = ng_ipv6_addr_match_prefix(&(iface->addrs[i].addr), addr);
|
match = ng_ipv6_addr_match_prefix(&(iface->addrs[i].addr), addr);
|
||||||
|
|
||||||
if (only_unicast && !ng_ipv6_addr_is_multicast(addr) &&
|
if (!src_search && !ng_ipv6_addr_is_multicast(addr) &&
|
||||||
(match < iface->addrs[i].prefix_len)) {
|
(match < iface->addrs[i].prefix_len)) {
|
||||||
/* match but not of same subnet */
|
/* match but not of same subnet */
|
||||||
continue;
|
continue;
|
||||||
@ -366,14 +366,14 @@ static uint8_t _find_by_prefix_unsafe(ng_ipv6_addr_t **res, ng_ipv6_netif_t *ifa
|
|||||||
DEBUG("%s by %" PRIu8 " bits (used as source address = %s)\n",
|
DEBUG("%s by %" PRIu8 " bits (used as source address = %s)\n",
|
||||||
ng_ipv6_addr_to_str(addr_str, addr, sizeof(addr_str)),
|
ng_ipv6_addr_to_str(addr_str, addr, sizeof(addr_str)),
|
||||||
best_match,
|
best_match,
|
||||||
(only_unicast) ? "true" : "false");
|
(src_search) ? "true" : "false");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
DEBUG("ipv6 netif: Did not found any address on interface %" PRIkernel_pid
|
DEBUG("ipv6 netif: Did not found any address on interface %" PRIkernel_pid
|
||||||
" matching %s (used as source address = %s)\n",
|
" matching %s (used as source address = %s)\n",
|
||||||
iface->pid,
|
iface->pid,
|
||||||
ng_ipv6_addr_to_str(addr_str, addr, sizeof(addr_str)),
|
ng_ipv6_addr_to_str(addr_str, addr, sizeof(addr_str)),
|
||||||
(only_unicast) ? "true" : "false");
|
(src_search) ? "true" : "false");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -424,14 +424,14 @@ kernel_pid_t ng_ipv6_netif_find_by_prefix(ng_ipv6_addr_t **out, const ng_ipv6_ad
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ng_ipv6_addr_t *_match_prefix(kernel_pid_t pid, const ng_ipv6_addr_t *addr,
|
static ng_ipv6_addr_t *_match_prefix(kernel_pid_t pid, const ng_ipv6_addr_t *addr,
|
||||||
bool only_unicast)
|
bool src_search)
|
||||||
{
|
{
|
||||||
ng_ipv6_addr_t *res = NULL;
|
ng_ipv6_addr_t *res = NULL;
|
||||||
ng_ipv6_netif_t *iface = ng_ipv6_netif_get(pid);
|
ng_ipv6_netif_t *iface = ng_ipv6_netif_get(pid);
|
||||||
|
|
||||||
mutex_lock(&(iface->mutex));
|
mutex_lock(&(iface->mutex));
|
||||||
|
|
||||||
if (_find_by_prefix_unsafe(&res, iface, addr, only_unicast) > 0) {
|
if (_find_by_prefix_unsafe(&res, iface, addr, src_search) > 0) {
|
||||||
mutex_unlock(&(iface->mutex));
|
mutex_unlock(&(iface->mutex));
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user