From nobody Wed Oct 28 19:19:29 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4jFHHB4Mwpz6x0Cf for ; Wed, 28 Oct 2026 19:19:34 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jFHHB2cFRz4GXs for ; Wed, 28 Oct 2026 19:19:34 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793215174; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=qTTo5RPrKT4Ql7IdRmpZl3Csl5ArJufLQzGBT3emeAs=; b=HIDyJ7nksB678DM3IEbaTPSHpT5GkmhPSinpauAkRhn3WZgNhY8Cp0u47NeDW35qrT0oc/ 4GTWrad8NHB18l4yRQxvnnnPzDGnSjzX1Lrvq/LvZLmEMtqNXeLan3wOGUqbqzSQBgYF9Q kB5OW6bqu5PLyfVvEZPnkZe1wrL4LdxTxJEBue/4jekTJbLG8zqu2en3/rik2G4QpwmYbN c+pIjFl+wIWFo5Ibn9Ws9WIw25fqPZHawdmB4jyZKnUn25gEAsSPGItZZItpdna3n7qJ+r BfpyB3fncgI0YOVFUtp7/7xsE9OwvsKhxtM9eAKuspZXOgKQbyIEzXugABn/AQ== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793215174; b=r8XTLPQpizb+YcqvIHuOQX8+3lMfnM0cKuUPyjlX0Gyz60KnSBmrv9Aw3ekAvgj9M+pv7W O/OUImDmXjVhv8O5iJac1tHpYahtwGIFtkYJKx/4qR5pe7RLEz7kREJJ7efaeSpdCQbw6l YpIu5oxRTVMefHlv9D18kVk6tBwN1hozPf3j37tWHo352ATJ7GtGizfSt2uAObgnGApwAL m91LYgE78FVnavDDlqqkWAjpHBnalNw394UNqxM/DJTc6Tju25LjgSW9PaMkU+joofPFIh WFoZnCPWtBWFQsecqTiz75SE6Y5aoJ1cj0V/Z0mXLgPQmioS4oyipsfbVPwZwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793215174; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=qTTo5RPrKT4Ql7IdRmpZl3Csl5ArJufLQzGBT3emeAs=; b=oT6Qq7hw7ccN3ncy+bj8Bg5at5LCckmhsLl2d1qxF+kv7poFeAojkeNHUeHVM6f5iQyQyu o88HGCIQEtX2s/tsJZq8xg76itcDbjfjadhmPl5JWs9vWby6x40lXKOKObwy0lLR1HvTnu O30H9O/B7bgYQFlc9kGMOQQC/3okaQSfHOEcQrZpsvIWbh/yvilwhrlQHVEt8qq4jpa6Al rssr/6zObiv/diviJptLKp+fN/L3fm+HoTzqYMb+3LfUWrXoNwGSJmM4ZxGr4wWgrMbYfJ T/wtHtfZWEClWhAgQvBEsWV6WGdgjK2SUFUvL0+C2e9hEztu/7J1kUXi5jtU9Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4jFHHB20v9z1KQL for ; Wed, 28 Oct 2026 19:19:34 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 433fd by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 28 Oct 2026 19:19:29 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Siva Mahadevan Subject: git: bd87fc2a1c1a - main - tests/dhclient: import scapy inside vnet List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: Commit messages for all branches of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: siva X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: bd87fc2a1c1a20a080c38b12a55b377967a7c4a7 Auto-Submitted: auto-generated Date: Wed, 28 Oct 2026 19:19:29 +0000 Message-Id: <6ae24ac1.433fd.3e49ded@gitrepo.freebsd.org> The branch main has been updated by siva: URL: https://cgit.FreeBSD.org/src/commit/?id=bd87fc2a1c1a20a080c38b12a55b377967a7c4a7 commit bd87fc2a1c1a20a080c38b12a55b377967a7c4a7 Author: Siva Mahadevan AuthorDate: 2026-10-27 17:19:27 +0000 Commit: Siva Mahadevan CommitDate: 2026-10-28 19:15:44 +0000 tests/dhclient: import scapy inside vnet This fixes a [CI failure][0]. [0] https://ci.freebsd.org/job/FreeBSD-main-amd64-test/29813/testReport/sbin.dhclient.functional/py/__test_cases_list__/ PR: 299641 Reviewed by: markj, ngie MFC after: 3 days Sponsored by: The FreeBSD Foundation Pull Request: https://ron-dev.freebsd.org/FreeBSD/src/pulls/83 --- sbin/dhclient/tests/functional.py | 97 ++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 47 deletions(-) diff --git a/sbin/dhclient/tests/functional.py b/sbin/dhclient/tests/functional.py index 3a984307c691..205bd11a76ef 100644 --- a/sbin/dhclient/tests/functional.py +++ b/sbin/dhclient/tests/functional.py @@ -10,7 +10,6 @@ import subprocess import pytest -import scapy.all as sp from atf_python.sys.net.tools import ToolsHelper from atf_python.sys.net.vnet import VnetTestTemplate @@ -21,44 +20,6 @@ def mac_to_chaddr(mac_str): return mac_bytes + b"\x00" * (16 - len(mac_bytes)) -def get_dhcp_type(pkt): - """Extract the DHCP message type from a packet.""" - if not pkt.haslayer(sp.DHCP): - return None - for opt in pkt[sp.DHCP].options: - if isinstance(opt, tuple) and opt[0] == "message-type": - return sp.DHCPTypes[opt[1]] - return None - - -def build_reply(iface, server_ip, client_ip, client_mac, xid, msg_type, - extra_opts=None, sname=b"", file=b""): - """Build a DHCP OFFER or ACK packet.""" - options = [ - ("message-type", msg_type), - ("server_id", server_ip), - ("lease_time", 3600), - ("subnet_mask", "255.255.255.0"), - ("router", server_ip), - ] - if extra_opts: - options.extend(extra_opts) - options.append("end") - - return ( - sp.Ether(dst=client_mac, src=sp.get_if_hwaddr(iface)) - / sp.IP(src=server_ip, dst="255.255.255.255") - / sp.UDP(sport=67, dport=68) - / sp.BOOTP(op=2, - xid=xid, - yiaddr=client_ip, - siaddr=server_ip, - chaddr=mac_to_chaddr(client_mac), - sname=sname, - file=file, - ) - / sp.DHCP(options=options) - ) class TestDhclient(VnetTestTemplate): @@ -106,6 +67,9 @@ class TestDhclient(VnetTestTemplate): ToolsHelper.print_output( "/sbin/ifconfig {} inet {}/24 up".format(ifname, self._SERVER_IP) ) + # Import in the correct vnet, so as to not confuse Scapy + import scapy.all as sp + self.sp = sp return ifname def _do_dora(self, ifname, first_extra_opts=None, extra_opts=None, @@ -123,33 +87,33 @@ class TestDhclient(VnetTestTemplate): def handle_dhcp(pkt): nonlocal discover_count, done - msg_type = get_dhcp_type(pkt) + msg_type = self.get_dhcp_type(pkt) if msg_type is None: return - client_mac = pkt[sp.Ether].src - xid = pkt[sp.BOOTP].xid + client_mac = pkt[self.sp.Ether].src + xid = pkt[self.sp.BOOTP].xid if msg_type == "discover": discover_count += 1 opts = extra_opts if discover_count == 1 and first_extra_opts is not None: opts = first_extra_opts - reply = build_reply( + reply = self.build_reply( ifname, self._SERVER_IP, self._CLIENT_IP, client_mac, xid, "offer", extra_opts=opts, sname=sname, file=file, ) - sp.sendp(reply, iface=ifname, verbose=0) + self.sp.sendp(reply, iface=ifname, verbose=0) elif msg_type == "request": - reply = build_reply( + reply = self.build_reply( ifname, self._SERVER_IP, self._CLIENT_IP, client_mac, xid, "ack", sname=sname, file=file, ) - sp.sendp(reply, iface=ifname, verbose=0) + self.sp.sendp(reply, iface=ifname, verbose=0) done = True - sniffer = sp.AsyncSniffer( + sniffer = self.sp.AsyncSniffer( iface=ifname, filter="udp and dst port 67", prn=handle_dhcp, @@ -165,6 +129,45 @@ class TestDhclient(VnetTestTemplate): result = self.wait_object(self.vnet_map["vnet1"].pipe, timeout=15) return discover_count, result + + def get_dhcp_type(self, pkt): + """Extract the DHCP message type from a packet.""" + if not pkt.haslayer(self.sp.DHCP): + return None + for opt in pkt[self.sp.DHCP].options: + if isinstance(opt, tuple) and opt[0] == "message-type": + return self.sp.DHCPTypes[opt[1]] + return None + + def build_reply(self, iface, server_ip, client_ip, client_mac, xid, msg_type, + extra_opts=None, sname=b"", file=b""): + """Build a DHCP OFFER or ACK packet.""" + options = [ + ("message-type", msg_type), + ("server_id", server_ip), + ("lease_time", 3600), + ("subnet_mask", "255.255.255.0"), + ("router", server_ip), + ] + if extra_opts: + options.extend(extra_opts) + options.append("end") + + return ( + self.sp.Ether(dst=client_mac, src=self.sp.get_if_hwaddr(iface)) + / self.sp.IP(src=server_ip, dst="255.255.255.255") + / self.sp.UDP(sport=67, dport=68) + / self.sp.BOOTP(op=2, + xid=xid, + yiaddr=client_ip, + siaddr=server_ip, + chaddr=mac_to_chaddr(client_mac), + sname=sname, + file=file, + ) + / self.sp.DHCP(options=options) + ) + @pytest.mark.require_user("root") def test_classless_routes_truncated(self): """