I think this is the complete diff, with the man page bits mostly from Martijn. Now that the ifconfig -M bits are in, this should be easier to test. I was able to test the installer bits, and they worked for me.
Index: etc/netstart =================================================================== RCS file: /cvs/src/etc/netstart,v retrieving revision 1.229 diff -u -p -r1.229 netstart --- etc/netstart 5 Nov 2022 12:06:05 -0000 1.229 +++ etc/netstart 26 Nov 2022 17:21:38 -0000 @@ -135,6 +135,23 @@ ifstart() { local _if=$1 _hn=/etc/hostname.$1 _cmds _i=0 _line _stat set -A _cmds + # If the _if looks like an lladdr and look it up. + if [[ $_if = ??:??:??:??:??:?? ]]; then + if ! _line="$( ifconfig -M "$_if" )"; then + print -u2 "${0##*/}: unique if for lladdr $_if not found." + return + fi + + [[ -z "$_line" ]] && return + _if=$_line + _line= + + if [[ -e /etc/hostname.$_if ]]; then + print -u2 "${0##*/}: $_hn: /etc/hostname.$_if overrides" + return + fi + fi + # Interface names must be alphanumeric only. We check to avoid # configuring backup or temp files, and to catch the "*" case. [[ $_if != +([[:alpha:]])+([[:digit:]]) ]] && return @@ -183,14 +200,16 @@ ifmstart() { local _sifs=$1 _xifs=$2 _hn _if _sif _xif for _sif in ${_sifs:-ALL}; do - for _hn in /etc/hostname.+([[:alpha:]])+([[:digit:]]); do + for _hn in /etc/hostname.@(+([[:alpha:]])+([[:digit:]])|??:??:??:??:??:??); do [[ -f $_hn ]] || continue _if=${_hn#/etc/hostname.} - # Skip unwanted ifs. - for _xif in $_xifs; do - [[ $_xif == ${_if%%[0-9]*} ]] && continue 2 - done + if [[ $_if = +([[:alpha:]])+([[:digit:]]) ]]; then + # Skip unwanted ifs. + for _xif in $_xifs; do + [[ $_xif == ${_if%%[0-9]*} ]] && continue 2 + done + fi # Start wanted ifs. [[ $_sif == @(ALL|${_if%%[0-9]*}) ]] && ifstart $_if Index: distrib/miniroot/install.sub =================================================================== RCS file: /cvs/src/distrib/miniroot/install.sub,v retrieving revision 1.1214 diff -u -p -r1.1214 install.sub --- distrib/miniroot/install.sub 6 Nov 2022 21:32:54 -0000 1.1214 +++ distrib/miniroot/install.sub 26 Nov 2022 17:21:38 -0000 @@ -2431,6 +2431,12 @@ ifstart() { local _if=$1 _hn=/mnt/etc/hostname.$1 _cmds _i=0 _line set -A _cmds + if [[ $_if = ??:??:??:??:??:?? ]]; then + _if=$(ifconfig -M $_if) + [[ -z $_if ]] && return # invalid interface + [[ -e /mnt/etc/hostname.$_if ]] && return # duplicate config + fi + # Create interface if it does not yet exist. { ifconfig $_if || ifconfig $_if create; } >/dev/null 2>&1 || return @@ -2472,6 +2478,9 @@ enable_ifs() { svlan) _svlans="$_svlans $_if";; vlan) _vlans="$_vlans $_if";; esac + elif [[ $_if = ??:??:??:??:??:?? ]]; then + # start by lladdr + ifstart $_if else # 'Real' interfaces (if available) are done now. ifconfig $_if >/dev/null 2>&1 && ifstart $_if Index: share/man/man5/hostname.if.5 =================================================================== RCS file: /cvs/src/share/man/man5/hostname.if.5,v retrieving revision 1.79 diff -u -p -r1.79 hostname.if.5 --- share/man/man5/hostname.if.5 26 Jul 2022 00:36:54 -0000 1.79 +++ share/man/man5/hostname.if.5 26 Nov 2022 17:21:38 -0000 @@ -41,9 +41,14 @@ The .Nm hostname.*\& files contain information regarding the configuration of each network interface. One file should exist for each interface that is to be configured, such as -.Pa hostname.fxp0 +.Pa hostname.fxp0 , +.Pa hostname.12:34:56:78:ab , or .Pa hostname.bridge0 . +Additionally the interface name can be replaced with the interface's lladdr, +given that the lladdr is unique across the system and no +.Nm +exists for the interface name. A configuration file is not needed for lo0. .Pp The configuration information is expressed in a line-by-line packed format