--- /dev/null
+From 193bd72d1ca66f7c97fdc78782617302b7724c52 Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thom311@gmail.com>
+Date: Tue, 23 Dec 2025 21:31:06 +0100
+Subject: [PATCH] tests: add and use _nltst_skip_eopnotsupp() helper
+
+Upstream-Status: Backport [https://github.com/thom311/libnl/commit/f680f27]
+Signed-off-by: Alexander Kanavin <alex@linutronix.de>
+---
+ tests/cksuite-all-netns.c | 3 +--
+ tests/cksuite-route-nh.c | 4 +---
+ tests/nl-test-util.c | 11 +++++++++++
+ tests/nl-test-util.h | 4 ++++
+ 4 files changed, 17 insertions(+), 5 deletions(-)
+
+diff --git a/tests/cksuite-all-netns.c b/tests/cksuite-all-netns.c
+index ff6fd65..4714db2 100644
+--- a/tests/cksuite-all-netns.c
++++ b/tests/cksuite-all-netns.c
+@@ -273,8 +273,7 @@ START_TEST(test_create_iface)
+ }
+
+ r = rtnl_link_add(sk, link, NLM_F_CREATE);
+- if (r == -NLE_OPNOTSUPP) {
+- /* Hm, no kernel module? Skip the test. */
++ if (_nltst_skip_eopnotsupp(r)) {
+ _nltst_assert_link_not_exists(IFNAME);
+ IFNAME = NULL;
+ return;
+diff --git a/tests/cksuite-route-nh.c b/tests/cksuite-route-nh.c
+index 07a7a83..8409e18 100644
+--- a/tests/cksuite-route-nh.c
++++ b/tests/cksuite-route-nh.c
+@@ -1054,10 +1054,8 @@ START_TEST(test_kernel_roundtrip_encap_ila)
+ ck_assert_int_eq(rtnl_nh_set_oif(nh, (uint32_t)ifindex_dummy), 0);
+ ck_assert_int_eq(rtnl_nh_set_family(nh, AF_INET6), 0);
+ ret = rtnl_nh_add(sk, nh, NLM_F_CREATE);
+- if (ret == -NLE_OPNOTSUPP) {
+- /* ila module is not loaded - skipping */
++ if (_nltst_skip_eopnotsupp(ret))
+ return;
+- }
+ ck_assert_int_eq(ret, 0);
+
+ ck_assert_int_eq(rtnl_nh_alloc_cache(sk, AF_UNSPEC, &cache), 0);
+diff --git a/tests/nl-test-util.c b/tests/nl-test-util.c
+index 51c04c6..75bb540 100644
+--- a/tests/nl-test-util.c
++++ b/tests/nl-test-util.c
+@@ -838,6 +838,17 @@ bool _nltst_skip_no_iproute2(const char *msg)
+
+ /*****************************************************************************/
+
++bool _nltst_skip_eopnotsupp(int err)
++{
++ if (err != -NLE_OPNOTSUPP)
++ return false;
++
++ printf("skip test after operation failed with NLE_OPNOTSUPP. This indicates missing kernel support");
++ return true;
++}
++
++/*****************************************************************************/
++
+ void _nltst_add_dummy_and_up(struct nl_sock *sk, const char *ifname,
+ int *out_ifindex)
+ {
+diff --git a/tests/nl-test-util.h b/tests/nl-test-util.h
+index ecae885..a2c0e3b 100644
+--- a/tests/nl-test-util.h
++++ b/tests/nl-test-util.h
+@@ -449,6 +449,10 @@ bool _nltst_skip_no_iproute2(const char *msg);
+
+ /*****************************************************************************/
+
++bool _nltst_skip_eopnotsupp(int err);
++
++/*****************************************************************************/
++
+ typedef struct {
+ int addr_family;
+ int ifindex;
+++ /dev/null
-From 9e45c8809fc4e0aa1dd2ec2ac3e57352049f1b92 Mon Sep 17 00:00:00 2001
-From: Alexander Kanavin <alex@linutronix.de>
-Date: Tue, 20 Aug 2024 19:01:59 +0200
-Subject: [PATCH] tests/cksuite-all-netns.c: disable route_1
-
-This is a new test added in https://github.com/thom311/libnl/commit/49f7822961f5bc6b18cd2a2d3f3b8d2ab0896d3f
-and while it passes on host Debian, it doesn't inside poky.
-
-Investigation into why is proceeding slowly, and I'm simply
-not skilled enough in AF_NETLINK, so let's disable until the
-core reason for the fail is arrived at.
-
-Upstream-Status: Inappropriate [fail reported and investigated at https://github.com/thom311/libnl/issues/399]
-Signed-off-by: Alexander Kanavin <alex@linutronix.de>
----
- tests/cksuite-all-netns.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/tests/cksuite-all-netns.c b/tests/cksuite-all-netns.c
-index 5b9d3a5..b2fc46a 100644
---- a/tests/cksuite-all-netns.c
-+++ b/tests/cksuite-all-netns.c
-@@ -341,7 +341,7 @@ Suite *make_nl_netns_suite(void)
- nltst_netns_fixture_teardown);
- tcase_add_test(tc, cache_and_clone);
- tcase_add_loop_test(tc, test_create_iface, 0, 17);
-- tcase_add_test(tc, route_1);
-+ //tcase_add_test(tc, route_1);
- suite_add_tcase(suite, tc);
-
- return suite;
--- /dev/null
+From 09330c29d3322881d0215013962bff7549ca885c Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thom311@gmail.com>
+Date: Tue, 23 Dec 2025 21:35:06 +0100
+Subject: [PATCH] tests: skip various tests when kernel returns EOPNOTSUPP
+ (NLE_OPNOTSUPP)
+
+https://github.com/thom311/libnl/issues/448
+
+Upstream-Status: Backport [https://github.com/thom311/libnl/commit/1ac4b32]
+Signed-off-by: Alexander Kanavin <alex@linutronix.de>
+---
+ tests/cksuite-link-ip6tnl.c | 2 ++
+ tests/cksuite-route-nexthop.c | 6 +++++-
+ tests/cksuite-route-nh.c | 21 ++++++++++++++++++---
+ 3 files changed, 25 insertions(+), 4 deletions(-)
+
+diff --git a/tests/cksuite-link-ip6tnl.c b/tests/cksuite-link-ip6tnl.c
+index ea785b8..c5dc353 100644
+--- a/tests/cksuite-link-ip6tnl.c
++++ b/tests/cksuite-link-ip6tnl.c
+@@ -97,6 +97,8 @@ START_TEST(test_kernel_roundtrip_all)
+ * This tests the netlink-message construction.
+ */
+ r = rtnl_link_add(sk, link, NLM_F_CREATE);
++ if (_nltst_skip_eopnotsupp(r))
++ return;
+ ck_assert_int_eq(r, 0);
+
+ /* Now, query it and check whether all the attributes passed.
+diff --git a/tests/cksuite-route-nexthop.c b/tests/cksuite-route-nexthop.c
+index 34fc1d3..971a580 100644
+--- a/tests/cksuite-route-nexthop.c
++++ b/tests/cksuite-route-nexthop.c
+@@ -416,6 +416,7 @@ START_TEST(test_kernel_route_roundtrip_nh_mpls_encap_v4)
+ struct rtnl_nh_encap *encap2;
+ struct rtnl_nexthop *nh = NULL;
+ int ifindex_dummy;
++ int r;
+
+ if (_nltst_skip_no_netns())
+ return;
+@@ -447,7 +448,10 @@ START_TEST(test_kernel_route_roundtrip_nh_mpls_encap_v4)
+ ck_assert_int_eq(rtnl_route_nh_set_encap(nh, encap2), 0);
+ rtnl_route_add_nexthop(route, nh);
+
+- ck_assert_int_eq(rtnl_route_add(sk, route, NLM_F_CREATE), 0);
++ r = rtnl_route_add(sk, route, NLM_F_CREATE);
++ if (_nltst_skip_eopnotsupp(r))
++ return;
++ ck_assert_int_eq(r, 0);
+
+ /* Retrieve the route back by its prefix and validate MPLS encap on nexthop */
+ ck_assert_int_eq(nltst_route_get_by_dst(sk, dst, &got), 0);
+diff --git a/tests/cksuite-route-nh.c b/tests/cksuite-route-nh.c
+index 8409e18..500768b 100644
+--- a/tests/cksuite-route-nh.c
++++ b/tests/cksuite-route-nh.c
+@@ -91,6 +91,7 @@ START_TEST(test_kernel_roundtrip_encap_mpls)
+ _nl_auto_nl_addr struct nl_addr *labels = NULL;
+ struct rtnl_nh_encap *encap = NULL;
+ int ifindex_dummy;
++ int r;
+
+ if (_nltst_skip_no_netns())
+ return;
+@@ -127,7 +128,11 @@ START_TEST(test_kernel_roundtrip_encap_mpls)
+ ck_assert_int_eq(rtnl_nh_add(sk, nh, NLM_F_CREATE), -NLE_INVAL);
+
+ ck_assert_int_eq(rtnl_nh_set_family(nh, AF_INET), 0);
+- ck_assert_int_eq(rtnl_nh_add(sk, nh, NLM_F_CREATE), 0);
++
++ r = rtnl_nh_add(sk, nh, NLM_F_CREATE);
++ if (_nltst_skip_eopnotsupp(r))
++ return;
++ ck_assert_int_eq(r, 0);
+
+ /* Query and verify */
+ ck_assert_int_eq(rtnl_nh_alloc_cache(sk, AF_UNSPEC, &cache), 0);
+@@ -944,6 +949,7 @@ START_TEST(test_kernel_roundtrip_encap_ip6)
+ _nl_auto_rtnl_nh_encap struct rtnl_nh_encap *encap = NULL;
+ uint16_t flags;
+ int ifindex_dummy;
++ int r;
+
+ if (_nltst_skip_no_netns())
+ return;
+@@ -980,7 +986,11 @@ START_TEST(test_kernel_roundtrip_encap_ip6)
+ /* Set required attributes and add */
+ ck_assert_int_eq(rtnl_nh_set_oif(nh, (uint32_t)ifindex_dummy), 0);
+ ck_assert_int_eq(rtnl_nh_set_family(nh, AF_INET6), 0);
+- ck_assert_int_eq(rtnl_nh_add(sk, nh, NLM_F_CREATE), 0);
++
++ r = rtnl_nh_add(sk, nh, NLM_F_CREATE);
++ if (_nltst_skip_eopnotsupp(r))
++ return;
++ ck_assert_int_eq(r, 0);
+
+ /* Query and verify */
+ ck_assert_int_eq(rtnl_nh_alloc_cache(sk, AF_UNSPEC, &cache), 0);
+@@ -1097,6 +1107,7 @@ START_TEST(test_kernel_roundtrip_encap_ip)
+ _nl_auto_rtnl_nh_encap struct rtnl_nh_encap *encap = NULL;
+ int ifindex_dummy;
+ uint64_t id = 0;
++ int r;
+
+ if (_nltst_skip_no_netns())
+ return;
+@@ -1132,7 +1143,11 @@ START_TEST(test_kernel_roundtrip_encap_ip)
+ /* Set required attributes and add */
+ ck_assert_int_eq(rtnl_nh_set_oif(nh, (uint32_t)ifindex_dummy), 0);
+ ck_assert_int_eq(rtnl_nh_set_family(nh, AF_INET), 0);
+- ck_assert_int_eq(rtnl_nh_add(sk, nh, NLM_F_CREATE), 0);
++
++ r = rtnl_nh_add(sk, nh, NLM_F_CREATE);
++ if (_nltst_skip_eopnotsupp(r))
++ return;
++ ck_assert_int_eq(r, 0);
+
+ /* Query and verify */
+ ck_assert_int_eq(rtnl_nh_alloc_cache(sk, AF_UNSPEC, &cache), 0);