Index | Thread | Search

From:
jslee <openbsd.lists@internetemails.net>
Subject:
vmd: accept ethers(5) references in vm.conf lladdr
To:
tech@openbsd.org
Date:
Wed, 01 Jul 2026 20:15:23 +1000

Download raw body.

Thread
  • jslee:

    vmd: accept ethers(5) references in vm.conf lladdr

While setting up a home for some experiments I wanted to manage their
ethernet addresses in one place (/etc/ethers) rather than duplicate
them in /etc/dhcpd.conf and /etc/vm.conf and risk copypasta errors.

I'd also like to add some regress/ tests here, as it lacks coverage
for lladdr, and this change does make the directive more complicated.

However I'd never looked in regress/ until today and I'm not yet sure
how to write vmd tests that depend on external state, eg. here, check
that 'vmd -n' fails when configured to use an ethers(5) entry that has
an invalid MAC address, or simply doesn't exist at all.

If you know of some suitable prior art for regress/, point me at it?

I've tried assembling a chroot but it's ugly++ and I'm stuck. Yes
there is a ./chroot/dev and I have run MAKEDEV std ptm pts* tty* vmm
in it.

    # chroot chroot /usr/sbin/vmd -n -f /etc/vm.ok.conf
    vmd: vmd: getptmfd /dev/ptm: Device not configured

Anyway enough rambling. Diff:


Index: usr.sbin/vmd/parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/vmd/parse.y,v
diff -u -p -u -r1.74 parse.y
--- usr.sbin/vmd/parse.y	14 Apr 2026 21:41:19 -0000	1.74
+++ usr.sbin/vmd/parse.y	1 Jul 2026 08:58:51 -0000
@@ -729,16 +729,23 @@ string		: STRING string			{
 		;

 lladdr		: STRING			{
-			struct ether_addr *ea;
-
-			if ((ea = ether_aton($1)) == NULL) {
-				yyerror("invalid address: %s\n", $1);
+			struct ether_addr ea;
+			struct ether_addr *eap = NULL;
+			if (ether_hostton($1, &ea) == 0) {
+				eap = &ea;
+			}
+			if (eap == NULL) {
+				eap = ether_aton($1);
+			}
+			/* an address found in ethers(5) may be invalid */
+			if (eap == NULL || ether_ntoa(eap) == NULL) {
+				yyerror("invalid Ethernet address or ethers(5) entry: %s\n", $1);
 				free($1);
 				YYERROR;
 			}
 			free($1);

-			memcpy($$, ea, ETHER_ADDR_LEN);
+			memcpy($$, eap, ETHER_ADDR_LEN);
 		}
 		| /* empty */ {
 			memset($$, 0, ETHER_ADDR_LEN);
Index: usr.sbin/vmd/vm.conf.5
===================================================================
RCS file: /cvs/src/usr.sbin/vmd/vm.conf.5,v
diff -u -p -u -r1.69 vm.conf.5
--- usr.sbin/vmd/vm.conf.5	6 Jul 2025 15:45:02 -0000	1.69
+++ usr.sbin/vmd/vm.conf.5	1 Jul 2026 08:58:51 -0000
@@ -250,10 +250,13 @@ The
 must not be longer than 15 characters or end with a digit,
 as described in
 .Xr ifconfig 8 .
-.It Oo Ic locked Oc Ic lladdr Op Ar etheraddr
+.It Oo Ic locked Oc Ic lladdr Op Ar address
 Change the link layer address (MAC address) of the interface on the
-VM guest side.
-If not specified, a randomized address is assigned by
+VM guest side. The
+.Ar address
+can be a literal address, or a hostname corresponding to an
+.Xr ethers 5
+entry. If not specified, a randomized address is assigned by
 .Xr vmd 8 .
 If the
 .Ic locked