From 4ec8afbfcf4ce50d8a5273065214c9a8d5eca27a Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Sun, 27 Sep 2026 16:28:15 -0700 Subject: [PATCH] python3-scapy: fix libpcap loading and ptests on musl - ctypes.util.find_library() relies on "ldconfig -p", gcc or ld, none of which exist on a musl target, so find_library("pcap") returns None and scapy raises "Cannot find libpcap.so library" even with libpcap installed. That disabled conf.use_pcap and BPF filter compilation and failed ten ptests (offline sniff() with filters, tcpdump(), tdecode(), traceroute). Fall back to loading libpcap.so.1/libpcap.so by name. - The NetBSD read_routes6() test compares IPv4-compatible IPv6 prefixes as strings, but musl's inet_ntop() prints ::127.0.0.0 as ::7f00:0. Normalise the expected values with in6_ptop(). Tested with meta-networking-image-ptest-python3-scapy on qemux86-64 with yoe-musl-systemd-wayland: TOTAL: 1 FAIL: 0. AI-Generated: Uses Claude Code Signed-off-by: Khem Raj --- ...pcap-even-when-find_library-cannot-l.patch | 52 +++++++++++++++++++ ...d-on-libc-formatting-of-IPv4-compati.patch | 37 +++++++++++++ .../python/python3-scapy_2.7.0.bb | 2 + 3 files changed, 91 insertions(+) create mode 100644 meta-networking/recipes-devtools/python/python3-scapy/0003-libpcap-load-libpcap-even-when-find_library-cannot-l.patch create mode 100644 meta-networking/recipes-devtools/python/python3-scapy/0004-test-don-t-depend-on-libc-formatting-of-IPv4-compati.patch diff --git a/meta-networking/recipes-devtools/python/python3-scapy/0003-libpcap-load-libpcap-even-when-find_library-cannot-l.patch b/meta-networking/recipes-devtools/python/python3-scapy/0003-libpcap-load-libpcap-even-when-find_library-cannot-l.patch new file mode 100644 index 0000000000..fe4bd431ea --- /dev/null +++ b/meta-networking/recipes-devtools/python/python3-scapy/0003-libpcap-load-libpcap-even-when-find_library-cannot-l.patch @@ -0,0 +1,52 @@ +From 6ee4ddc1b53f792d4e2a7826d65cebeeb9d9eb79 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sun, 27 Sep 2026 15:54:57 -0700 +Subject: [PATCH 3/4] libpcap: load libpcap even when find_library() cannot + locate it + +ctypes.util.find_library() finds libraries through "ldconfig -p", gcc +or ld. A target system may have none of them; on musl-based systems +there is no ldconfig cache at all, so find_library("pcap") returns None +even with libpcap installed, and scapy reports + + OSError: Cannot find libpcap.so library + +which disables conf.use_pcap and BPF filter compilation (sniff() with a +filter, tcpdump(), tdecode(), ...). Fall back to loading libpcap.so.1 or +libpcap.so by name and let the dynamic loader search its default paths. + +Upstream-Status: Pending +Signed-off-by: Khem Raj +--- + scapy/libs/winpcapy.py | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +diff --git a/scapy/libs/winpcapy.py b/scapy/libs/winpcapy.py +index 42bfa850..c537b22b 100644 +--- a/scapy/libs/winpcapy.py ++++ b/scapy/libs/winpcapy.py +@@ -36,9 +36,21 @@ else: + # Try to load libpcap + SOCKET = c_int + _lib_name = find_library("pcap") +- if not _lib_name: +- raise OSError("Cannot find libpcap.so library") +- _lib = CDLL(_lib_name) ++ if _lib_name: ++ _lib = CDLL(_lib_name) ++ else: ++ # ctypes.util.find_library() relies on ldconfig, gcc or ld to ++ # locate libraries, none of which may exist on the target (e.g. ++ # musl-based systems have no "ldconfig -p"). Fall back to letting ++ # the dynamic loader search its default paths. ++ for _lib_name in ("libpcap.so.1", "libpcap.so"): ++ try: ++ _lib = CDLL(_lib_name) ++ break ++ except OSError: ++ pass ++ else: ++ raise OSError("Cannot find libpcap.so library") + + + ## diff --git a/meta-networking/recipes-devtools/python/python3-scapy/0004-test-don-t-depend-on-libc-formatting-of-IPv4-compati.patch b/meta-networking/recipes-devtools/python/python3-scapy/0004-test-don-t-depend-on-libc-formatting-of-IPv4-compati.patch new file mode 100644 index 0000000000..cc238fbd12 --- /dev/null +++ b/meta-networking/recipes-devtools/python/python3-scapy/0004-test-don-t-depend-on-libc-formatting-of-IPv4-compati.patch @@ -0,0 +1,37 @@ +From 7602260f82f54cf9b179549c5b03866ec16f68d5 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sun, 27 Sep 2026 15:54:57 -0700 +Subject: [PATCH 4/4] test: don't depend on libc formatting of IPv4-compatible + addresses + +The NetBSD read_routes6() test compares route prefixes such as +::127.0.0.0 as strings, but scapy formats them with the libc's +inet_ntop(). glibc prints IPv4-compatible addresses in dotted form, +while musl only does so for IPv4-mapped (::ffff:a.b.c.d) addresses and +prints ::7f00:0, ::e000:0 and ::ff00:0, so the test fails on musl. +Both forms denote the same address; normalise the expected values with +in6_ptop() so they match whatever the libc produces. + +Upstream-Status: Pending +Signed-off-by: Khem Raj +--- + test/regression.uts | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/test/regression.uts b/test/regression.uts +index 4c972fa1..b6bb9d6e 100644 +--- a/test/regression.uts ++++ b/test/regression.uts +@@ -3134,9 +3134,9 @@ assert routes == [ + ('::', 104, '::1', 'lo0', ['::1'], 1), + ('::', 96, '::1', 'lo0', ['::1'], 1), + ('::1', 128, '::', 'lo0', ['::1'], 1), +- ('::127.0.0.0', 104, '::1', 'lo0', ['::1'], 1), +- ('::224.0.0.0', 100, '::1', 'lo0', ['::1'], 1), +- ('::255.0.0.0', 104, '::1', 'lo0', ['::1'], 1), ++ (in6_ptop('::127.0.0.0'), 104, '::1', 'lo0', ['::1'], 1), ++ (in6_ptop('::224.0.0.0'), 100, '::1', 'lo0', ['::1'], 1), ++ (in6_ptop('::255.0.0.0'), 104, '::1', 'lo0', ['::1'], 1), + ('::ffff:0.0.0.0', 96, '::1', 'lo0', ['::1'], 1), + ('2001:db8::', 32, '::1', 'lo0', ['::1'], 1), + ('2002::', 24, '::1', 'lo0', ['::1'], 1), diff --git a/meta-networking/recipes-devtools/python/python3-scapy_2.7.0.bb b/meta-networking/recipes-devtools/python/python3-scapy_2.7.0.bb index 35a4c6fc36..aa570308a9 100644 --- a/meta-networking/recipes-devtools/python/python3-scapy_2.7.0.bb +++ b/meta-networking/recipes-devtools/python/python3-scapy_2.7.0.bb @@ -20,6 +20,8 @@ SRCREV = "1de09fe85fe5c9d60ea5c6de130374e170b5bc28" SRC_URI = "git://github.com/secdev/scapy.git;branch=master;protocol=https;tag=v${PV} \ file://0001-python3-scapy-skip-ICMP-regression-tests-in-ptest.patch \ file://0002-main-initialize-banner-for-the-default-Python-shell.patch \ + file://0003-libpcap-load-libpcap-even-when-find_library-cannot-l.patch \ + file://0004-test-don-t-depend-on-libc-formatting-of-IPv4-compati.patch \ file://run-ptest" UPSTREAM_CHECK_COMMITS = "1"