tests: net: pmtu: Add network event tests for pmtu
Verify that the PMTU changed events are generated and we can catch them. Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
This commit is contained in:
parent
02ccb0e523
commit
ee497c3108
1 changed files with 133 additions and 0 deletions
|
@ -43,6 +43,12 @@ LOG_MODULE_REGISTER(net_test, CONFIG_NET_PMTU_LOG_LEVEL);
|
|||
#define NET_LOG_ENABLED 1
|
||||
#include "net_private.h"
|
||||
|
||||
#if defined(CONFIG_BOARD_NATIVE_SIM) || defined(CONFIG_BOARD_NATIVE_SIM_NATIVE_64)
|
||||
#define WAIT_PROPERLY 0
|
||||
#else
|
||||
#define WAIT_PROPERLY 1
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_PMTU_LOG_LEVEL_DBG)
|
||||
#define DBG(fmt, ...) printk(fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
|
@ -93,6 +99,58 @@ K_SEM_DEFINE(wait_data, 0, UINT_MAX);
|
|||
|
||||
#define THREAD_SLEEP 50 /* ms */
|
||||
|
||||
static K_SEM_DEFINE(wait_pmtu_changed, 0, UINT_MAX);
|
||||
static bool is_pmtu_changed;
|
||||
|
||||
static void ipv6_pmtu_changed(struct net_mgmt_event_callback *cb,
|
||||
uint32_t mgmt_event,
|
||||
struct net_if *iface)
|
||||
{
|
||||
ARG_UNUSED(cb);
|
||||
ARG_UNUSED(iface);
|
||||
|
||||
if (mgmt_event != NET_EVENT_IPV6_PMTU_CHANGED) {
|
||||
return;
|
||||
}
|
||||
|
||||
NET_DBG("IPv6 PMTU changed event received");
|
||||
|
||||
k_sem_give(&wait_pmtu_changed);
|
||||
is_pmtu_changed = true;
|
||||
|
||||
/* Let the network stack to proceed */
|
||||
k_msleep(THREAD_SLEEP);
|
||||
}
|
||||
|
||||
static void ipv4_pmtu_changed(struct net_mgmt_event_callback *cb,
|
||||
uint32_t mgmt_event,
|
||||
struct net_if *iface)
|
||||
{
|
||||
ARG_UNUSED(cb);
|
||||
ARG_UNUSED(iface);
|
||||
|
||||
if (mgmt_event != NET_EVENT_IPV4_PMTU_CHANGED) {
|
||||
return;
|
||||
}
|
||||
|
||||
NET_DBG("IPv4 PMTU changed event received");
|
||||
|
||||
k_sem_give(&wait_pmtu_changed);
|
||||
is_pmtu_changed = true;
|
||||
|
||||
/* Let the network stack to proceed */
|
||||
k_msleep(THREAD_SLEEP);
|
||||
}
|
||||
|
||||
static struct mgmt_events {
|
||||
uint32_t event;
|
||||
net_mgmt_event_handler_t handler;
|
||||
struct net_mgmt_event_callback cb;
|
||||
} mgmt_events[] = {
|
||||
{ .event = NET_EVENT_IPV6_PMTU_CHANGED, .handler = ipv6_pmtu_changed },
|
||||
{ .event = NET_EVENT_IPV4_PMTU_CHANGED, .handler = ipv4_pmtu_changed },
|
||||
};
|
||||
|
||||
static const char *iface2str(struct net_if *iface)
|
||||
{
|
||||
if (net_if_l2(iface) == &NET_L2_GET_NAME(DUMMY)) {
|
||||
|
@ -120,6 +178,25 @@ static void iface_cb(struct net_if *iface, void *user_data)
|
|||
if_count++;
|
||||
}
|
||||
|
||||
static void setup_mgmt_events(void)
|
||||
{
|
||||
static bool setup_done;
|
||||
|
||||
if (setup_done) {
|
||||
return;
|
||||
}
|
||||
|
||||
setup_done = true;
|
||||
|
||||
ARRAY_FOR_EACH(mgmt_events, i) {
|
||||
net_mgmt_init_event_callback(&mgmt_events[i].cb,
|
||||
mgmt_events[i].handler,
|
||||
mgmt_events[i].event);
|
||||
|
||||
net_mgmt_add_event_callback(&mgmt_events[i].cb);
|
||||
}
|
||||
}
|
||||
|
||||
static void *test_setup(void)
|
||||
{
|
||||
net_if_foreach(iface_cb, NULL);
|
||||
|
@ -639,4 +716,60 @@ ZTEST(net_pmtu_test_suite, test_pmtu_05_ipv4_tcp)
|
|||
#endif /* CONFIG_NET_IPV4_PMTU */
|
||||
}
|
||||
|
||||
ZTEST(net_pmtu_test_suite, test_pmtu_06_ipv4_event)
|
||||
{
|
||||
#if defined(CONFIG_NET_IPV4_PMTU) && WAIT_PROPERLY
|
||||
struct sockaddr_in dest_ipv4;
|
||||
int ret;
|
||||
|
||||
setup_mgmt_events();
|
||||
|
||||
is_pmtu_changed = false;
|
||||
|
||||
net_ipaddr_copy(&dest_ipv4.sin_addr, &dest_ipv4_addr1);
|
||||
dest_ipv4.sin_family = AF_INET;
|
||||
|
||||
ret = net_pmtu_update_mtu((struct sockaddr *)&dest_ipv4, 1200);
|
||||
zassert_equal(ret, 0, "PMTU IPv4 MTU update failed (%d)", ret);
|
||||
|
||||
if (k_sem_take(&wait_pmtu_changed, K_MSEC(WAIT_TIME))) {
|
||||
zassert_true(0, "Timeout while waiting pmtu changed event");
|
||||
}
|
||||
|
||||
zassert_true(is_pmtu_changed, "Did not catch pmtu changed event");
|
||||
|
||||
is_pmtu_changed = false;
|
||||
#else
|
||||
ztest_test_skip();
|
||||
#endif /* CONFIG_NET_IPV4_PMTU */
|
||||
}
|
||||
|
||||
ZTEST(net_pmtu_test_suite, test_pmtu_06_ipv6_event)
|
||||
{
|
||||
#if defined(CONFIG_NET_IPV6_PMTU) && WAIT_PROPERLY
|
||||
struct sockaddr_in6 dest_ipv6;
|
||||
int ret;
|
||||
|
||||
setup_mgmt_events();
|
||||
|
||||
is_pmtu_changed = false;
|
||||
|
||||
net_ipaddr_copy(&dest_ipv6.sin6_addr, &dest_ipv6_addr1);
|
||||
dest_ipv6.sin6_family = AF_INET6;
|
||||
|
||||
ret = net_pmtu_update_mtu((struct sockaddr *)&dest_ipv6, 1500);
|
||||
zassert_equal(ret, 0, "PMTU IPv6 MTU update failed (%d)", ret);
|
||||
|
||||
if (k_sem_take(&wait_pmtu_changed, K_MSEC(WAIT_TIME))) {
|
||||
zassert_true(0, "Timeout while waiting pmtu changed event");
|
||||
}
|
||||
|
||||
zassert_true(is_pmtu_changed, "Did not catch pmtu changed event");
|
||||
|
||||
is_pmtu_changed = false;
|
||||
#else
|
||||
ztest_test_skip();
|
||||
#endif /* CONFIG_NET_IPV6_PMTU */
|
||||
}
|
||||
|
||||
ZTEST_SUITE(net_pmtu_test_suite, NULL, test_setup, NULL, NULL, NULL);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue