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:
Jukka Rissanen 2024-11-06 14:29:53 +02:00 committed by Anas Nashif
commit ee497c3108

View file

@ -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);