From 2bf886e18e14847f16c78be23397f3a10d14e6af Mon Sep 17 00:00:00 2001 From: anti Date: Sat, 18 Apr 2026 05:37:20 -0400 Subject: [PATCH] feat(sniffer): probe ipvlan host iface when macvlan is absent The host-side sniffer interface depends on the deploy's driver choice (--ipvlan flag). Instead of hardcoding HOST_MACVLAN_IFACE, probe both names and pick whichever exists; warn and disable cleanly if neither is present. Explicit DECNET_SNIFFER_IFACE still wins. --- decnet/sniffer/worker.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/decnet/sniffer/worker.py b/decnet/sniffer/worker.py index e4ba37c..3e2f0bc 100644 --- a/decnet/sniffer/worker.py +++ b/decnet/sniffer/worker.py @@ -18,7 +18,7 @@ from concurrent.futures import ThreadPoolExecutor from pathlib import Path from decnet.logging import get_logger -from decnet.network import HOST_MACVLAN_IFACE +from decnet.network import HOST_IPVLAN_IFACE, HOST_MACVLAN_IFACE from decnet.sniffer.fingerprint import SnifferEngine from decnet.sniffer.syslog import write_event from decnet.telemetry import traced as _traced @@ -119,7 +119,23 @@ async def sniffer_worker(log_file: str) -> None: cleanly. The API continues running regardless of sniffer state. """ try: - interface = os.environ.get("DECNET_SNIFFER_IFACE", HOST_MACVLAN_IFACE) + # Interface selection: explicit env override wins, otherwise probe + # both the MACVLAN and IPvlan host-side names since the driver + # choice is per-deploy (--ipvlan flag). + env_iface = os.environ.get("DECNET_SNIFFER_IFACE") + if env_iface: + interface = env_iface + elif _interface_exists(HOST_MACVLAN_IFACE): + interface = HOST_MACVLAN_IFACE + elif _interface_exists(HOST_IPVLAN_IFACE): + interface = HOST_IPVLAN_IFACE + else: + logger.warning( + "sniffer: neither %s nor %s found — sniffer disabled " + "(fleet may not be deployed yet)", + HOST_MACVLAN_IFACE, HOST_IPVLAN_IFACE, + ) + return if not _interface_exists(interface): logger.warning(