diff --git a/sys/include/net/ng_ipv6/netif.h b/sys/include/net/ng_ipv6/netif.h index 79c4749e51acb1f508750996266603b1cd4f8db9..5acbc6c55c92ac6b0fbe80e9cf115b7898ae8b2b 100644 --- a/sys/include/net/ng_ipv6/netif.h +++ b/sys/include/net/ng_ipv6/netif.h @@ -29,6 +29,7 @@ #include "kernel_types.h" #include "mutex.h" #include "net/ng_ipv6/addr.h" +#include "vtimer.h" #ifdef __cplusplus extern "C" { @@ -79,6 +80,24 @@ extern "C" { */ #define NG_IPV6_NETIF_ADDR_FLAGS_UNICAST (0x00) /**< unicast address */ #define NG_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST (0x01) /**< non-unicast address */ + +/** + * @brief A prefix information option that propagates the prefix of this + * address should set the autonomous flag. + * @see <a href="https://tools.ietf.org/html/rfc4861#section-6.2.1"> + * RFC 4861, section 6.2.1 + * </a> + */ +#define NG_IPV6_NETIF_ADDR_FLAGS_NDP_AUTO (0x40) + +/** + * @brief A prefix information option that propagates the prefix of this + * address should set the on-link flag. + * @see <a href="https://tools.ietf.org/html/rfc4861#section-6.2.1"> + * RFC 4861, section 6.2.1 + * </a> + */ +#define NG_IPV6_NETIF_ADDR_FLAGS_NDP_ON_LINK (0x80) /** * @} */ @@ -87,7 +106,45 @@ extern "C" { * @{ * @name Flags for the interfaces */ -#define NG_IPV6_NETIF_FLAGS_SIXLOWPAN (0x01) /**< interface is 6LoWPAN interface */ +/** + * @brief Interface is 6LoWPAN interface. + */ +#define NG_IPV6_NETIF_FLAGS_SIXLOWPAN (0x0001) + +/** + * @brief Flag to indicate that routing is enabled on the interface. + */ +#define NG_IPV6_NETIF_FLAGS_ROUTER (0x0002) + +/** + * @brief Flag to indicate that the interface sends periodic router + * advertisements and in response to router solicitations. + */ +#define NG_IPV6_NETIF_FLAGS_RTR_ADV (0x0004) + +/** + * @brief Flag to indicate that ng_ipv6_netif_t::mtu shall be propagated + * with the MTU options in router advertisements. + */ +#define NG_IPV6_NETIF_FLAGS_ADV_MTU (0x0008) + +/** + * @brief Flag to indicate that ng_ipv6_netif_t::cur_hl shall be propagated + * in router advertisements. + */ +#define NG_IPV6_NETIF_FLAGS_ADV_CUR_HL (0x0010) + +/** + * @brief Flag to indicate that the interface has other address + * configuration. + */ +#define NG_IPV6_NETIF_FLAGS_OTHER_CONF (0x4000) + +/** + * @brief Flag to indicate that the interface has managed address + * configuration (e.g. via DHCPv6). + */ +#define NG_IPV6_NETIF_FLAGS_MANAGED (0x8000) /** * @} */ @@ -99,6 +156,32 @@ typedef struct { ng_ipv6_addr_t addr; /**< The address data */ uint8_t flags; /**< flags */ uint8_t prefix_len; /**< length of the prefix of the address */ + /** + * @{ + * @name Neigbour discovery variables for prefixes + * @see <a href="https://tools.ietf.org/html/rfc4861#section-6.2.1"> + * RFC 4861, section 6.2.1 + * </a> + */ + /** + * @brief The time in seconds this address is valid. If it is UINT32_MAX + * the lifetime is infinite. + */ + uint32_t valid; + + /** + * @brief The length of time that this address remains preferred. + * If it is UINT32_MAX the lifetime is infinite. + * It **must** be < ng_ipv6_netif_addr_t::valid. + */ + uint32_t preferred; + /** + * @brief Validity timeout timer. + */ + vtimer_t valid_timeout; + /** + * @} + */ } ng_ipv6_netif_addr_t; /** @@ -111,7 +194,7 @@ typedef struct { kernel_pid_t pid; /**< PID of the interface */ uint16_t mtu; /**< Maximum Transmission Unit (MTU) of the interface */ uint8_t cur_hl; /**< current hop limit for the interface */ - uint8_t flags; /**< flags for 6LoWPAN and Neighbor Discovery */ + uint16_t flags; /**< flags for 6LoWPAN and Neighbor Discovery */ } ng_ipv6_netif_t; /** @@ -154,28 +237,29 @@ ng_ipv6_netif_t *ng_ipv6_netif_get(kernel_pid_t pid); * @param[in] addr An address you want to add to the interface. * @param[in] prefix_len Length of the prefix of the address. * Must be between 1 and 128. - * @param[in] anycast If @p addr should be an anycast address, @p anycast - * must be true. Otherwise set it false. - * If @p addr is a multicast address, @p anycast will be - * ignored. + * @param[in] flags Flags for the address entry + * If @p addr should be an anycast address, @p flags + * must have @ref NG_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST + * set. Otherwise leave it unset. + * If @p addr is a multicast address, the status of + * @ref NG_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST will be + * ignored and set in either case. * * @see <a href="https://tools.ietf.org/html/rfc4291#section-2.6"> * RFC 4291, section 2.6 * </a> * - * @return 0, on success. - * @return -EINVAL, if @p addr is NULL or unspecified address or if - * @p prefix length was < 1 or > 128. - * @return -ENOENT, if @p pid is no interface. - * @return -ENOMEM, if there is no space left to store @p addr. + * @return The address on the interface, on success. + * @return NULL, on failure */ -int ng_ipv6_netif_add_addr(kernel_pid_t pid, const ng_ipv6_addr_t *addr, - uint8_t prefix_len, bool anycast); +ng_ipv6_addr_t *ng_ipv6_netif_add_addr(kernel_pid_t pid, const ng_ipv6_addr_t *addr, + uint8_t prefix_len, uint8_t flags); /** * @brief Remove an address from the interface. * - * @param[in] pid The PID to the interface. + * @param[in] pid The PID to the interface. If @p pid is KERNEL_PID_UNDEF + * it will be removed from all interfaces. * @param[in] addr An address you want to remove from interface. */ void ng_ipv6_netif_remove_addr(kernel_pid_t pid, ng_ipv6_addr_t *addr); @@ -254,12 +338,37 @@ ng_ipv6_addr_t *ng_ipv6_netif_match_prefix(kernel_pid_t pid, */ ng_ipv6_addr_t *ng_ipv6_netif_find_best_src_addr(kernel_pid_t pid, const ng_ipv6_addr_t *dest); +/** + * @brief Get interface specific meta-information on an address + * + * @details This only works with addresses you retrieved via the following + * functions: + * + * * ng_ipv6_netif_add_addr() + * * ng_ipv6_find_addr() + * * ng_ipv6_find_addr_local() + * * ng_ipv6_find_prefix_match() + * * ng_ipv6_find_prefix_match_local() + * * ng_ipv6_find_best_src_address() + * + * The behaviour for other addresses is undefined. + * + * @param[in] addr The address you want to get the meta-information for. + * + * @return Interface specific meta-information on @p addr + */ +static inline ng_ipv6_netif_addr_t *ng_ipv6_netif_addr_get(const ng_ipv6_addr_t *addr) +{ + return container_of(addr, ng_ipv6_netif_addr_t, addr); +} + /** * @brief Checks if an address is non-unicast. * * @details This only works with addresses you retrieved via the following * functions: * + * * ng_ipv6_netif_add_addr() * * ng_ipv6_find_addr() * * ng_ipv6_find_addr_local() * * ng_ipv6_find_prefix_match() diff --git a/sys/net/network_layer/ng_ipv6/netif/ng_ipv6_netif.c b/sys/net/network_layer/ng_ipv6/netif/ng_ipv6_netif.c index 65058940ceb9ca7ef38770f6e049cb92d76159fb..cebff338aef67941115c43713a5fc56482e1d1ba 100644 --- a/sys/net/network_layer/ng_ipv6/netif/ng_ipv6_netif.c +++ b/sys/net/network_layer/ng_ipv6/netif/ng_ipv6_netif.c @@ -20,7 +20,6 @@ #include "kernel_types.h" #include "mutex.h" -#include "net/ng_ipv6.h" #include "net/ng_ipv6/addr.h" #include "net/ng_netif.h" @@ -35,31 +34,28 @@ static ng_ipv6_netif_t ipv6_ifs[NG_NETIF_NUMOF]; static char addr_str[NG_IPV6_ADDR_MAX_STR_LEN]; #endif -static int _add_addr_to_entry(ng_ipv6_netif_t *entry, const ng_ipv6_addr_t *addr, - uint8_t prefix_len, bool anycast) +static ng_ipv6_addr_t *_add_addr_to_entry(ng_ipv6_netif_t *entry, const ng_ipv6_addr_t *addr, + uint8_t prefix_len, uint8_t flags) { for (int i = 0; i < NG_IPV6_NETIF_ADDR_NUMOF; i++) { if (ng_ipv6_addr_equal(&(entry->addrs[i].addr), addr)) { - return 0; + return &(entry->addrs[i].addr); } if (ng_ipv6_addr_is_unspecified(&(entry->addrs[i].addr))) { memcpy(&(entry->addrs[i].addr), addr, sizeof(ng_ipv6_addr_t)); - DEBUG("Added %s/%" PRIu8 " to interface %" PRIkernel_pid "\n", + DEBUG("ipv6 netif: Added %s/%" PRIu8 " to interface %" PRIkernel_pid "\n", ng_ipv6_addr_to_str(addr_str, addr, sizeof(addr_str)), prefix_len, entry->pid); - if (anycast || ng_ipv6_addr_is_multicast(addr)) { - if (ng_ipv6_addr_is_multicast(addr)) { - entry->addrs[i].prefix_len = NG_IPV6_ADDR_BIT_LEN; - } - - entry->addrs[i].flags = NG_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST; + entry->addrs[i].prefix_len = prefix_len; + entry->addrs[i].flags = flags; - return 0; + if (ng_ipv6_addr_is_multicast(addr)) { + entry->addrs[i].flags |= NG_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST; } else { - entry->addrs[i].prefix_len = prefix_len; + ng_ipv6_addr_t sol_node; if (!ng_ipv6_addr_is_link_local(addr)) { /* add also corresponding link-local address */ @@ -68,22 +64,27 @@ static int _add_addr_to_entry(ng_ipv6_netif_t *entry, const ng_ipv6_addr_t *addr ll_addr.u64[1] = addr->u64[1]; ng_ipv6_addr_set_link_local_prefix(&ll_addr); - entry->addrs[i].flags = NG_IPV6_NETIF_ADDR_FLAGS_UNICAST; - - return _add_addr_to_entry(entry, &ll_addr, 64, false); + _add_addr_to_entry(entry, &ll_addr, 64, + flags | NG_IPV6_NETIF_ADDR_FLAGS_NDP_ON_LINK); + } + else { + entry->addrs[i].flags |= NG_IPV6_NETIF_ADDR_FLAGS_NDP_ON_LINK; } - return 0; + ng_ipv6_addr_set_solicited_nodes(&sol_node, addr); + _add_addr_to_entry(entry, &sol_node, NG_IPV6_ADDR_BIT_LEN, 0); } + + return &entry->addrs[i].addr; } } - return -ENOMEM; + return NULL; } static void _reset_addr_from_entry(ng_ipv6_netif_t *entry) { - DEBUG("Reset IPv6 addresses on interface %" PRIkernel_pid "\n", entry->pid); + DEBUG("ipv6 netif: Reset IPv6 addresses on interface %" PRIkernel_pid "\n", entry->pid); memset(entry->addrs, 0, sizeof(entry->addrs)); } @@ -108,23 +109,25 @@ void ng_ipv6_netif_add(kernel_pid_t pid) ng_ipv6_addr_t addr = NG_IPV6_ADDR_ALL_NODES_LINK_LOCAL; mutex_lock(&ipv6_ifs[i].mutex); - DEBUG("Add IPv6 interface %" PRIkernel_pid " (i = %d)\n", pid, i); + DEBUG("ipv6 netif: Add IPv6 interface %" PRIkernel_pid " (i = %d)\n", pid, i); ipv6_ifs[i].pid = pid; - DEBUG(" * pid = %" PRIkernel_pid " ", ipv6_ifs[i].pid); ipv6_ifs[i].mtu = NG_IPV6_NETIF_DEFAULT_MTU; - DEBUG("mtu = %d ", ipv6_ifs[i].mtu); ipv6_ifs[i].cur_hl = NG_IPV6_NETIF_DEFAULT_HL; - DEBUG("cur_hl = %d ", ipv6_ifs[i].cur_hl); + ipv6_ifs[i].flags = 0; _add_addr_to_entry(&ipv6_ifs[i], &addr, NG_IPV6_ADDR_BIT_LEN, 0); mutex_unlock(&ipv6_ifs[i].mutex); + DEBUG(" * pid = %" PRIkernel_pid " ", ipv6_ifs[i].pid); + DEBUG("cur_hl = %d ", ipv6_ifs[i].cur_hl); + DEBUG("mtu = %d ", ipv6_ifs[i].mtu); + DEBUG("flags = %04" PRIx16 "\n", ipv6_ifs[i].flags); return; } } - DEBUG("Could not add %" PRIkernel_pid " to IPv6: No space left.\n", pid); + DEBUG("ipv6 netif: Could not add %" PRIkernel_pid " to IPv6: No space left.\n", pid); } void ng_ipv6_netif_remove(kernel_pid_t pid) @@ -138,8 +141,9 @@ void ng_ipv6_netif_remove(kernel_pid_t pid) mutex_lock(&entry->mutex); _reset_addr_from_entry(entry); - DEBUG("Remove IPv6 interface %" PRIkernel_pid "\n", pid); + DEBUG("ipv6 netif: Remove IPv6 interface %" PRIkernel_pid "\n", pid); entry->pid = KERNEL_PID_UNDEF; + entry->flags = 0; mutex_unlock(&entry->mutex); } @@ -148,7 +152,7 @@ ng_ipv6_netif_t *ng_ipv6_netif_get(kernel_pid_t pid) { for (int i = 0; i < NG_NETIF_NUMOF; i++) { if (ipv6_ifs[i].pid == pid) { - DEBUG("Get IPv6 interface %" PRIkernel_pid " (%p, i = %d)\n", pid, + DEBUG("ipv6 netif: Get IPv6 interface %" PRIkernel_pid " (%p, i = %d)\n", pid, (void *)(&(ipv6_ifs[i])), i); return &(ipv6_ifs[i]); } @@ -157,44 +161,34 @@ ng_ipv6_netif_t *ng_ipv6_netif_get(kernel_pid_t pid) return NULL; } -int ng_ipv6_netif_add_addr(kernel_pid_t pid, const ng_ipv6_addr_t *addr, - uint8_t prefix_len, bool anycast) +ng_ipv6_addr_t *ng_ipv6_netif_add_addr(kernel_pid_t pid, const ng_ipv6_addr_t *addr, + uint8_t prefix_len, uint8_t flags) { ng_ipv6_netif_t *entry = ng_ipv6_netif_get(pid); - int res; - - if (entry == NULL) { - return -ENOENT; - } + ng_ipv6_addr_t *res; - if ((addr == NULL) || (ng_ipv6_addr_is_unspecified(addr)) || + if ((entry == NULL) || (addr == NULL) || (ng_ipv6_addr_is_unspecified(addr)) || ((prefix_len - 1) > 127)) { /* prefix_len < 1 || prefix_len > 128 */ - return -EINVAL; + return NULL; } mutex_lock(&entry->mutex); - res = _add_addr_to_entry(entry, addr, prefix_len, anycast); + res = _add_addr_to_entry(entry, addr, prefix_len, flags); mutex_unlock(&entry->mutex); return res; } -void ng_ipv6_netif_remove_addr(kernel_pid_t pid, ng_ipv6_addr_t *addr) +static void _remove_addr_from_entry(ng_ipv6_netif_t *entry, ng_ipv6_addr_t *addr) { - ng_ipv6_netif_t *entry = ng_ipv6_netif_get(pid); - - if (entry == NULL) { - return; - } - mutex_lock(&entry->mutex); for (int i = 0; i < NG_IPV6_NETIF_ADDR_NUMOF; i++) { if (ng_ipv6_addr_equal(&(entry->addrs[i].addr), addr)) { - DEBUG("Remove %s to interface %" PRIkernel_pid "\n", - ng_ipv6_addr_to_str(addr_str, addr, sizeof(addr_str)), pid); + DEBUG("ipv6 netif: Remove %s to interface %" PRIkernel_pid "\n", + ng_ipv6_addr_to_str(addr_str, addr, sizeof(addr_str)), entry->pid); ng_ipv6_addr_set_unspecified(&(entry->addrs[i].addr)); entry->addrs[i].flags = 0; @@ -206,6 +200,24 @@ void ng_ipv6_netif_remove_addr(kernel_pid_t pid, ng_ipv6_addr_t *addr) mutex_unlock(&entry->mutex); } +void ng_ipv6_netif_remove_addr(kernel_pid_t pid, ng_ipv6_addr_t *addr) +{ + if (pid == KERNEL_PID_UNDEF) { + for (int i = 0; i < NG_NETIF_NUMOF; i++) { + if (ipv6_ifs[i].pid == KERNEL_PID_UNDEF) { + continue; + } + + _remove_addr_from_entry(ipv6_ifs + i, addr); + } + } + else { + ng_ipv6_netif_t *entry = ng_ipv6_netif_get(pid); + + _remove_addr_from_entry(entry, addr); + } +} + void ng_ipv6_netif_reset_addr(kernel_pid_t pid) { ng_ipv6_netif_t *entry = ng_ipv6_netif_get(pid); @@ -228,7 +240,7 @@ kernel_pid_t ng_ipv6_netif_find_by_addr(ng_ipv6_addr_t **out, const ng_ipv6_addr *out = ng_ipv6_netif_find_addr(ipv6_ifs[i].pid, addr); if (*out != NULL) { - DEBUG("Found %s on interface %" PRIkernel_pid "\n", + DEBUG("ipv6 netif: Found %s on interface %" PRIkernel_pid "\n", ng_ipv6_addr_to_str(addr_str, *out, sizeof(addr_str)), ipv6_ifs[i].pid); return ipv6_ifs[i].pid; @@ -236,7 +248,7 @@ kernel_pid_t ng_ipv6_netif_find_by_addr(ng_ipv6_addr_t **out, const ng_ipv6_addr } else { if (ng_ipv6_netif_find_addr(ipv6_ifs[i].pid, addr) != NULL) { - DEBUG("Found %s on interface %" PRIkernel_pid "\n", + DEBUG("ipv6 netif: Found %s on interface %" PRIkernel_pid "\n", ng_ipv6_addr_to_str(addr_str, *out, sizeof(addr_str)), ipv6_ifs[i].pid); return ipv6_ifs[i].pid; @@ -264,7 +276,7 @@ ng_ipv6_addr_t *ng_ipv6_netif_find_addr(kernel_pid_t pid, const ng_ipv6_addr_t * for (int i = 0; i < NG_IPV6_NETIF_ADDR_NUMOF; i++) { if (ng_ipv6_addr_equal(&(entry->addrs[i].addr), addr)) { mutex_unlock(&entry->mutex); - DEBUG("Found %s on interface %" PRIkernel_pid "\n", + DEBUG("ipv6 netif: Found %s on interface %" PRIkernel_pid "\n", ng_ipv6_addr_to_str(addr_str, addr, sizeof(addr_str)), pid); return &(entry->addrs[i].addr); @@ -307,9 +319,8 @@ static uint8_t _find_by_prefix_unsafe(ng_ipv6_addr_t **res, ng_ipv6_netif_t *ifa } #if ENABLE_DEBUG - if (*res != NULL) { - DEBUG("Found %s on interface %" PRIkernel_pid " matching ", + DEBUG("ipv6 netif: Found %s on interface %" PRIkernel_pid " matching ", ng_ipv6_addr_to_str(addr_str, *res, sizeof(addr_str)), iface->pid); DEBUG("%s by %" PRIu8 " bits (used as source address = %s)\n", @@ -318,14 +329,14 @@ static uint8_t _find_by_prefix_unsafe(ng_ipv6_addr_t **res, ng_ipv6_netif_t *ifa (only_unicast) ? "true" : "false"); } else { - DEBUG("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", iface->pid, ng_ipv6_addr_to_str(addr_str, addr, sizeof(addr_str)), (only_unicast) ? "true" : "false"); } - #endif + return best_match; } @@ -355,9 +366,8 @@ kernel_pid_t ng_ipv6_netif_find_by_prefix(ng_ipv6_addr_t **out, const ng_ipv6_ad } #if ENABLE_DEBUG - if (res != KERNEL_PID_UNDEF) { - DEBUG("Found %s on interface %" PRIkernel_pid " globally matching ", + DEBUG("ipv6 netif: Found %s on interface %" PRIkernel_pid " globally matching ", ng_ipv6_addr_to_str(addr_str, *out, sizeof(addr_str)), res); DEBUG("%s by %" PRIu8 " bits\n", @@ -365,10 +375,9 @@ kernel_pid_t ng_ipv6_netif_find_by_prefix(ng_ipv6_addr_t **out, const ng_ipv6_ad best_match); } else { - DEBUG("Did not found any address globally matching %s\n", + DEBUG("ipv6 netif: Did not found any address globally matching %s\n", ng_ipv6_addr_to_str(addr_str, prefix, sizeof(addr_str))); } - #endif return res; diff --git a/sys/shell/commands/sc_netif.c b/sys/shell/commands/sc_netif.c index 3c7d4d18ca3f9e2feedbc4f2ce7d7a904a3d6b60..32657fc4c5e7c98e00d6ee76a17da01332a846c1 100644 --- a/sys/shell/commands/sc_netif.c +++ b/sys/shell/commands/sc_netif.c @@ -600,7 +600,10 @@ static int _netif_add(char *cmd_name, kernel_pid_t dev, int argc, char **argv) return 1; } - if (ng_ipv6_netif_add_addr(dev, &addr, prefix_len, (type == _ANYCAST)) < 0) { + if (ng_ipv6_netif_add_addr(dev, &addr, prefix_len, + (type == _ANYCAST) ? + NG_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST : + NG_IPV6_NETIF_ADDR_FLAGS_UNICAST) == NULL) { printf("error: unable to add IPv6 address\n"); return 1; } diff --git a/tests/unittests/tests-ipv6_netif/tests-ipv6_netif.c b/tests/unittests/tests-ipv6_netif/tests-ipv6_netif.c index 5c9cb3aa4777dd76efe15f499864eff2b01ae42d..3654f0debae06479ff18e3c1aefbbb3715905d67 100644 --- a/tests/unittests/tests-ipv6_netif/tests-ipv6_netif.c +++ b/tests/unittests/tests-ipv6_netif/tests-ipv6_netif.c @@ -121,22 +121,19 @@ static void test_ipv6_netif_add_addr__no_iface1(void) { ng_ipv6_addr_t addr = DEFAULT_TEST_IPV6_ADDR; - TEST_ASSERT_EQUAL_INT(-ENOENT, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, - &addr, DEFAULT_TEST_PREFIX_LEN, false)); + TEST_ASSERT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, DEFAULT_TEST_PREFIX_LEN, 0)); } static void test_ipv6_netif_add_addr__no_iface2(void) { - TEST_ASSERT_EQUAL_INT(-ENOENT, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, - NULL, DEFAULT_TEST_PREFIX_LEN, false)); + TEST_ASSERT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, NULL, DEFAULT_TEST_PREFIX_LEN, 0)); } static void test_ipv6_netif_add_addr__addr_NULL(void) { test_ipv6_netif_add__success(); /* adds DEFAULT_TEST_NETIF as interface */ - TEST_ASSERT_EQUAL_INT(-EINVAL, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, - NULL, DEFAULT_TEST_PREFIX_LEN, false)); + TEST_ASSERT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, NULL, DEFAULT_TEST_PREFIX_LEN, 0)); } static void test_ipv6_netif_add_addr__addr_unspecified(void) @@ -145,26 +142,22 @@ static void test_ipv6_netif_add_addr__addr_unspecified(void) test_ipv6_netif_add__success(); /* adds DEFAULT_TEST_NETIF as interface */ - TEST_ASSERT_EQUAL_INT(-EINVAL, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, - &addr, DEFAULT_TEST_PREFIX_LEN, false)); + TEST_ASSERT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, DEFAULT_TEST_PREFIX_LEN, 0)); } -static void test_ipv6_netif_add_addr__ENOMEM(void) +static void test_ipv6_netif_add_addr__full(void) { - ng_ipv6_addr_t addr = DEFAULT_TEST_IPV6_ADDR; - int res = 0, i; + ng_ipv6_addr_t addr = DEFAULT_TEST_IPV6_ADDR, *res = &addr; + int i; /* make link local to avoid automatic link local adding */ ng_ipv6_addr_set_link_local_prefix(&addr); test_ipv6_netif_add__success(); /* adds DEFAULT_TEST_NETIF as interface */ - for (i = 0; res != -ENOMEM; i++, addr.u8[15]++) { - res = ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, - DEFAULT_TEST_PREFIX_LEN, false); + for (i = 0; res != NULL; i++, addr.u8[15]++) { + res = ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, DEFAULT_TEST_PREFIX_LEN, 0); } - - TEST_ASSERT_EQUAL_INT(NG_IPV6_NETIF_ADDR_NUMOF, i); } static void test_ipv6_netif_add_addr__success(void) @@ -173,8 +166,7 @@ static void test_ipv6_netif_add_addr__success(void) test_ipv6_netif_add__success(); /* adds DEFAULT_TEST_NETIF as interface */ - TEST_ASSERT_EQUAL_INT(0, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, - DEFAULT_TEST_PREFIX_LEN, false)); + TEST_ASSERT_NOT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, DEFAULT_TEST_PREFIX_LEN, 0)); } static void test_ipv6_netif_remove_addr__not_allocated(void) @@ -378,10 +370,10 @@ static void test_ipv6_netif_find_best_src_addr__no_unicast(void) TEST_ASSERT_EQUAL_INT(126, ng_ipv6_addr_match_prefix(&ll_addr2, &ll_addr1)); test_ipv6_netif_add__success(); /* adds DEFAULT_TEST_NETIF as interface */ - TEST_ASSERT_EQUAL_INT(0, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &mc_addr, - DEFAULT_TEST_PREFIX_LEN, false)); - TEST_ASSERT_EQUAL_INT(0, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &ll_addr1, - DEFAULT_TEST_PREFIX_LEN, true)); + TEST_ASSERT_NOT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &mc_addr, DEFAULT_TEST_PREFIX_LEN, + 0)); + TEST_ASSERT_NOT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &ll_addr1, DEFAULT_TEST_PREFIX_LEN, + NG_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST)); TEST_ASSERT_NULL(ng_ipv6_netif_find_best_src_addr(DEFAULT_TEST_NETIF, &ll_addr2)); } @@ -401,10 +393,10 @@ static void test_ipv6_netif_find_best_src_addr__success(void) TEST_ASSERT_EQUAL_INT(126, ng_ipv6_addr_match_prefix(&ll_addr2, &ll_addr1)); test_ipv6_netif_add__success(); /* adds DEFAULT_TEST_NETIF as interface */ - TEST_ASSERT_EQUAL_INT(0, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &mc_addr, - DEFAULT_TEST_PREFIX_LEN, false)); - TEST_ASSERT_EQUAL_INT(0, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &ll_addr1, - DEFAULT_TEST_PREFIX_LEN, false)); + TEST_ASSERT_NOT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &mc_addr, DEFAULT_TEST_PREFIX_LEN, + 0)); + TEST_ASSERT_NOT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &ll_addr1, DEFAULT_TEST_PREFIX_LEN, + 0)); TEST_ASSERT_NOT_NULL((out = ng_ipv6_netif_find_best_src_addr(DEFAULT_TEST_NETIF, &ll_addr2))); TEST_ASSERT(out != &ll_addr1); @@ -431,8 +423,8 @@ static void test_ipv6_netif_addr_is_non_unicast__anycast(void) test_ipv6_netif_add__success(); /* adds DEFAULT_TEST_NETIF as interface */ - TEST_ASSERT_EQUAL_INT(0, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, - DEFAULT_TEST_PREFIX_LEN, true)); + TEST_ASSERT_NOT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, DEFAULT_TEST_PREFIX_LEN, + NG_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST)); TEST_ASSERT_NOT_NULL((out = ng_ipv6_netif_find_addr(DEFAULT_TEST_NETIF, &addr))); TEST_ASSERT_EQUAL_INT(true, ng_ipv6_netif_addr_is_non_unicast(out)); @@ -445,8 +437,7 @@ static void test_ipv6_netif_addr_is_non_unicast__multicast1(void) test_ipv6_netif_add__success(); /* adds DEFAULT_TEST_NETIF as interface */ - TEST_ASSERT_EQUAL_INT(0, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, - DEFAULT_TEST_PREFIX_LEN, false)); + TEST_ASSERT_NOT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, DEFAULT_TEST_PREFIX_LEN, 0)); TEST_ASSERT_NOT_NULL((out = ng_ipv6_netif_find_addr(DEFAULT_TEST_NETIF, &addr))); TEST_ASSERT_EQUAL_INT(true, ng_ipv6_netif_addr_is_non_unicast(out)); @@ -459,8 +450,8 @@ static void test_ipv6_netif_addr_is_non_unicast__multicast2(void) test_ipv6_netif_add__success(); /* adds DEFAULT_TEST_NETIF as interface */ - TEST_ASSERT_EQUAL_INT(0, ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, - DEFAULT_TEST_PREFIX_LEN, true)); + TEST_ASSERT_NOT_NULL(ng_ipv6_netif_add_addr(DEFAULT_TEST_NETIF, &addr, DEFAULT_TEST_PREFIX_LEN, + NG_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST)); TEST_ASSERT_NOT_NULL((out = ng_ipv6_netif_find_addr(DEFAULT_TEST_NETIF, &addr))); TEST_ASSERT_EQUAL_INT(true, ng_ipv6_netif_addr_is_non_unicast(out)); @@ -478,7 +469,7 @@ Test *tests_ipv6_netif_tests(void) new_TestFixture(test_ipv6_netif_add_addr__no_iface2), new_TestFixture(test_ipv6_netif_add_addr__addr_NULL), new_TestFixture(test_ipv6_netif_add_addr__addr_unspecified), - new_TestFixture(test_ipv6_netif_add_addr__ENOMEM), + new_TestFixture(test_ipv6_netif_add_addr__full), new_TestFixture(test_ipv6_netif_add_addr__success), new_TestFixture(test_ipv6_netif_remove_addr__not_allocated), new_TestFixture(test_ipv6_netif_remove_addr__success),