From ee497c3108b9b6d139833cd697380c42b2e76d4a Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Wed, 6 Nov 2024 14:29:53 +0200 Subject: [PATCH] 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 --- tests/net/pmtu/src/main.c | 133 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/tests/net/pmtu/src/main.c b/tests/net/pmtu/src/main.c index 542c89519d8..30b09a2e8a6 100644 --- a/tests/net/pmtu/src/main.c +++ b/tests/net/pmtu/src/main.c @@ -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);