net: tests: Add IPv6 address manipulation unit tests

Change-Id: Ide3bce35dcfd3ec31bfe3cd842a87ca3b639ba4f
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit is contained in:
Jukka Rissanen 2016-05-17 12:28:39 +03:00
commit eb87a36e44
2 changed files with 147 additions and 0 deletions

View file

@ -9,3 +9,4 @@ CONFIG_NET_NBUF_TX_COUNT=2
CONFIG_NET_NBUF_DATA_COUNT=5 CONFIG_NET_NBUF_DATA_COUNT=5
CONFIG_NET_LOG=y CONFIG_NET_LOG=y
CONFIG_SYS_LOG_SHOW_COLOR=y CONFIG_SYS_LOG_SHOW_COLOR=y
CONFIG_TEST_RANDOM_GENERATOR=y

View file

@ -21,9 +21,12 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include <device.h>
#include <init.h>
#include <misc/printk.h> #include <misc/printk.h>
#include <net/net_core.h> #include <net/net_core.h>
#include <net/nbuf.h> #include <net/nbuf.h>
#include <net/net_ip.h>
#define NET_DEBUG 1 #define NET_DEBUG 1
#include "net_private.h" #include "net_private.h"
@ -104,12 +107,78 @@
} \ } \
} while (0) } while (0)
extern struct net_if __net_if_start[];
struct net_test_context {
uint8_t mac_addr[6];
struct net_linkaddr ll_addr;
};
int net_test_init(struct device *dev)
{
struct net_test_context *net_test_context = dev->driver_data;
dev->driver_api = NULL;
net_test_context = net_test_context;
return 0;
}
static uint8_t *net_test_get_mac(struct device *dev)
{
struct net_test_context *context = dev->driver_data;
if (context->mac_addr[0] == 0x00) {
/* 10-00-00-00-00 to 10-00-00-00-FF Documentation RFC7042 */
context->mac_addr[0] = 0x10;
context->mac_addr[1] = 0x00;
context->mac_addr[2] = 0x00;
context->mac_addr[3] = 0x00;
context->mac_addr[4] = 0x00;
context->mac_addr[5] = sys_rand32_get();
}
return context->mac_addr;
}
static void net_test_iface_init(struct net_if *iface)
{
uint8_t *mac = net_test_get_mac(net_if_get_device(iface));
net_if_set_link_addr(iface, mac, 8);
}
struct net_test_context net_test_context_data;
static struct net_if_api net_test_if_api = {
.init = net_test_iface_init
};
NET_DEVICE_INIT(net_addr_test, "net_addr_test",
net_test_init, &net_test_context_data, NULL,
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
&net_test_if_api, 127);
#ifdef CONFIG_MICROKERNEL #ifdef CONFIG_MICROKERNEL
void mainloop(void) void mainloop(void)
#else #else
void main(void) void main(void)
#endif #endif
{ {
struct in6_addr loopback = IN6ADDR_LOOPBACK_INIT;
struct in6_addr mcast = { { { 0xff, 0x84, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0x2 } } };
struct in6_addr addr6 = { { { 0xfe, 0x80, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0x1 } } };
struct in6_addr addr6_pref1 = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0x1 } } };
struct in6_addr addr6_pref2 = { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0x2 } } };
struct in6_addr addr6_pref3 = { { { 0x20, 0x01, 0x0d, 0xb8, 0x64, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0x2 } } };
struct net_if_addr *ifaddr1, *ifaddr2;
struct net_if_mcast_addr *ifmaddr1;
TEST_BYTE_1(0xde, "DE"); TEST_BYTE_1(0xde, "DE");
TEST_BYTE_1(0x09, "09"); TEST_BYTE_1(0x09, "09");
TEST_BYTE_2(0xa9, "a9"); TEST_BYTE_2(0xa9, "a9");
@ -146,4 +215,81 @@ void main(void)
TEST_IPV4(127, 0, 0, 1, "127.0.0.1"); TEST_IPV4(127, 0, 0, 1, "127.0.0.1");
printk("IP address print tests passed\n"); printk("IP address print tests passed\n");
if (!net_is_ipv6_addr_loopback(&loopback)) {
printk("IPv6 loopback address check failed.\n");
return;
}
if (!net_is_ipv6_addr_mcast(&mcast)) {
printk("IPv6 multicast address check failed.\n");
return;
}
ifaddr1 = net_if_ipv6_addr_add(__net_if_start,
&addr6,
NET_ADDR_MANUAL,
0);
if (!ifaddr1) {
printk("IPv6 interface address add failed\n");
return;
}
ifaddr2 = net_if_ipv6_addr_lookup(&addr6);
if (ifaddr1 != ifaddr2) {
printk("IPv6 interface address mismatch\n");
return;
}
if (net_is_my_ipv6_addr(&loopback)) {
printk("My IPv6 loopback address check failed\n");
return;
}
if (!net_is_my_ipv6_addr(&addr6)) {
printk("My IPv6 address check failed\n");
return;
}
if (!net_is_ipv6_prefix((uint8_t *)&addr6_pref1,
(uint8_t *)&addr6_pref2,
64)) {
printk("Same IPv6 prefix test failed\n");
return;
}
if (net_is_ipv6_prefix((uint8_t *)&addr6_pref1,
(uint8_t *)&addr6_pref3,
64)) {
printk("Different IPv6 prefix test failed\n");
return;
}
if (net_is_ipv6_prefix((uint8_t *)&addr6_pref1,
(uint8_t *)&addr6_pref2,
128)) {
printk("Different full IPv6 prefix test failed\n");
return;
}
if (net_is_ipv6_prefix((uint8_t *)&addr6_pref1,
(uint8_t *)&addr6_pref3,
255)) {
printk("Too long prefix test failed\n");
return;
}
ifmaddr1 = net_if_ipv6_maddr_add(__net_if_start, &mcast);
if (!ifmaddr1) {
printk("IPv6 multicast address add failed\n");
return;
}
ifmaddr1 = net_if_ipv6_maddr_add(__net_if_start, &addr6);
if (ifmaddr1) {
printk("IPv6 multicast address could be added failed\n");
return;
}
printk("IP address checks passed\n");
} }